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,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process Manager - Manages the lifecycle of Transport and Agent processes.
|
|
3
|
+
*
|
|
4
|
+
* Architecture v0.5.0:
|
|
5
|
+
* - Spawns 2 separate child processes: Transport and Agent
|
|
6
|
+
* - Transport Process: Socket.IO server only (message hub)
|
|
7
|
+
* - Agent Process: TaskProcessor + UseCases + CipherAgent
|
|
8
|
+
* - ALL task communication via Socket.IO (NO IPC for tasks)
|
|
9
|
+
* - IPC only for process lifecycle: ready, shutdown, stopped
|
|
10
|
+
*
|
|
11
|
+
* Startup sequence:
|
|
12
|
+
* 1. fork('transport-worker.js')
|
|
13
|
+
* 2. Wait for Transport 'ready' with port
|
|
14
|
+
* 3. fork('agent-worker.js') with TRANSPORT_PORT env
|
|
15
|
+
* 4. Wait for Agent 'ready'
|
|
16
|
+
*
|
|
17
|
+
* Shutdown sequence:
|
|
18
|
+
* 1. Send 'shutdown' to Agent via IPC
|
|
19
|
+
* 2. Wait for Agent to exit
|
|
20
|
+
* 3. Send 'shutdown' to Transport via IPC
|
|
21
|
+
* 4. Wait for Transport to exit
|
|
22
|
+
*/
|
|
23
|
+
import { type ChildProcess } from 'node:child_process';
|
|
24
|
+
/**
|
|
25
|
+
* Process state tracking.
|
|
26
|
+
*/
|
|
27
|
+
export type ProcessState = {
|
|
28
|
+
/** Agent child process */
|
|
29
|
+
agentProcess?: ChildProcess;
|
|
30
|
+
/** Whether Agent is connected */
|
|
31
|
+
agentReady: boolean;
|
|
32
|
+
/** Transport port (from Transport Process) */
|
|
33
|
+
port?: number;
|
|
34
|
+
/** Whether system is running */
|
|
35
|
+
running: boolean;
|
|
36
|
+
/** Transport child process */
|
|
37
|
+
transportProcess?: ChildProcess;
|
|
38
|
+
/** Whether Transport is ready */
|
|
39
|
+
transportReady: boolean;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* ProcessManager configuration.
|
|
43
|
+
*/
|
|
44
|
+
export type ProcessManagerConfig = {
|
|
45
|
+
/** Timeout for process shutdown (ms) */
|
|
46
|
+
shutdownTimeoutMs?: number;
|
|
47
|
+
/** Timeout for process startup (ms) */
|
|
48
|
+
startupTimeoutMs?: number;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* ProcessManager - Spawns and manages Transport and Agent processes.
|
|
52
|
+
*
|
|
53
|
+
* Architecture v0.5.0:
|
|
54
|
+
* - Single source of truth for child process lifecycle
|
|
55
|
+
* - Transport spawned first (needs port)
|
|
56
|
+
* - Agent spawned second (needs transport port)
|
|
57
|
+
* - Crash recovery: respawn on exit
|
|
58
|
+
*/
|
|
59
|
+
export declare class ProcessManager {
|
|
60
|
+
private healthCheckInterval?;
|
|
61
|
+
private lastHealthCheckTime;
|
|
62
|
+
private readonly shutdownTimeoutMs;
|
|
63
|
+
private readonly startupTimeoutMs;
|
|
64
|
+
private state;
|
|
65
|
+
constructor(config?: ProcessManagerConfig);
|
|
66
|
+
/**
|
|
67
|
+
* Get current state.
|
|
68
|
+
*/
|
|
69
|
+
getState(): Readonly<ProcessState>;
|
|
70
|
+
/**
|
|
71
|
+
* Get transport port (for TUI to connect).
|
|
72
|
+
*/
|
|
73
|
+
getTransportPort(): number | undefined;
|
|
74
|
+
/**
|
|
75
|
+
* Check if system is fully running.
|
|
76
|
+
*/
|
|
77
|
+
isRunning(): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Start Transport and Agent processes.
|
|
80
|
+
*
|
|
81
|
+
* Sequence:
|
|
82
|
+
* 1. Start Transport Process
|
|
83
|
+
* 2. Wait for Transport 'ready' with port
|
|
84
|
+
* 3. Start Agent Process with TRANSPORT_PORT env
|
|
85
|
+
* 4. Wait for Agent 'ready'
|
|
86
|
+
*
|
|
87
|
+
* @throws Error if startup fails or times out
|
|
88
|
+
*/
|
|
89
|
+
start(): Promise<void>;
|
|
90
|
+
/**
|
|
91
|
+
* Stop all processes gracefully.
|
|
92
|
+
*
|
|
93
|
+
* Sequence:
|
|
94
|
+
* 1. Stop Agent first (so it can disconnect cleanly)
|
|
95
|
+
* 2. Stop Transport after Agent is gone
|
|
96
|
+
*/
|
|
97
|
+
stop(): Promise<void>;
|
|
98
|
+
/**
|
|
99
|
+
* Get directory for worker files.
|
|
100
|
+
* In dev mode (tsx), import.meta.url points to src/ but workers need compiled .js from dist/
|
|
101
|
+
*/
|
|
102
|
+
private getWorkerDir;
|
|
103
|
+
/**
|
|
104
|
+
* Handle system wake from sleep.
|
|
105
|
+
* Verify processes are still alive and restart if needed.
|
|
106
|
+
*/
|
|
107
|
+
private handleSystemWake;
|
|
108
|
+
/**
|
|
109
|
+
* Send IPC message to child process.
|
|
110
|
+
*/
|
|
111
|
+
private sendToChild;
|
|
112
|
+
/**
|
|
113
|
+
* Setup Agent crash recovery.
|
|
114
|
+
*/
|
|
115
|
+
private setupAgentCrashRecovery;
|
|
116
|
+
/**
|
|
117
|
+
* Setup Transport crash recovery.
|
|
118
|
+
*/
|
|
119
|
+
private setupTransportCrashRecovery;
|
|
120
|
+
/**
|
|
121
|
+
* Start Agent Process.
|
|
122
|
+
*/
|
|
123
|
+
private startAgentProcess;
|
|
124
|
+
/**
|
|
125
|
+
* Start health check interval for sleep/wake detection.
|
|
126
|
+
* Detects system sleep by monitoring for large time gaps between checks.
|
|
127
|
+
*/
|
|
128
|
+
private startHealthCheck;
|
|
129
|
+
/**
|
|
130
|
+
* Start Transport Process.
|
|
131
|
+
* @returns The port Transport is listening on
|
|
132
|
+
*/
|
|
133
|
+
private startTransportProcess;
|
|
134
|
+
/**
|
|
135
|
+
* Stop Agent Process.
|
|
136
|
+
*/
|
|
137
|
+
private stopAgentProcess;
|
|
138
|
+
/**
|
|
139
|
+
* Stop health check interval.
|
|
140
|
+
*/
|
|
141
|
+
private stopHealthCheck;
|
|
142
|
+
/**
|
|
143
|
+
* Stop Transport Process.
|
|
144
|
+
*/
|
|
145
|
+
private stopTransportProcess;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get or create the ProcessManager singleton.
|
|
149
|
+
*/
|
|
150
|
+
export declare function getProcessManager(config?: ProcessManagerConfig): ProcessManager;
|
|
151
|
+
/**
|
|
152
|
+
* Dispose the ProcessManager singleton.
|
|
153
|
+
*/
|
|
154
|
+
export declare function disposeProcessManager(): Promise<void>;
|
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process Manager - Manages the lifecycle of Transport and Agent processes.
|
|
3
|
+
*
|
|
4
|
+
* Architecture v0.5.0:
|
|
5
|
+
* - Spawns 2 separate child processes: Transport and Agent
|
|
6
|
+
* - Transport Process: Socket.IO server only (message hub)
|
|
7
|
+
* - Agent Process: TaskProcessor + UseCases + CipherAgent
|
|
8
|
+
* - ALL task communication via Socket.IO (NO IPC for tasks)
|
|
9
|
+
* - IPC only for process lifecycle: ready, shutdown, stopped
|
|
10
|
+
*
|
|
11
|
+
* Startup sequence:
|
|
12
|
+
* 1. fork('transport-worker.js')
|
|
13
|
+
* 2. Wait for Transport 'ready' with port
|
|
14
|
+
* 3. fork('agent-worker.js') with TRANSPORT_PORT env
|
|
15
|
+
* 4. Wait for Agent 'ready'
|
|
16
|
+
*
|
|
17
|
+
* Shutdown sequence:
|
|
18
|
+
* 1. Send 'shutdown' to Agent via IPC
|
|
19
|
+
* 2. Wait for Agent to exit
|
|
20
|
+
* 3. Send 'shutdown' to Transport via IPC
|
|
21
|
+
* 4. Wait for Transport to exit
|
|
22
|
+
*/
|
|
23
|
+
import { fork } from 'node:child_process';
|
|
24
|
+
import path from 'node:path';
|
|
25
|
+
import { fileURLToPath } from 'node:url';
|
|
26
|
+
import { crashLog, getSessionLogPath, processManagerLog } from '../../utils/process-logger.js';
|
|
27
|
+
const DEFAULT_SHUTDOWN_TIMEOUT_MS = 5000;
|
|
28
|
+
const DEFAULT_STARTUP_TIMEOUT_MS = 30_000;
|
|
29
|
+
const HEALTH_CHECK_INTERVAL_MS = 5000; // Check every 5 seconds
|
|
30
|
+
const SLEEP_DETECTION_THRESHOLD_MS = 30_000; // If 30s passed when expecting 5s, likely slept
|
|
31
|
+
/**
|
|
32
|
+
* Creates a system error with crash log.
|
|
33
|
+
* Logs error details to session log and returns user-friendly message.
|
|
34
|
+
*/
|
|
35
|
+
function createSystemError(error, context) {
|
|
36
|
+
const logPath = crashLog(new Error(error), context);
|
|
37
|
+
return new Error(`brv failed to start. Details logged to: ${logPath}`);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* ProcessManager - Spawns and manages Transport and Agent processes.
|
|
41
|
+
*
|
|
42
|
+
* Architecture v0.5.0:
|
|
43
|
+
* - Single source of truth for child process lifecycle
|
|
44
|
+
* - Transport spawned first (needs port)
|
|
45
|
+
* - Agent spawned second (needs transport port)
|
|
46
|
+
* - Crash recovery: respawn on exit
|
|
47
|
+
*/
|
|
48
|
+
export class ProcessManager {
|
|
49
|
+
healthCheckInterval;
|
|
50
|
+
lastHealthCheckTime = Date.now();
|
|
51
|
+
shutdownTimeoutMs;
|
|
52
|
+
startupTimeoutMs;
|
|
53
|
+
state = {
|
|
54
|
+
agentReady: false,
|
|
55
|
+
running: false,
|
|
56
|
+
transportReady: false,
|
|
57
|
+
};
|
|
58
|
+
constructor(config) {
|
|
59
|
+
this.startupTimeoutMs = config?.startupTimeoutMs ?? DEFAULT_STARTUP_TIMEOUT_MS;
|
|
60
|
+
this.shutdownTimeoutMs = config?.shutdownTimeoutMs ?? DEFAULT_SHUTDOWN_TIMEOUT_MS;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get current state.
|
|
64
|
+
*/
|
|
65
|
+
getState() {
|
|
66
|
+
return { ...this.state };
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get transport port (for TUI to connect).
|
|
70
|
+
*/
|
|
71
|
+
getTransportPort() {
|
|
72
|
+
return this.state.port;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Check if system is fully running.
|
|
76
|
+
*/
|
|
77
|
+
isRunning() {
|
|
78
|
+
return this.state.running && this.state.transportReady && this.state.agentReady;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Start Transport and Agent processes.
|
|
82
|
+
*
|
|
83
|
+
* Sequence:
|
|
84
|
+
* 1. Start Transport Process
|
|
85
|
+
* 2. Wait for Transport 'ready' with port
|
|
86
|
+
* 3. Start Agent Process with TRANSPORT_PORT env
|
|
87
|
+
* 4. Wait for Agent 'ready'
|
|
88
|
+
*
|
|
89
|
+
* @throws Error if startup fails or times out
|
|
90
|
+
*/
|
|
91
|
+
async start() {
|
|
92
|
+
if (this.state.running) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
// Step 1: Start Transport Process
|
|
96
|
+
const port = await this.startTransportProcess();
|
|
97
|
+
this.state.port = port;
|
|
98
|
+
this.state.transportReady = true;
|
|
99
|
+
// Step 2: Start Agent Process (with transport port)
|
|
100
|
+
await this.startAgentProcess(port);
|
|
101
|
+
this.state.agentReady = true;
|
|
102
|
+
this.state.running = true;
|
|
103
|
+
// Step 3: Start health check for sleep/wake detection
|
|
104
|
+
this.startHealthCheck();
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Stop all processes gracefully.
|
|
108
|
+
*
|
|
109
|
+
* Sequence:
|
|
110
|
+
* 1. Stop Agent first (so it can disconnect cleanly)
|
|
111
|
+
* 2. Stop Transport after Agent is gone
|
|
112
|
+
*/
|
|
113
|
+
async stop() {
|
|
114
|
+
if (!this.state.running) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
this.state.running = false;
|
|
118
|
+
// Stop health check first
|
|
119
|
+
this.stopHealthCheck();
|
|
120
|
+
// Step 1: Stop Agent Process
|
|
121
|
+
await this.stopAgentProcess();
|
|
122
|
+
this.state.agentReady = false;
|
|
123
|
+
// Step 2: Stop Transport Process
|
|
124
|
+
await this.stopTransportProcess();
|
|
125
|
+
this.state.transportReady = false;
|
|
126
|
+
this.state.port = undefined;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get directory for worker files.
|
|
130
|
+
* In dev mode (tsx), import.meta.url points to src/ but workers need compiled .js from dist/
|
|
131
|
+
*/
|
|
132
|
+
getWorkerDir() {
|
|
133
|
+
const currentDir = path.dirname(fileURLToPath(import.meta.url));
|
|
134
|
+
// If running from src/ (dev mode with tsx), redirect to dist/
|
|
135
|
+
if (currentDir.includes(`${path.sep}src${path.sep}`)) {
|
|
136
|
+
return currentDir.replace(`${path.sep}src${path.sep}`, `${path.sep}dist${path.sep}`);
|
|
137
|
+
}
|
|
138
|
+
return currentDir;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Handle system wake from sleep.
|
|
142
|
+
* Verify processes are still alive and restart if needed.
|
|
143
|
+
*/
|
|
144
|
+
handleSystemWake() {
|
|
145
|
+
const { agentProcess, transportProcess } = this.state;
|
|
146
|
+
// Check if processes are still running
|
|
147
|
+
const agentAlive = agentProcess && !agentProcess.killed && agentProcess.exitCode === null;
|
|
148
|
+
const transportAlive = transportProcess && !transportProcess.killed && transportProcess.exitCode === null;
|
|
149
|
+
if (!agentAlive || !transportAlive) {
|
|
150
|
+
processManagerLog('Processes not healthy after wake, triggering restart');
|
|
151
|
+
// Trigger restart by simulating crash recovery
|
|
152
|
+
if (!transportAlive && transportProcess) {
|
|
153
|
+
processManagerLog('Transport process died during sleep, respawning...');
|
|
154
|
+
// The crash recovery handler will handle this
|
|
155
|
+
transportProcess.emit('exit', 1, null);
|
|
156
|
+
}
|
|
157
|
+
else if (!agentAlive && agentProcess) {
|
|
158
|
+
processManagerLog('Agent process died during sleep, respawning...');
|
|
159
|
+
// The crash recovery handler will handle this
|
|
160
|
+
agentProcess.emit('exit', 1, null);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
processManagerLog('Processes healthy after wake');
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Send IPC message to child process.
|
|
169
|
+
*/
|
|
170
|
+
sendToChild(child, message) {
|
|
171
|
+
child.send?.(message);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Setup Agent crash recovery.
|
|
175
|
+
*/
|
|
176
|
+
setupAgentCrashRecovery() {
|
|
177
|
+
const { agentProcess } = this.state;
|
|
178
|
+
if (!agentProcess)
|
|
179
|
+
return;
|
|
180
|
+
// Use .once() to prevent listener accumulation on crash/respawn cycles
|
|
181
|
+
agentProcess.once('exit', (code, signal) => {
|
|
182
|
+
if (!this.state.running)
|
|
183
|
+
return; // Intentional shutdown
|
|
184
|
+
processManagerLog(`Agent process exited unexpectedly (code=${code}, signal=${signal})`);
|
|
185
|
+
this.state.agentReady = false;
|
|
186
|
+
// Respawn Agent
|
|
187
|
+
if (this.state.port) {
|
|
188
|
+
this.startAgentProcess(this.state.port)
|
|
189
|
+
.then(() => {
|
|
190
|
+
this.state.agentReady = true;
|
|
191
|
+
processManagerLog('Agent process respawned');
|
|
192
|
+
})
|
|
193
|
+
.catch((error) => {
|
|
194
|
+
processManagerLog(`Failed to respawn Agent: ${error}`);
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Setup Transport crash recovery.
|
|
201
|
+
*/
|
|
202
|
+
setupTransportCrashRecovery() {
|
|
203
|
+
const { transportProcess } = this.state;
|
|
204
|
+
if (!transportProcess)
|
|
205
|
+
return;
|
|
206
|
+
// Use .once() to prevent listener accumulation on crash/respawn cycles
|
|
207
|
+
transportProcess.once('exit', (code, signal) => {
|
|
208
|
+
if (!this.state.running)
|
|
209
|
+
return; // Intentional shutdown
|
|
210
|
+
processManagerLog(`Transport process exited unexpectedly (code=${code}, signal=${signal})`);
|
|
211
|
+
this.state.transportReady = false;
|
|
212
|
+
// Respawn Transport, then reconnect Agent
|
|
213
|
+
this.startTransportProcess()
|
|
214
|
+
.then(async (newPort) => {
|
|
215
|
+
this.state.port = newPort;
|
|
216
|
+
this.state.transportReady = true;
|
|
217
|
+
processManagerLog(`Transport process respawned on port ${newPort}`);
|
|
218
|
+
// Agent needs to reconnect to new port
|
|
219
|
+
// For now, just restart Agent
|
|
220
|
+
if (this.state.agentProcess) {
|
|
221
|
+
await this.stopAgentProcess();
|
|
222
|
+
await this.startAgentProcess(newPort);
|
|
223
|
+
this.state.agentReady = true;
|
|
224
|
+
processManagerLog('Agent reconnected to new Transport');
|
|
225
|
+
}
|
|
226
|
+
})
|
|
227
|
+
.catch((error) => {
|
|
228
|
+
processManagerLog(`Failed to respawn Transport: ${error}`);
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Start Agent Process.
|
|
234
|
+
*/
|
|
235
|
+
async startAgentProcess(transportPort) {
|
|
236
|
+
return new Promise((resolve, reject) => {
|
|
237
|
+
const workerPath = path.resolve(this.getWorkerDir(), 'agent-worker.js');
|
|
238
|
+
const child = fork(workerPath, [], {
|
|
239
|
+
env: {
|
|
240
|
+
...process.env,
|
|
241
|
+
BRV_SESSION_LOG: getSessionLogPath(),
|
|
242
|
+
TRANSPORT_PORT: String(transportPort),
|
|
243
|
+
},
|
|
244
|
+
stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
|
|
245
|
+
});
|
|
246
|
+
this.state.agentProcess = child;
|
|
247
|
+
const timeout = setTimeout(() => {
|
|
248
|
+
cleanup();
|
|
249
|
+
child.kill('SIGKILL');
|
|
250
|
+
reject(createSystemError(`Agent startup timed out after ${this.startupTimeoutMs}ms`, 'Agent startup timeout'));
|
|
251
|
+
}, this.startupTimeoutMs);
|
|
252
|
+
const onMessage = (message) => {
|
|
253
|
+
if (message.type === 'ready') {
|
|
254
|
+
cleanup();
|
|
255
|
+
this.setupAgentCrashRecovery();
|
|
256
|
+
resolve();
|
|
257
|
+
}
|
|
258
|
+
else if (message.type === 'error') {
|
|
259
|
+
cleanup();
|
|
260
|
+
child.kill('SIGKILL');
|
|
261
|
+
reject(createSystemError(message.error, 'Agent startup error'));
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
const onError = (error) => {
|
|
265
|
+
cleanup();
|
|
266
|
+
reject(createSystemError(error.message, 'Agent process error'));
|
|
267
|
+
};
|
|
268
|
+
const onExit = (code) => {
|
|
269
|
+
cleanup();
|
|
270
|
+
reject(createSystemError(`Agent exited with code ${code}`, 'Agent unexpected exit'));
|
|
271
|
+
};
|
|
272
|
+
const cleanup = () => {
|
|
273
|
+
clearTimeout(timeout);
|
|
274
|
+
child.off('message', onMessage);
|
|
275
|
+
child.off('error', onError);
|
|
276
|
+
child.off('exit', onExit);
|
|
277
|
+
};
|
|
278
|
+
child.on('message', onMessage);
|
|
279
|
+
child.on('error', onError);
|
|
280
|
+
child.on('exit', onExit);
|
|
281
|
+
// Forward stdout/stderr
|
|
282
|
+
child.stdout?.pipe(process.stdout);
|
|
283
|
+
child.stderr?.pipe(process.stderr);
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Start health check interval for sleep/wake detection.
|
|
288
|
+
* Detects system sleep by monitoring for large time gaps between checks.
|
|
289
|
+
*/
|
|
290
|
+
startHealthCheck() {
|
|
291
|
+
this.lastHealthCheckTime = Date.now();
|
|
292
|
+
this.healthCheckInterval = setInterval(() => {
|
|
293
|
+
const now = Date.now();
|
|
294
|
+
const elapsed = now - this.lastHealthCheckTime;
|
|
295
|
+
this.lastHealthCheckTime = now;
|
|
296
|
+
// If significantly more time passed than expected, system likely slept
|
|
297
|
+
if (elapsed > SLEEP_DETECTION_THRESHOLD_MS) {
|
|
298
|
+
processManagerLog(`System wake detected (${Math.round(elapsed / 1000)}s gap)`);
|
|
299
|
+
this.handleSystemWake();
|
|
300
|
+
}
|
|
301
|
+
}, HEALTH_CHECK_INTERVAL_MS);
|
|
302
|
+
// Don't prevent process exit
|
|
303
|
+
this.healthCheckInterval.unref();
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Start Transport Process.
|
|
307
|
+
* @returns The port Transport is listening on
|
|
308
|
+
*/
|
|
309
|
+
async startTransportProcess() {
|
|
310
|
+
return new Promise((resolve, reject) => {
|
|
311
|
+
const workerPath = path.resolve(this.getWorkerDir(), 'transport-worker.js');
|
|
312
|
+
const child = fork(workerPath, [], {
|
|
313
|
+
env: {
|
|
314
|
+
...process.env,
|
|
315
|
+
BRV_SESSION_LOG: getSessionLogPath(),
|
|
316
|
+
},
|
|
317
|
+
stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
|
|
318
|
+
});
|
|
319
|
+
this.state.transportProcess = child;
|
|
320
|
+
const timeout = setTimeout(() => {
|
|
321
|
+
cleanup();
|
|
322
|
+
child.kill('SIGKILL');
|
|
323
|
+
reject(createSystemError(`Transport startup timed out after ${this.startupTimeoutMs}ms`, 'Transport startup timeout'));
|
|
324
|
+
}, this.startupTimeoutMs);
|
|
325
|
+
const onMessage = (message) => {
|
|
326
|
+
if (message.type === 'ready') {
|
|
327
|
+
cleanup();
|
|
328
|
+
this.setupTransportCrashRecovery();
|
|
329
|
+
resolve(message.port);
|
|
330
|
+
}
|
|
331
|
+
else if (message.type === 'error') {
|
|
332
|
+
cleanup();
|
|
333
|
+
child.kill('SIGKILL');
|
|
334
|
+
// Pass through user-friendly errors directly
|
|
335
|
+
const isUserFriendly = message.error.startsWith('brv is already running');
|
|
336
|
+
if (isUserFriendly) {
|
|
337
|
+
reject(new Error(message.error));
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
reject(createSystemError(message.error, 'Transport startup error'));
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
};
|
|
344
|
+
const onError = (error) => {
|
|
345
|
+
cleanup();
|
|
346
|
+
reject(createSystemError(error.message, 'Transport process error'));
|
|
347
|
+
};
|
|
348
|
+
const onExit = (code) => {
|
|
349
|
+
cleanup();
|
|
350
|
+
reject(createSystemError(`Transport exited with code ${code}`, 'Transport unexpected exit'));
|
|
351
|
+
};
|
|
352
|
+
const cleanup = () => {
|
|
353
|
+
clearTimeout(timeout);
|
|
354
|
+
child.off('message', onMessage);
|
|
355
|
+
child.off('error', onError);
|
|
356
|
+
child.off('exit', onExit);
|
|
357
|
+
};
|
|
358
|
+
child.on('message', onMessage);
|
|
359
|
+
child.on('error', onError);
|
|
360
|
+
child.on('exit', onExit);
|
|
361
|
+
// Forward stdout/stderr
|
|
362
|
+
child.stdout?.pipe(process.stdout);
|
|
363
|
+
child.stderr?.pipe(process.stderr);
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Stop Agent Process.
|
|
368
|
+
*/
|
|
369
|
+
async stopAgentProcess() {
|
|
370
|
+
const { agentProcess } = this.state;
|
|
371
|
+
if (!agentProcess)
|
|
372
|
+
return;
|
|
373
|
+
return new Promise((resolve) => {
|
|
374
|
+
const cleanup = () => {
|
|
375
|
+
clearTimeout(timeout);
|
|
376
|
+
agentProcess.off('message', onMessage);
|
|
377
|
+
agentProcess.off('exit', onExit);
|
|
378
|
+
};
|
|
379
|
+
const timeout = setTimeout(() => {
|
|
380
|
+
cleanup();
|
|
381
|
+
agentProcess.kill('SIGKILL');
|
|
382
|
+
this.state.agentProcess = undefined;
|
|
383
|
+
resolve();
|
|
384
|
+
}, this.shutdownTimeoutMs);
|
|
385
|
+
const onMessage = (message) => {
|
|
386
|
+
if (message.type === 'stopped') {
|
|
387
|
+
cleanup();
|
|
388
|
+
this.state.agentProcess = undefined;
|
|
389
|
+
resolve();
|
|
390
|
+
}
|
|
391
|
+
};
|
|
392
|
+
const onExit = () => {
|
|
393
|
+
cleanup();
|
|
394
|
+
this.state.agentProcess = undefined;
|
|
395
|
+
resolve();
|
|
396
|
+
};
|
|
397
|
+
agentProcess.on('message', onMessage);
|
|
398
|
+
agentProcess.on('exit', onExit);
|
|
399
|
+
// Send shutdown command
|
|
400
|
+
this.sendToChild(agentProcess, { type: 'shutdown' });
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Stop health check interval.
|
|
405
|
+
*/
|
|
406
|
+
stopHealthCheck() {
|
|
407
|
+
if (this.healthCheckInterval) {
|
|
408
|
+
clearInterval(this.healthCheckInterval);
|
|
409
|
+
this.healthCheckInterval = undefined;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Stop Transport Process.
|
|
414
|
+
*/
|
|
415
|
+
async stopTransportProcess() {
|
|
416
|
+
const { transportProcess } = this.state;
|
|
417
|
+
if (!transportProcess)
|
|
418
|
+
return;
|
|
419
|
+
return new Promise((resolve) => {
|
|
420
|
+
const cleanup = () => {
|
|
421
|
+
clearTimeout(timeout);
|
|
422
|
+
transportProcess.off('message', onMessage);
|
|
423
|
+
transportProcess.off('exit', onExit);
|
|
424
|
+
};
|
|
425
|
+
const timeout = setTimeout(() => {
|
|
426
|
+
cleanup();
|
|
427
|
+
transportProcess.kill('SIGKILL');
|
|
428
|
+
this.state.transportProcess = undefined;
|
|
429
|
+
resolve();
|
|
430
|
+
}, this.shutdownTimeoutMs);
|
|
431
|
+
const onMessage = (message) => {
|
|
432
|
+
if (message.type === 'stopped') {
|
|
433
|
+
cleanup();
|
|
434
|
+
this.state.transportProcess = undefined;
|
|
435
|
+
resolve();
|
|
436
|
+
}
|
|
437
|
+
};
|
|
438
|
+
const onExit = () => {
|
|
439
|
+
cleanup();
|
|
440
|
+
this.state.transportProcess = undefined;
|
|
441
|
+
resolve();
|
|
442
|
+
};
|
|
443
|
+
transportProcess.on('message', onMessage);
|
|
444
|
+
transportProcess.on('exit', onExit);
|
|
445
|
+
// Send shutdown command
|
|
446
|
+
this.sendToChild(transportProcess, { type: 'shutdown' });
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
// ============================================================================
|
|
451
|
+
// Singleton
|
|
452
|
+
// ============================================================================
|
|
453
|
+
let instance;
|
|
454
|
+
/**
|
|
455
|
+
* Get or create the ProcessManager singleton.
|
|
456
|
+
*/
|
|
457
|
+
export function getProcessManager(config) {
|
|
458
|
+
if (!instance) {
|
|
459
|
+
instance = new ProcessManager(config);
|
|
460
|
+
}
|
|
461
|
+
return instance;
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Dispose the ProcessManager singleton.
|
|
465
|
+
*/
|
|
466
|
+
export async function disposeProcessManager() {
|
|
467
|
+
if (instance) {
|
|
468
|
+
await instance.stop();
|
|
469
|
+
instance = undefined;
|
|
470
|
+
}
|
|
471
|
+
}
|