byterover-cli 0.4.1 → 1.0.1
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,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stream Processor
|
|
3
|
+
*
|
|
4
|
+
* Handles granular LLM stream processing following the OpenCode pattern.
|
|
5
|
+
* Provides real-time event emission for streaming text, tool calls, and step tracking.
|
|
6
|
+
*
|
|
7
|
+
* Key features:
|
|
8
|
+
* - Delta-based text updates for responsive UI
|
|
9
|
+
* - Tool call lifecycle tracking (pending → running → completed/error)
|
|
10
|
+
* - Step-level cost and token tracking
|
|
11
|
+
* - Part creation and updates with unique IDs
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Stream Processor class.
|
|
15
|
+
*
|
|
16
|
+
* Processes streaming events from LLM providers and emits granular events
|
|
17
|
+
* for real-time UI updates. Follows the OpenCode pattern of part-based
|
|
18
|
+
* message construction with delta updates.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const processor = new StreamProcessor()
|
|
23
|
+
*
|
|
24
|
+
* const state = await processor.process(streamEvents, {
|
|
25
|
+
* eventBus: sessionEventBus,
|
|
26
|
+
* generateId: () => crypto.randomUUID(),
|
|
27
|
+
* sessionId: 'session-123',
|
|
28
|
+
* })
|
|
29
|
+
*
|
|
30
|
+
* console.log('Accumulated text:', state.textContent)
|
|
31
|
+
* console.log('Parts created:', state.parts.length)
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export class StreamProcessor {
|
|
35
|
+
/**
|
|
36
|
+
* Process a stream of events and emit granular updates.
|
|
37
|
+
*
|
|
38
|
+
* @param stream - Async iterable of stream events
|
|
39
|
+
* @param context - Processing context with event bus and utilities
|
|
40
|
+
* @returns Final processor state with accumulated parts
|
|
41
|
+
*/
|
|
42
|
+
async process(stream, context) {
|
|
43
|
+
const state = {
|
|
44
|
+
currentStepIndex: 0,
|
|
45
|
+
parts: [],
|
|
46
|
+
textContent: '',
|
|
47
|
+
toolParts: new Map(),
|
|
48
|
+
};
|
|
49
|
+
for await (const event of stream) {
|
|
50
|
+
await this.handleEvent(event, state, context);
|
|
51
|
+
}
|
|
52
|
+
return state;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Finalize text part if there's accumulated content.
|
|
56
|
+
*/
|
|
57
|
+
finalizeTextPart(state, context) {
|
|
58
|
+
if (state.textContent.length > 0) {
|
|
59
|
+
const textPart = {
|
|
60
|
+
text: state.textContent,
|
|
61
|
+
type: 'text',
|
|
62
|
+
};
|
|
63
|
+
state.parts.push(textPart);
|
|
64
|
+
// Emit final chunk
|
|
65
|
+
context.eventBus.emit('llmservice:chunk', {
|
|
66
|
+
content: '',
|
|
67
|
+
isComplete: true,
|
|
68
|
+
type: 'text',
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Handle a single stream event.
|
|
74
|
+
*/
|
|
75
|
+
async handleEvent(event, state, context) {
|
|
76
|
+
switch (event.type) {
|
|
77
|
+
case 'finish': {
|
|
78
|
+
// Finalize any pending text part
|
|
79
|
+
this.finalizeTextPart(state, context);
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
case 'reasoning-delta': {
|
|
83
|
+
// Emit reasoning chunk for UI streaming
|
|
84
|
+
context.eventBus.emit('llmservice:chunk', {
|
|
85
|
+
content: event.delta,
|
|
86
|
+
type: 'reasoning',
|
|
87
|
+
});
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
case 'step-finish': {
|
|
91
|
+
this.handleStepFinish({
|
|
92
|
+
cost: event.cost,
|
|
93
|
+
finishReason: event.finishReason,
|
|
94
|
+
stepIndex: event.stepIndex,
|
|
95
|
+
tokens: event.tokens,
|
|
96
|
+
}, state, context);
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
case 'step-start': {
|
|
100
|
+
this.handleStepStart(event.stepIndex, state, context);
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
case 'text-delta': {
|
|
104
|
+
this.handleTextDelta(event.delta, state, context);
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
case 'tool-call-complete': {
|
|
108
|
+
this.handleToolCallComplete(event.callId, event.output, state);
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
case 'tool-call-error': {
|
|
112
|
+
this.handleToolCallError(event.callId, event.error, state);
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
case 'tool-call-input': {
|
|
116
|
+
this.handleToolCallInput(event.callId, event.input, state);
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
case 'tool-call-running': {
|
|
120
|
+
this.handleToolCallRunning(event.callId, state);
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
case 'tool-call-start': {
|
|
124
|
+
this.handleToolCallStart(event.callId, event.toolName, state, context);
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Handle step finish event.
|
|
131
|
+
*/
|
|
132
|
+
handleStepFinish(options, state, context) {
|
|
133
|
+
const stepFinishPart = {
|
|
134
|
+
cost: options.cost,
|
|
135
|
+
finishReason: options.finishReason,
|
|
136
|
+
id: context.generateId(),
|
|
137
|
+
stepIndex: options.stepIndex,
|
|
138
|
+
timestamp: Date.now(),
|
|
139
|
+
tokens: options.tokens,
|
|
140
|
+
type: 'step_finish',
|
|
141
|
+
};
|
|
142
|
+
state.parts.push(stepFinishPart);
|
|
143
|
+
// Emit step finished event
|
|
144
|
+
context.eventBus.emit('step:finished', {
|
|
145
|
+
cost: options.cost,
|
|
146
|
+
finishReason: options.finishReason,
|
|
147
|
+
stepIndex: options.stepIndex,
|
|
148
|
+
tokens: options.tokens,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Handle step start event.
|
|
153
|
+
*/
|
|
154
|
+
handleStepStart(stepIndex, state, context) {
|
|
155
|
+
state.currentStepIndex = stepIndex;
|
|
156
|
+
const stepStartPart = {
|
|
157
|
+
id: context.generateId(),
|
|
158
|
+
stepIndex,
|
|
159
|
+
timestamp: Date.now(),
|
|
160
|
+
type: 'step_start',
|
|
161
|
+
};
|
|
162
|
+
state.parts.push(stepStartPart);
|
|
163
|
+
// Emit step started event
|
|
164
|
+
context.eventBus.emit('step:started', {
|
|
165
|
+
stepIndex,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Handle text delta - accumulate and emit.
|
|
170
|
+
*/
|
|
171
|
+
handleTextDelta(delta, state, context) {
|
|
172
|
+
state.textContent += delta;
|
|
173
|
+
// Emit chunk with delta for real-time UI update
|
|
174
|
+
context.eventBus.emit('llmservice:chunk', {
|
|
175
|
+
content: delta,
|
|
176
|
+
type: 'text',
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Handle tool call completion.
|
|
181
|
+
*/
|
|
182
|
+
handleToolCallComplete(callId, output, state) {
|
|
183
|
+
const toolPart = state.toolParts.get(callId);
|
|
184
|
+
if (toolPart && toolPart.state.status === 'running') {
|
|
185
|
+
const startTime = toolPart.state.startedAt;
|
|
186
|
+
toolPart.state = {
|
|
187
|
+
input: toolPart.state.input,
|
|
188
|
+
output,
|
|
189
|
+
status: 'completed',
|
|
190
|
+
time: {
|
|
191
|
+
end: Date.now(),
|
|
192
|
+
start: startTime,
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Handle tool call error.
|
|
199
|
+
*/
|
|
200
|
+
handleToolCallError(callId, error, state) {
|
|
201
|
+
const toolPart = state.toolParts.get(callId);
|
|
202
|
+
if (toolPart) {
|
|
203
|
+
const startTime = toolPart.state.status === 'running' ? toolPart.state.startedAt : Date.now();
|
|
204
|
+
toolPart.state = {
|
|
205
|
+
error,
|
|
206
|
+
input: toolPart.state.input,
|
|
207
|
+
status: 'error',
|
|
208
|
+
time: {
|
|
209
|
+
end: Date.now(),
|
|
210
|
+
start: startTime,
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Handle tool call input received.
|
|
217
|
+
*/
|
|
218
|
+
handleToolCallInput(callId, input, state) {
|
|
219
|
+
const toolPart = state.toolParts.get(callId);
|
|
220
|
+
if (toolPart && toolPart.state.status === 'pending') {
|
|
221
|
+
toolPart.state = {
|
|
222
|
+
input,
|
|
223
|
+
status: 'pending',
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Handle tool call transition to running.
|
|
229
|
+
*/
|
|
230
|
+
handleToolCallRunning(callId, state) {
|
|
231
|
+
const toolPart = state.toolParts.get(callId);
|
|
232
|
+
if (toolPart && toolPart.state.status === 'pending') {
|
|
233
|
+
toolPart.state = {
|
|
234
|
+
input: toolPart.state.input,
|
|
235
|
+
startedAt: Date.now(),
|
|
236
|
+
status: 'running',
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Handle tool call start - create pending tool part.
|
|
242
|
+
*/
|
|
243
|
+
handleToolCallStart(callId, toolName, state, context) {
|
|
244
|
+
// Finalize any pending text before tool call
|
|
245
|
+
this.finalizeTextPart(state, context);
|
|
246
|
+
state.textContent = '';
|
|
247
|
+
const toolPart = {
|
|
248
|
+
callId,
|
|
249
|
+
state: {
|
|
250
|
+
input: {},
|
|
251
|
+
status: 'pending',
|
|
252
|
+
},
|
|
253
|
+
toolName,
|
|
254
|
+
type: 'tool',
|
|
255
|
+
};
|
|
256
|
+
state.toolParts.set(callId, toolPart);
|
|
257
|
+
state.parts.push(toolPart);
|
|
258
|
+
// Emit tool call event
|
|
259
|
+
context.eventBus.emit('llmservice:toolCall', {
|
|
260
|
+
args: {},
|
|
261
|
+
callId,
|
|
262
|
+
toolName,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Helper to create a unique ID generator.
|
|
268
|
+
*/
|
|
269
|
+
export function createIdGenerator() {
|
|
270
|
+
let counter = 0;
|
|
271
|
+
return () => `part-${Date.now()}-${++counter}`;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Singleton stream processor instance.
|
|
275
|
+
*/
|
|
276
|
+
export const streamProcessor = new StreamProcessor();
|
|
@@ -1,44 +1,37 @@
|
|
|
1
1
|
import type { ITokenizer } from '../../../../core/interfaces/cipher/i-tokenizer.js';
|
|
2
2
|
/**
|
|
3
|
-
* Tokenizer for Anthropic Claude models
|
|
3
|
+
* Tokenizer for Anthropic Claude models.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* complexity of integrating Anthropic's token counting API.
|
|
5
|
+
* Uses the LLM registry for model-specific character-per-token ratios,
|
|
6
|
+
* providing better estimation accuracy across different Claude models.
|
|
8
7
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* This implementation uses a character-based approximation rather than
|
|
9
|
+
* accurate token counting. The ratio is now model-aware via the registry.
|
|
11
10
|
*
|
|
12
11
|
* TODO: Consider these improvements:
|
|
13
|
-
* 1. Use Anthropic's official token counting API (requires async handling
|
|
12
|
+
* 1. Use Anthropic's official token counting API (requires async handling)
|
|
14
13
|
* 2. Implement a WASM-based tokenizer for accurate synchronous counting
|
|
15
14
|
* 3. Cache token counts for frequently used text
|
|
16
|
-
* 4. Model-specific adjustments based on actual Claude tokenization patterns
|
|
17
15
|
*
|
|
18
16
|
* Reference: https://docs.anthropic.com/en/docs/about-claude/models
|
|
19
17
|
*/
|
|
20
18
|
export declare class ClaudeTokenizer implements ITokenizer {
|
|
21
|
-
private readonly
|
|
19
|
+
private readonly charsPerToken;
|
|
22
20
|
/**
|
|
23
21
|
* Creates a new Claude tokenizer instance.
|
|
24
22
|
*
|
|
25
|
-
* @param model - The Claude model name (e.g., 'claude-
|
|
26
|
-
*
|
|
23
|
+
* @param model - The Claude model name (e.g., 'claude-sonnet-4-20250514', 'claude-3-5-sonnet-20241022')
|
|
24
|
+
* Used to look up model-specific token ratio from registry
|
|
27
25
|
*/
|
|
28
26
|
constructor(model: string);
|
|
29
27
|
/**
|
|
30
28
|
* Approximates the token count for Anthropic Claude models.
|
|
31
29
|
*
|
|
32
|
-
* Uses
|
|
33
|
-
*
|
|
34
|
-
* English text with Claude's tokenizer.
|
|
30
|
+
* Uses model-specific character-per-token ratio from the LLM registry.
|
|
31
|
+
* Default for Claude models is ~3.5 characters per token.
|
|
35
32
|
*
|
|
36
|
-
* IMPORTANT: This is
|
|
37
|
-
*
|
|
38
|
-
* significantly based on:
|
|
39
|
-
* - Language (non-English text may have different ratios)
|
|
40
|
-
* - Content type (code vs prose)
|
|
41
|
-
* - Special characters and formatting
|
|
33
|
+
* IMPORTANT: This is still an approximation. The actual token count can vary
|
|
34
|
+
* based on language, content type (code vs prose), and special characters.
|
|
42
35
|
*
|
|
43
36
|
* @param text - Text content to count tokens for
|
|
44
37
|
* @returns Approximate number of tokens
|
|
@@ -1,45 +1,40 @@
|
|
|
1
|
+
import { DEFAULT_CHARS_PER_TOKEN, getCharsPerToken } from '../../../../core/domain/cipher/llm/index.js';
|
|
1
2
|
/**
|
|
2
|
-
* Tokenizer for Anthropic Claude models
|
|
3
|
+
* Tokenizer for Anthropic Claude models.
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* complexity of integrating Anthropic's token counting API.
|
|
5
|
+
* Uses the LLM registry for model-specific character-per-token ratios,
|
|
6
|
+
* providing better estimation accuracy across different Claude models.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* This implementation uses a character-based approximation rather than
|
|
9
|
+
* accurate token counting. The ratio is now model-aware via the registry.
|
|
10
10
|
*
|
|
11
11
|
* TODO: Consider these improvements:
|
|
12
|
-
* 1. Use Anthropic's official token counting API (requires async handling
|
|
12
|
+
* 1. Use Anthropic's official token counting API (requires async handling)
|
|
13
13
|
* 2. Implement a WASM-based tokenizer for accurate synchronous counting
|
|
14
14
|
* 3. Cache token counts for frequently used text
|
|
15
|
-
* 4. Model-specific adjustments based on actual Claude tokenization patterns
|
|
16
15
|
*
|
|
17
16
|
* Reference: https://docs.anthropic.com/en/docs/about-claude/models
|
|
18
17
|
*/
|
|
19
18
|
export class ClaudeTokenizer {
|
|
20
|
-
|
|
19
|
+
charsPerToken;
|
|
21
20
|
/**
|
|
22
21
|
* Creates a new Claude tokenizer instance.
|
|
23
22
|
*
|
|
24
|
-
* @param model - The Claude model name (e.g., 'claude-
|
|
25
|
-
*
|
|
23
|
+
* @param model - The Claude model name (e.g., 'claude-sonnet-4-20250514', 'claude-3-5-sonnet-20241022')
|
|
24
|
+
* Used to look up model-specific token ratio from registry
|
|
26
25
|
*/
|
|
27
26
|
constructor(model) {
|
|
28
|
-
|
|
27
|
+
// Look up model-specific ratio from registry, fallback to default
|
|
28
|
+
this.charsPerToken = getCharsPerToken('claude', model) ?? DEFAULT_CHARS_PER_TOKEN;
|
|
29
29
|
}
|
|
30
30
|
/**
|
|
31
31
|
* Approximates the token count for Anthropic Claude models.
|
|
32
32
|
*
|
|
33
|
-
* Uses
|
|
34
|
-
*
|
|
35
|
-
* English text with Claude's tokenizer.
|
|
33
|
+
* Uses model-specific character-per-token ratio from the LLM registry.
|
|
34
|
+
* Default for Claude models is ~3.5 characters per token.
|
|
36
35
|
*
|
|
37
|
-
* IMPORTANT: This is
|
|
38
|
-
*
|
|
39
|
-
* significantly based on:
|
|
40
|
-
* - Language (non-English text may have different ratios)
|
|
41
|
-
* - Content type (code vs prose)
|
|
42
|
-
* - Special characters and formatting
|
|
36
|
+
* IMPORTANT: This is still an approximation. The actual token count can vary
|
|
37
|
+
* based on language, content type (code vs prose), and special characters.
|
|
43
38
|
*
|
|
44
39
|
* @param text - Text content to count tokens for
|
|
45
40
|
* @returns Approximate number of tokens
|
|
@@ -48,8 +43,6 @@ export class ClaudeTokenizer {
|
|
|
48
43
|
if (!text) {
|
|
49
44
|
return 0;
|
|
50
45
|
}
|
|
51
|
-
|
|
52
|
-
// Claude's tokenizer is similar to GPT's, typically more efficient than 4 chars/token
|
|
53
|
-
return Math.ceil(text.length / 3.5);
|
|
46
|
+
return Math.ceil(text.length / this.charsPerToken);
|
|
54
47
|
}
|
|
55
48
|
}
|
|
@@ -1,34 +1,35 @@
|
|
|
1
1
|
import type { ITokenizer } from '../../../../core/interfaces/cipher/i-tokenizer.js';
|
|
2
2
|
/**
|
|
3
|
-
* Tokenizer for Google Gemini models
|
|
3
|
+
* Tokenizer for Google Gemini models.
|
|
4
|
+
*
|
|
5
|
+
* Uses the LLM registry for model-specific character-per-token ratios,
|
|
6
|
+
* providing better estimation accuracy across different Gemini models.
|
|
4
7
|
*
|
|
5
8
|
* This implementation uses a character-based approximation rather than
|
|
6
|
-
* accurate token counting.
|
|
7
|
-
* asynchronous nature of the official Gemini countTokens API.
|
|
9
|
+
* accurate token counting. The ratio is now model-aware via the registry.
|
|
8
10
|
*
|
|
9
11
|
* TODO: Consider these improvements:
|
|
10
12
|
* 1. Use the official @google/genai countTokens method (requires async handling)
|
|
11
13
|
* 2. Implement a WASM-based tokenizer for accurate synchronous counting
|
|
12
14
|
* 3. Cache token counts for frequently used text
|
|
13
|
-
* 4. Model-specific adjustments based on actual Gemini tokenization patterns
|
|
14
15
|
*/
|
|
15
16
|
export declare class GeminiTokenizer implements ITokenizer {
|
|
16
|
-
private readonly
|
|
17
|
+
private readonly charsPerToken;
|
|
17
18
|
/**
|
|
18
19
|
* Creates a new Gemini tokenizer instance.
|
|
19
20
|
*
|
|
20
|
-
* @param model - The Gemini model name (e.g., 'gemini-2.
|
|
21
|
-
*
|
|
21
|
+
* @param model - The Gemini model name (e.g., 'gemini-2.0-flash', 'gemini-1.5-pro')
|
|
22
|
+
* Used to look up model-specific token ratio from registry
|
|
22
23
|
*/
|
|
23
24
|
constructor(model: string);
|
|
24
25
|
/**
|
|
25
26
|
* Approximates the token count for Google Gemini models.
|
|
26
27
|
*
|
|
27
|
-
* Uses
|
|
28
|
-
*
|
|
28
|
+
* Uses model-specific character-per-token ratio from the LLM registry.
|
|
29
|
+
* Default for Gemini models is ~4 characters per token.
|
|
29
30
|
*
|
|
30
|
-
* IMPORTANT: This is
|
|
31
|
-
*
|
|
31
|
+
* IMPORTANT: This is still an approximation. The actual token count can vary
|
|
32
|
+
* based on language, content type (code vs prose), and special characters.
|
|
32
33
|
*
|
|
33
34
|
* @param text - Text content to count tokens for
|
|
34
35
|
* @returns Approximate number of tokens
|
|
@@ -1,35 +1,38 @@
|
|
|
1
|
+
import { DEFAULT_CHARS_PER_TOKEN, getCharsPerToken } from '../../../../core/domain/cipher/llm/index.js';
|
|
1
2
|
/**
|
|
2
|
-
* Tokenizer for Google Gemini models
|
|
3
|
+
* Tokenizer for Google Gemini models.
|
|
4
|
+
*
|
|
5
|
+
* Uses the LLM registry for model-specific character-per-token ratios,
|
|
6
|
+
* providing better estimation accuracy across different Gemini models.
|
|
3
7
|
*
|
|
4
8
|
* This implementation uses a character-based approximation rather than
|
|
5
|
-
* accurate token counting.
|
|
6
|
-
* asynchronous nature of the official Gemini countTokens API.
|
|
9
|
+
* accurate token counting. The ratio is now model-aware via the registry.
|
|
7
10
|
*
|
|
8
11
|
* TODO: Consider these improvements:
|
|
9
12
|
* 1. Use the official @google/genai countTokens method (requires async handling)
|
|
10
13
|
* 2. Implement a WASM-based tokenizer for accurate synchronous counting
|
|
11
14
|
* 3. Cache token counts for frequently used text
|
|
12
|
-
* 4. Model-specific adjustments based on actual Gemini tokenization patterns
|
|
13
15
|
*/
|
|
14
16
|
export class GeminiTokenizer {
|
|
15
|
-
|
|
17
|
+
charsPerToken;
|
|
16
18
|
/**
|
|
17
19
|
* Creates a new Gemini tokenizer instance.
|
|
18
20
|
*
|
|
19
|
-
* @param model - The Gemini model name (e.g., 'gemini-2.
|
|
20
|
-
*
|
|
21
|
+
* @param model - The Gemini model name (e.g., 'gemini-2.0-flash', 'gemini-1.5-pro')
|
|
22
|
+
* Used to look up model-specific token ratio from registry
|
|
21
23
|
*/
|
|
22
24
|
constructor(model) {
|
|
23
|
-
|
|
25
|
+
// Look up model-specific ratio from registry, fallback to default
|
|
26
|
+
this.charsPerToken = getCharsPerToken('gemini', model) ?? DEFAULT_CHARS_PER_TOKEN;
|
|
24
27
|
}
|
|
25
28
|
/**
|
|
26
29
|
* Approximates the token count for Google Gemini models.
|
|
27
30
|
*
|
|
28
|
-
* Uses
|
|
29
|
-
*
|
|
31
|
+
* Uses model-specific character-per-token ratio from the LLM registry.
|
|
32
|
+
* Default for Gemini models is ~4 characters per token.
|
|
30
33
|
*
|
|
31
|
-
* IMPORTANT: This is
|
|
32
|
-
*
|
|
34
|
+
* IMPORTANT: This is still an approximation. The actual token count can vary
|
|
35
|
+
* based on language, content type (code vs prose), and special characters.
|
|
33
36
|
*
|
|
34
37
|
* @param text - Text content to count tokens for
|
|
35
38
|
* @returns Approximate number of tokens
|
|
@@ -38,8 +41,6 @@ export class GeminiTokenizer {
|
|
|
38
41
|
if (!text) {
|
|
39
42
|
return 0;
|
|
40
43
|
}
|
|
41
|
-
|
|
42
|
-
// This is a simplified heuristic and varies by language and content type
|
|
43
|
-
return Math.ceil(text.length / 4);
|
|
44
|
+
return Math.ceil(text.length / this.charsPerToken);
|
|
44
45
|
}
|
|
45
46
|
}
|
|
@@ -3,18 +3,26 @@ import type { ITokenizer } from '../../../../core/interfaces/cipher/i-tokenizer.
|
|
|
3
3
|
* Tokenizer for OpenRouter API.
|
|
4
4
|
*
|
|
5
5
|
* OpenRouter supports multiple model providers (OpenAI, Anthropic, etc.),
|
|
6
|
-
* each with different tokenization schemes. This tokenizer
|
|
7
|
-
*
|
|
6
|
+
* each with different tokenization schemes. This tokenizer uses the LLM
|
|
7
|
+
* registry to look up model-specific character-per-token ratios when available.
|
|
8
8
|
*
|
|
9
|
-
* For
|
|
10
|
-
*
|
|
9
|
+
* For models not in the registry, falls back to a generic approximation
|
|
10
|
+
* that works reasonably well across different model providers.
|
|
11
11
|
*/
|
|
12
12
|
export declare class OpenRouterTokenizer implements ITokenizer {
|
|
13
|
+
private readonly charsPerToken;
|
|
13
14
|
/**
|
|
14
|
-
*
|
|
15
|
+
* Creates a new OpenRouter tokenizer instance.
|
|
15
16
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
17
|
+
* @param model - The OpenRouter model name (e.g., 'anthropic/claude-sonnet-4', 'openai/gpt-4o')
|
|
18
|
+
* Used to look up model-specific token ratio from registry
|
|
19
|
+
*/
|
|
20
|
+
constructor(model?: string);
|
|
21
|
+
/**
|
|
22
|
+
* Approximates token count using model-specific character-per-token ratio.
|
|
23
|
+
*
|
|
24
|
+
* Uses the LLM registry when available, otherwise defaults to ~4 characters
|
|
25
|
+
* per token which is a common approximation for modern tokenizers.
|
|
18
26
|
*
|
|
19
27
|
* @param text - Text content to count tokens for
|
|
20
28
|
* @returns Approximate number of tokens
|
|
@@ -1,19 +1,33 @@
|
|
|
1
|
+
import { DEFAULT_CHARS_PER_TOKEN, getCharsPerToken } from '../../../../core/domain/cipher/llm/index.js';
|
|
1
2
|
/**
|
|
2
3
|
* Tokenizer for OpenRouter API.
|
|
3
4
|
*
|
|
4
5
|
* OpenRouter supports multiple model providers (OpenAI, Anthropic, etc.),
|
|
5
|
-
* each with different tokenization schemes. This tokenizer
|
|
6
|
-
*
|
|
6
|
+
* each with different tokenization schemes. This tokenizer uses the LLM
|
|
7
|
+
* registry to look up model-specific character-per-token ratios when available.
|
|
7
8
|
*
|
|
8
|
-
* For
|
|
9
|
-
*
|
|
9
|
+
* For models not in the registry, falls back to a generic approximation
|
|
10
|
+
* that works reasonably well across different model providers.
|
|
10
11
|
*/
|
|
11
12
|
export class OpenRouterTokenizer {
|
|
13
|
+
charsPerToken;
|
|
12
14
|
/**
|
|
13
|
-
*
|
|
15
|
+
* Creates a new OpenRouter tokenizer instance.
|
|
14
16
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
+
* @param model - The OpenRouter model name (e.g., 'anthropic/claude-sonnet-4', 'openai/gpt-4o')
|
|
18
|
+
* Used to look up model-specific token ratio from registry
|
|
19
|
+
*/
|
|
20
|
+
constructor(model) {
|
|
21
|
+
// Look up model-specific ratio from registry, fallback to default
|
|
22
|
+
this.charsPerToken = model
|
|
23
|
+
? (getCharsPerToken('openrouter', model) ?? DEFAULT_CHARS_PER_TOKEN)
|
|
24
|
+
: DEFAULT_CHARS_PER_TOKEN;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Approximates token count using model-specific character-per-token ratio.
|
|
28
|
+
*
|
|
29
|
+
* Uses the LLM registry when available, otherwise defaults to ~4 characters
|
|
30
|
+
* per token which is a common approximation for modern tokenizers.
|
|
17
31
|
*
|
|
18
32
|
* @param text - Text content to count tokens for
|
|
19
33
|
* @returns Approximate number of tokens
|
|
@@ -22,9 +36,7 @@ export class OpenRouterTokenizer {
|
|
|
22
36
|
if (!text) {
|
|
23
37
|
return 0;
|
|
24
38
|
}
|
|
25
|
-
|
|
26
|
-
// This works reasonably well for most OpenRouter models
|
|
27
|
-
return Math.ceil(text.length / 4);
|
|
39
|
+
return Math.ceil(text.length / this.charsPerToken);
|
|
28
40
|
}
|
|
29
41
|
/**
|
|
30
42
|
* Gets the provider name for this tokenizer.
|