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,115 @@
|
|
|
1
|
+
import { NoOpLogger } from '../../core/interfaces/cipher/i-logger.js';
|
|
2
|
+
/**
|
|
3
|
+
* TaskProcessor - Coordinates task execution with injected executors.
|
|
4
|
+
*
|
|
5
|
+
* Architecture:
|
|
6
|
+
* - TaskProcessor receives single agent reference via setAgent()
|
|
7
|
+
* - TaskProcessor passes agent to Executor.executeWithAgent()
|
|
8
|
+
* - Executor handles execution (validation, prompt building)
|
|
9
|
+
* - Event streaming handled by agent-worker (subscribes to agentEventBus)
|
|
10
|
+
*
|
|
11
|
+
* Flow: agent-worker → TaskProcessor.process() → Executor.executeWithAgent()
|
|
12
|
+
*/
|
|
13
|
+
export class TaskProcessor {
|
|
14
|
+
/**
|
|
15
|
+
* Single CipherAgent reference from agent-worker.
|
|
16
|
+
*/
|
|
17
|
+
agent;
|
|
18
|
+
curateExecutor;
|
|
19
|
+
logger;
|
|
20
|
+
queryExecutor;
|
|
21
|
+
/** Track running tasks for cancellation */
|
|
22
|
+
runningTasks = new Map();
|
|
23
|
+
constructor(config) {
|
|
24
|
+
this.logger = config.logger ?? new NoOpLogger();
|
|
25
|
+
this.curateExecutor = config.curateExecutor;
|
|
26
|
+
this.queryExecutor = config.queryExecutor;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Cancel a running task.
|
|
30
|
+
*/
|
|
31
|
+
cancel(taskId) {
|
|
32
|
+
const task = this.runningTasks.get(taskId);
|
|
33
|
+
if (task) {
|
|
34
|
+
task.abort();
|
|
35
|
+
this.runningTasks.delete(taskId);
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Check if a task is running.
|
|
42
|
+
*/
|
|
43
|
+
isRunning(taskId) {
|
|
44
|
+
return this.runningTasks.has(taskId);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Process a task and return the result.
|
|
48
|
+
*
|
|
49
|
+
* Architecture:
|
|
50
|
+
* - Calls Executor.executeWithAgent() with long-lived agent
|
|
51
|
+
* - Returns result string
|
|
52
|
+
* - Event streaming handled by agent-worker (agentEventBus)
|
|
53
|
+
*/
|
|
54
|
+
async process(input) {
|
|
55
|
+
const { taskId, type } = input;
|
|
56
|
+
this.logger.info('Processing task', { taskId, type });
|
|
57
|
+
if (!this.agent) {
|
|
58
|
+
throw new Error('Agent not configured. Call setAgent() first.');
|
|
59
|
+
}
|
|
60
|
+
// Track task for cancellation
|
|
61
|
+
let aborted = false;
|
|
62
|
+
const abort = () => {
|
|
63
|
+
aborted = true;
|
|
64
|
+
};
|
|
65
|
+
this.runningTasks.set(taskId, { abort });
|
|
66
|
+
try {
|
|
67
|
+
const result = await this.executeWithAgent(input);
|
|
68
|
+
if (aborted) {
|
|
69
|
+
throw new Error('Task cancelled');
|
|
70
|
+
}
|
|
71
|
+
this.logger.info('Task completed', { taskId });
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
this.runningTasks.delete(taskId);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Set agent reference from agent-worker.
|
|
80
|
+
*/
|
|
81
|
+
setAgent(agent) {
|
|
82
|
+
this.agent = agent;
|
|
83
|
+
this.logger.debug('Agent reference set');
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Execute task with the injected agent.
|
|
87
|
+
*/
|
|
88
|
+
async executeWithAgent(input) {
|
|
89
|
+
const { content, taskId, type } = input;
|
|
90
|
+
if (!this.agent) {
|
|
91
|
+
throw new Error('Agent not configured');
|
|
92
|
+
}
|
|
93
|
+
this.logger.debug('Executing with agent', { taskId, type });
|
|
94
|
+
switch (type) {
|
|
95
|
+
case 'curate': {
|
|
96
|
+
// Agent uses its default session (Single-Session pattern)
|
|
97
|
+
return this.curateExecutor.executeWithAgent(this.agent, {
|
|
98
|
+
content,
|
|
99
|
+
files: input.files,
|
|
100
|
+
taskId,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
case 'query': {
|
|
104
|
+
// Agent uses its default session (Single-Session pattern)
|
|
105
|
+
return this.queryExecutor.executeWithAgent(this.agent, { query: content, taskId });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Create a new TaskProcessor instance.
|
|
112
|
+
*/
|
|
113
|
+
export function createTaskProcessor(config) {
|
|
114
|
+
return new TaskProcessor(config);
|
|
115
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { DiscoveryResult, IInstanceDiscovery } from '../../core/interfaces/instance/i-instance-discovery.js';
|
|
2
|
+
import type { IInstanceManager } from '../../core/interfaces/instance/i-instance-manager.js';
|
|
3
|
+
/**
|
|
4
|
+
* File-based implementation of IInstanceDiscovery.
|
|
5
|
+
*
|
|
6
|
+
* Implements walk-up directory tree algorithm to find running instances.
|
|
7
|
+
*/
|
|
8
|
+
export declare class FileInstanceDiscovery implements IInstanceDiscovery {
|
|
9
|
+
private readonly instanceManager;
|
|
10
|
+
constructor(instanceManager?: IInstanceManager);
|
|
11
|
+
/**
|
|
12
|
+
* Discovers a running instance starting from the given directory.
|
|
13
|
+
*
|
|
14
|
+
* Walk-up algorithm:
|
|
15
|
+
* 1. Start from `fromDir`
|
|
16
|
+
* 2. Check if .brv/instance.json exists
|
|
17
|
+
* 3. If yes, verify pid is alive
|
|
18
|
+
* 4. If no, walk up to parent directory
|
|
19
|
+
* 5. Repeat until root or found
|
|
20
|
+
*/
|
|
21
|
+
discover(fromDir: string): Promise<DiscoveryResult>;
|
|
22
|
+
/**
|
|
23
|
+
* Finds the project root by walking up from a directory.
|
|
24
|
+
* Returns the directory containing .brv/ or undefined if not found.
|
|
25
|
+
*/
|
|
26
|
+
findProjectRoot(fromDir: string): Promise<string | undefined>;
|
|
27
|
+
/**
|
|
28
|
+
* Checks if a directory exists.
|
|
29
|
+
*/
|
|
30
|
+
private directoryExists;
|
|
31
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { access } from 'node:fs/promises';
|
|
2
|
+
import { dirname, join, parse } from 'node:path';
|
|
3
|
+
import { BRV_DIR } from '../../constants.js';
|
|
4
|
+
import { FileInstanceManager } from './file-instance-manager.js';
|
|
5
|
+
import { isProcessAlive } from './process-utils.js';
|
|
6
|
+
/**
|
|
7
|
+
* File-based implementation of IInstanceDiscovery.
|
|
8
|
+
*
|
|
9
|
+
* Implements walk-up directory tree algorithm to find running instances.
|
|
10
|
+
*/
|
|
11
|
+
export class FileInstanceDiscovery {
|
|
12
|
+
instanceManager;
|
|
13
|
+
constructor(instanceManager) {
|
|
14
|
+
this.instanceManager = instanceManager ?? new FileInstanceManager();
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Discovers a running instance starting from the given directory.
|
|
18
|
+
*
|
|
19
|
+
* Walk-up algorithm:
|
|
20
|
+
* 1. Start from `fromDir`
|
|
21
|
+
* 2. Check if .brv/instance.json exists
|
|
22
|
+
* 3. If yes, verify pid is alive
|
|
23
|
+
* 4. If no, walk up to parent directory
|
|
24
|
+
* 5. Repeat until root or found
|
|
25
|
+
*/
|
|
26
|
+
async discover(fromDir) {
|
|
27
|
+
const projectRoot = await this.findProjectRoot(fromDir);
|
|
28
|
+
if (!projectRoot) {
|
|
29
|
+
return { found: false, reason: 'no_instance' };
|
|
30
|
+
}
|
|
31
|
+
const instance = await this.instanceManager.load(projectRoot);
|
|
32
|
+
if (!instance) {
|
|
33
|
+
return { found: false, reason: 'no_instance' };
|
|
34
|
+
}
|
|
35
|
+
// Verify PID is alive (this is the only check we need)
|
|
36
|
+
if (!isProcessAlive(instance.pid)) {
|
|
37
|
+
return { found: false, reason: 'instance_crashed' };
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
found: true,
|
|
41
|
+
instance,
|
|
42
|
+
projectRoot,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Finds the project root by walking up from a directory.
|
|
47
|
+
* Returns the directory containing .brv/ or undefined if not found.
|
|
48
|
+
*/
|
|
49
|
+
async findProjectRoot(fromDir) {
|
|
50
|
+
let currentDir = fromDir;
|
|
51
|
+
// Walk up requires sequential checks - can't parallelize tree traversal
|
|
52
|
+
while (true) {
|
|
53
|
+
const brvPath = join(currentDir, BRV_DIR);
|
|
54
|
+
// eslint-disable-next-line no-await-in-loop
|
|
55
|
+
if (await this.directoryExists(brvPath)) {
|
|
56
|
+
return currentDir;
|
|
57
|
+
}
|
|
58
|
+
// Get parent directory
|
|
59
|
+
const parentDir = dirname(currentDir);
|
|
60
|
+
// Check if we've reached the root
|
|
61
|
+
if (parentDir === currentDir) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
// Check if we've reached filesystem root (e.g., "/" or "C:\")
|
|
65
|
+
const parsed = parse(currentDir);
|
|
66
|
+
if (parsed.root === currentDir) {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
currentDir = parentDir;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Checks if a directory exists.
|
|
74
|
+
*/
|
|
75
|
+
async directoryExists(path) {
|
|
76
|
+
try {
|
|
77
|
+
await access(path);
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { AcquireResult, IInstanceManager } from '../../core/interfaces/instance/i-instance-manager.js';
|
|
2
|
+
import { InstanceInfo } from '../../core/domain/instance/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* File-based implementation of IInstanceManager.
|
|
5
|
+
*
|
|
6
|
+
* Stores instance information in .brv/instance.json.
|
|
7
|
+
*
|
|
8
|
+
* NOTE: We don't store "status" - we check pid alive at runtime.
|
|
9
|
+
* This handles crashes gracefully without stale status.
|
|
10
|
+
*/
|
|
11
|
+
export declare class FileInstanceManager implements IInstanceManager {
|
|
12
|
+
/**
|
|
13
|
+
* Attempts to acquire an instance lock.
|
|
14
|
+
*
|
|
15
|
+
* Logic:
|
|
16
|
+
* - No file → create new instance
|
|
17
|
+
* - File exists + pid alive → already running, fail
|
|
18
|
+
* - File exists + pid dead → stale (crashed), overwrite
|
|
19
|
+
*
|
|
20
|
+
* @param projectRoot - Root directory containing .brv/
|
|
21
|
+
* @param port - Port the transport server will use
|
|
22
|
+
*/
|
|
23
|
+
acquire(projectRoot: string, port: number): Promise<AcquireResult>;
|
|
24
|
+
/**
|
|
25
|
+
* Loads instance info from the project root.
|
|
26
|
+
*/
|
|
27
|
+
load(projectRoot: string): Promise<InstanceInfo | undefined>;
|
|
28
|
+
/**
|
|
29
|
+
* Releases the instance lock by deleting instance.json.
|
|
30
|
+
*
|
|
31
|
+
* Called during graceful shutdown.
|
|
32
|
+
*/
|
|
33
|
+
release(projectRoot: string): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Updates the current session ID.
|
|
36
|
+
*/
|
|
37
|
+
updateSessionId(projectRoot: string, sessionId: string): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Gets the path to the instance.json file.
|
|
40
|
+
*/
|
|
41
|
+
private getInstanceFilePath;
|
|
42
|
+
/**
|
|
43
|
+
* Saves instance info to the project root.
|
|
44
|
+
*/
|
|
45
|
+
private save;
|
|
46
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { mkdir, readFile, rm, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { BRV_DIR, INSTANCE_FILE } from '../../constants.js';
|
|
4
|
+
import { InstanceInfo } from '../../core/domain/instance/types.js';
|
|
5
|
+
import { getCurrentPid, isProcessAlive } from './process-utils.js';
|
|
6
|
+
/**
|
|
7
|
+
* Type guard to validate instance.json structure.
|
|
8
|
+
* Ensures all required fields exist with correct types.
|
|
9
|
+
*/
|
|
10
|
+
function isValidInstanceInfoJson(value) {
|
|
11
|
+
if (typeof value !== 'object' || value === null) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
const obj = value;
|
|
15
|
+
return (typeof obj.pid === 'number' &&
|
|
16
|
+
typeof obj.port === 'number' &&
|
|
17
|
+
typeof obj.startedAt === 'number' &&
|
|
18
|
+
(obj.currentSessionId === null || typeof obj.currentSessionId === 'string'));
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* File-based implementation of IInstanceManager.
|
|
22
|
+
*
|
|
23
|
+
* Stores instance information in .brv/instance.json.
|
|
24
|
+
*
|
|
25
|
+
* NOTE: We don't store "status" - we check pid alive at runtime.
|
|
26
|
+
* This handles crashes gracefully without stale status.
|
|
27
|
+
*/
|
|
28
|
+
export class FileInstanceManager {
|
|
29
|
+
/**
|
|
30
|
+
* Attempts to acquire an instance lock.
|
|
31
|
+
*
|
|
32
|
+
* Logic:
|
|
33
|
+
* - No file → create new instance
|
|
34
|
+
* - File exists + pid alive → already running, fail
|
|
35
|
+
* - File exists + pid dead → stale (crashed), overwrite
|
|
36
|
+
*
|
|
37
|
+
* @param projectRoot - Root directory containing .brv/
|
|
38
|
+
* @param port - Port the transport server will use
|
|
39
|
+
*/
|
|
40
|
+
async acquire(projectRoot, port) {
|
|
41
|
+
const existing = await this.load(projectRoot);
|
|
42
|
+
// Check if there's an existing running instance (pid alive)
|
|
43
|
+
if (existing && isProcessAlive(existing.pid)) {
|
|
44
|
+
return {
|
|
45
|
+
acquired: false,
|
|
46
|
+
existingInstance: existing,
|
|
47
|
+
reason: 'already_running',
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// Create new instance (either no existing or stale/crashed)
|
|
51
|
+
const instance = InstanceInfo.create({
|
|
52
|
+
pid: getCurrentPid(),
|
|
53
|
+
port,
|
|
54
|
+
});
|
|
55
|
+
await this.save(projectRoot, instance);
|
|
56
|
+
return {
|
|
57
|
+
acquired: true,
|
|
58
|
+
instance,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Loads instance info from the project root.
|
|
63
|
+
*/
|
|
64
|
+
async load(projectRoot) {
|
|
65
|
+
const filePath = this.getInstanceFilePath(projectRoot);
|
|
66
|
+
try {
|
|
67
|
+
const content = await readFile(filePath, 'utf8');
|
|
68
|
+
const json = JSON.parse(content);
|
|
69
|
+
if (!isValidInstanceInfoJson(json)) {
|
|
70
|
+
// Corrupted file = no valid instance
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
return InstanceInfo.fromJson(json);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// File doesn't exist, is corrupted, or unreadable = no valid instance
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Releases the instance lock by deleting instance.json.
|
|
82
|
+
*
|
|
83
|
+
* Called during graceful shutdown.
|
|
84
|
+
*/
|
|
85
|
+
async release(projectRoot) {
|
|
86
|
+
const filePath = this.getInstanceFilePath(projectRoot);
|
|
87
|
+
try {
|
|
88
|
+
await rm(filePath);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// File might not exist, ignore
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Updates the current session ID.
|
|
96
|
+
*/
|
|
97
|
+
async updateSessionId(projectRoot, sessionId) {
|
|
98
|
+
const instance = await this.load(projectRoot);
|
|
99
|
+
if (!instance) {
|
|
100
|
+
throw new Error('No instance found to update');
|
|
101
|
+
}
|
|
102
|
+
const updated = instance.withSessionId(sessionId);
|
|
103
|
+
await this.save(projectRoot, updated);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Gets the path to the instance.json file.
|
|
107
|
+
*/
|
|
108
|
+
getInstanceFilePath(projectRoot) {
|
|
109
|
+
return join(projectRoot, BRV_DIR, INSTANCE_FILE);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Saves instance info to the project root.
|
|
113
|
+
*/
|
|
114
|
+
async save(projectRoot, instance) {
|
|
115
|
+
const brvDir = join(projectRoot, BRV_DIR);
|
|
116
|
+
const filePath = this.getInstanceFilePath(projectRoot);
|
|
117
|
+
// Ensure .brv directory exists
|
|
118
|
+
await mkdir(brvDir, { recursive: true });
|
|
119
|
+
// Write instance.json with pretty formatting
|
|
120
|
+
const json = JSON.stringify(instance.toJson(), null, 2);
|
|
121
|
+
await writeFile(filePath, json, 'utf8');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checks if a process with the given PID is alive.
|
|
3
|
+
*
|
|
4
|
+
* Uses process.kill(pid, 0) which doesn't actually send a signal,
|
|
5
|
+
* but throws an error if the process doesn't exist.
|
|
6
|
+
*
|
|
7
|
+
* @param pid - Process ID to check
|
|
8
|
+
* @returns true if process exists, false otherwise
|
|
9
|
+
*/
|
|
10
|
+
export declare function isProcessAlive(pid: number): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Gets the current process ID.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getCurrentPid(): number;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checks if a process with the given PID is alive.
|
|
3
|
+
*
|
|
4
|
+
* Uses process.kill(pid, 0) which doesn't actually send a signal,
|
|
5
|
+
* but throws an error if the process doesn't exist.
|
|
6
|
+
*
|
|
7
|
+
* @param pid - Process ID to check
|
|
8
|
+
* @returns true if process exists, false otherwise
|
|
9
|
+
*/
|
|
10
|
+
export function isProcessAlive(pid) {
|
|
11
|
+
try {
|
|
12
|
+
// Signal 0 doesn't kill the process, just checks if it exists
|
|
13
|
+
process.kill(pid, 0);
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
// ESRCH means "No such process"
|
|
18
|
+
// EPERM means "Permission denied" (process exists but we can't signal it)
|
|
19
|
+
if (error instanceof Error && 'code' in error) {
|
|
20
|
+
const { code } = error;
|
|
21
|
+
if (code === 'ESRCH') {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
if (code === 'EPERM') {
|
|
25
|
+
// Process exists but we don't have permission to signal it
|
|
26
|
+
// This shouldn't happen for our own child processes, but handle it
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// Unknown error, assume process doesn't exist
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Gets the current process ID.
|
|
36
|
+
*/
|
|
37
|
+
export function getCurrentPid() {
|
|
38
|
+
return process.pid;
|
|
39
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Worker - Entry point for Agent Process.
|
|
3
|
+
*
|
|
4
|
+
* Architecture v0.5.0:
|
|
5
|
+
* - Connects to Transport as Socket.IO CLIENT
|
|
6
|
+
* - Contains TaskProcessor + UseCases + CipherAgent
|
|
7
|
+
* - Receives tasks via Socket.IO (task:execute)
|
|
8
|
+
* - Sends results back via Socket.IO (task:chunk, task:completed, etc.)
|
|
9
|
+
* - NO Socket.IO server (Transport is the only server)
|
|
10
|
+
*
|
|
11
|
+
* IPC messages:
|
|
12
|
+
* - Receives: 'ping', 'shutdown'
|
|
13
|
+
* - Sends: 'ready', 'pong', 'stopped', 'error'
|
|
14
|
+
*
|
|
15
|
+
* Socket.IO events (as client):
|
|
16
|
+
* - Sends: 'agent:register' (identify as Agent)
|
|
17
|
+
* - Receives: 'task:execute', 'task:cancel', 'shutdown'
|
|
18
|
+
* - Sends: 'task:started', 'task:chunk', 'task:completed', 'task:error', 'task:toolCall', 'task:toolResult'
|
|
19
|
+
*/
|
|
20
|
+
export {};
|