hyacinth-ai 0.9.6
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/LICENSE +21 -0
- package/README.md +205 -0
- package/commands.json +25 -0
- package/dist/agents/builtins.d.ts +8 -0
- package/dist/agents/builtins.js +50 -0
- package/dist/agents/config-loader.d.ts +15 -0
- package/dist/agents/config-loader.js +75 -0
- package/dist/agents/delegate-tool.d.ts +109 -0
- package/dist/agents/delegate-tool.js +407 -0
- package/dist/agents/index.d.ts +5 -0
- package/dist/agents/index.js +5 -0
- package/dist/agents/registry.d.ts +2 -0
- package/dist/agents/registry.js +2 -0
- package/dist/bypass/agents/companion/index.d.ts +57 -0
- package/dist/bypass/agents/companion/index.js +487 -0
- package/dist/bypass/agents/orchestrator/index.d.ts +17 -0
- package/dist/bypass/agents/orchestrator/index.js +414 -0
- package/dist/bypass/agents/orchestrator.d.ts +16 -0
- package/dist/bypass/agents/orchestrator.js +377 -0
- package/dist/bypass/agents/world-engine/agent.d.ts +41 -0
- package/dist/bypass/agents/world-engine/agent.js +385 -0
- package/dist/bypass/agents/world-engine/index.d.ts +52 -0
- package/dist/bypass/agents/world-engine/index.js +198 -0
- package/dist/bypass/agents/world-engine/sim.d.ts +14 -0
- package/dist/bypass/agents/world-engine/sim.js +120 -0
- package/dist/bypass/agents/world-engine/store.d.ts +110 -0
- package/dist/bypass/agents/world-engine/store.js +519 -0
- package/dist/bypass/agents/world-engine/ticker.d.ts +37 -0
- package/dist/bypass/agents/world-engine/ticker.js +214 -0
- package/dist/bypass/agents/world-engine/tools.d.ts +6 -0
- package/dist/bypass/agents/world-engine/tools.js +380 -0
- package/dist/bypass/agents/world-engine/types.d.ts +202 -0
- package/dist/bypass/agents/world-engine/types.js +56 -0
- package/dist/bypass/agents/world-engine.d.ts +20 -0
- package/dist/bypass/agents/world-engine.js +63 -0
- package/dist/bypass/base.d.ts +48 -0
- package/dist/bypass/base.js +126 -0
- package/dist/bypass/index.d.ts +5 -0
- package/dist/bypass/index.js +6 -0
- package/dist/bypass/manager.d.ts +41 -0
- package/dist/bypass/manager.js +179 -0
- package/dist/bypass/types.d.ts +63 -0
- package/dist/bypass/types.js +14 -0
- package/dist/channels/auto-detect.d.ts +25 -0
- package/dist/channels/auto-detect.js +77 -0
- package/dist/channels/builtin/http-webhook.d.ts +25 -0
- package/dist/channels/builtin/http-webhook.js +287 -0
- package/dist/channels/builtin/tui-channel.d.ts +33 -0
- package/dist/channels/builtin/tui-channel.js +61 -0
- package/dist/channels/builtin/tui-ws-session.d.ts +16 -0
- package/dist/channels/builtin/tui-ws-session.js +90 -0
- package/dist/channels/builtin/webui-output-handler.d.ts +30 -0
- package/dist/channels/builtin/webui-output-handler.js +93 -0
- package/dist/channels/index.d.ts +5 -0
- package/dist/channels/index.js +3 -0
- package/dist/channels/interface.d.ts +148 -0
- package/dist/channels/interface.js +15 -0
- package/dist/channels/manager.d.ts +43 -0
- package/dist/channels/manager.js +156 -0
- package/dist/channels/message-queue.d.ts +36 -0
- package/dist/channels/message-queue.js +91 -0
- package/dist/channels/plugins/clawbot/clawbot-auth.d.ts +50 -0
- package/dist/channels/plugins/clawbot/clawbot-auth.js +235 -0
- package/dist/channels/plugins/clawbot/clawbot-channel.d.ts +76 -0
- package/dist/channels/plugins/clawbot/clawbot-channel.js +566 -0
- package/dist/channels/plugins/clawbot/clawbot-client.d.ts +180 -0
- package/dist/channels/plugins/clawbot/clawbot-client.js +312 -0
- package/dist/channels/plugins/clawbot/clawbot-config.d.ts +30 -0
- package/dist/channels/plugins/clawbot/clawbot-config.js +28 -0
- package/dist/channels/plugins/clawbot/clawbot-message-queue.d.ts +27 -0
- package/dist/channels/plugins/clawbot/clawbot-message-queue.js +114 -0
- package/dist/channels/plugins/clawbot/clawbot-session.d.ts +10 -0
- package/dist/channels/plugins/clawbot/clawbot-session.js +26 -0
- package/dist/channels/plugins/clawbot/index.d.ts +17 -0
- package/dist/channels/plugins/clawbot/index.js +58 -0
- package/dist/channels/plugins/feishu/feishu-channel.d.ts +57 -0
- package/dist/channels/plugins/feishu/feishu-channel.js +602 -0
- package/dist/channels/plugins/feishu/feishu-client.d.ts +23 -0
- package/dist/channels/plugins/feishu/feishu-client.js +86 -0
- package/dist/channels/plugins/feishu/feishu-config.d.ts +53 -0
- package/dist/channels/plugins/feishu/feishu-config.js +35 -0
- package/dist/channels/plugins/feishu/feishu-event.d.ts +102 -0
- package/dist/channels/plugins/feishu/feishu-event.js +257 -0
- package/dist/channels/plugins/feishu/feishu-log-suppressor.d.ts +7 -0
- package/dist/channels/plugins/feishu/feishu-log-suppressor.js +34 -0
- package/dist/channels/plugins/feishu/feishu-message-queue.d.ts +27 -0
- package/dist/channels/plugins/feishu/feishu-message-queue.js +112 -0
- package/dist/channels/plugins/feishu/feishu-send.d.ts +44 -0
- package/dist/channels/plugins/feishu/feishu-send.js +232 -0
- package/dist/channels/plugins/feishu/feishu-session.d.ts +44 -0
- package/dist/channels/plugins/feishu/feishu-session.js +84 -0
- package/dist/channels/plugins/feishu/feishu-streaming.d.ts +49 -0
- package/dist/channels/plugins/feishu/feishu-streaming.js +185 -0
- package/dist/channels/plugins/feishu/feishu-transport.d.ts +29 -0
- package/dist/channels/plugins/feishu/feishu-transport.js +99 -0
- package/dist/channels/plugins/feishu/index.d.ts +22 -0
- package/dist/channels/plugins/feishu/index.js +68 -0
- package/dist/cli/doctor.d.ts +20 -0
- package/dist/cli/doctor.js +317 -0
- package/dist/context/cache-strategy.d.ts +76 -0
- package/dist/context/cache-strategy.js +123 -0
- package/dist/context/composer.d.ts +77 -0
- package/dist/context/composer.js +318 -0
- package/dist/context/compressor.d.ts +218 -0
- package/dist/context/compressor.js +909 -0
- package/dist/context/index.d.ts +14 -0
- package/dist/context/index.js +8 -0
- package/dist/context/interface.d.ts +33 -0
- package/dist/context/interface.js +2 -0
- package/dist/context/manifest-defaults.d.ts +51 -0
- package/dist/context/manifest-defaults.js +133 -0
- package/dist/context/manifest-loader.d.ts +16 -0
- package/dist/context/manifest-loader.js +103 -0
- package/dist/context/manifest-types.d.ts +26 -0
- package/dist/context/manifest-types.js +2 -0
- package/dist/context/precision/analyzer.d.ts +31 -0
- package/dist/context/precision/analyzer.js +131 -0
- package/dist/context/precision/companion.d.ts +27 -0
- package/dist/context/precision/companion.js +144 -0
- package/dist/context/precision/default.d.ts +14 -0
- package/dist/context/precision/default.js +17 -0
- package/dist/context/precision/index.d.ts +9 -0
- package/dist/context/precision/index.js +7 -0
- package/dist/context/precision/keyword-pool.d.ts +27 -0
- package/dist/context/precision/keyword-pool.js +66 -0
- package/dist/context/precision/strategy.d.ts +18 -0
- package/dist/context/precision/strategy.js +51 -0
- package/dist/context/precision/summary-store.d.ts +18 -0
- package/dist/context/precision/summary-store.js +67 -0
- package/dist/context/precision/types.d.ts +23 -0
- package/dist/context/precision/types.js +2 -0
- package/dist/context/profiles.d.ts +45 -0
- package/dist/context/profiles.js +92 -0
- package/dist/context/prompt-builder.d.ts +76 -0
- package/dist/context/prompt-builder.js +133 -0
- package/dist/context/retriever.d.ts +44 -0
- package/dist/context/retriever.js +203 -0
- package/dist/context/router.d.ts +122 -0
- package/dist/context/router.js +291 -0
- package/dist/context/section-resolver.d.ts +38 -0
- package/dist/context/section-resolver.js +398 -0
- package/dist/context/tokenizer.d.ts +23 -0
- package/dist/context/tokenizer.js +78 -0
- package/dist/dependency/analyzer.d.ts +33 -0
- package/dist/dependency/analyzer.js +242 -0
- package/dist/dependency/data-flow-tracker.d.ts +12 -0
- package/dist/dependency/data-flow-tracker.js +97 -0
- package/dist/dependency/function-parser.d.ts +34 -0
- package/dist/dependency/function-parser.js +295 -0
- package/dist/dependency/index.d.ts +14 -0
- package/dist/dependency/index.js +20 -0
- package/dist/dependency/parser.d.ts +10 -0
- package/dist/dependency/parser.js +93 -0
- package/dist/dependency/types.d.ts +57 -0
- package/dist/dependency/types.js +2 -0
- package/dist/env/env-collector.d.ts +45 -0
- package/dist/env/env-collector.js +221 -0
- package/dist/env/index.d.ts +3 -0
- package/dist/env/index.js +2 -0
- package/dist/event-store.d.ts +27 -0
- package/dist/event-store.js +71 -0
- package/dist/evolution/git-manager.d.ts +46 -0
- package/dist/evolution/git-manager.js +276 -0
- package/dist/evolution/index.d.ts +3 -0
- package/dist/evolution/index.js +2 -0
- package/dist/flow/bootstrap-flow.d.ts +19 -0
- package/dist/flow/bootstrap-flow.js +72 -0
- package/dist/flow/flow-registry.d.ts +12 -0
- package/dist/flow/flow-registry.js +74 -0
- package/dist/flow/flow-tools.d.ts +8 -0
- package/dist/flow/flow-tools.js +106 -0
- package/dist/flow/index.d.ts +6 -0
- package/dist/flow/index.js +8 -0
- package/dist/flow/todo-flow.d.ts +25 -0
- package/dist/flow/todo-flow.js +107 -0
- package/dist/flow/types.d.ts +78 -0
- package/dist/flow/types.js +12 -0
- package/dist/flows/bootstrap.d.ts +18 -0
- package/dist/flows/bootstrap.js +119 -0
- package/dist/flows/index.d.ts +6 -0
- package/dist/flows/index.js +11 -0
- package/dist/flows/todo.d.ts +26 -0
- package/dist/flows/todo.js +174 -0
- package/dist/flows/tools.d.ts +8 -0
- package/dist/flows/tools.js +119 -0
- package/dist/flows/types.d.ts +27 -0
- package/dist/flows/types.js +10 -0
- package/dist/gateway/cli.d.ts +5 -0
- package/dist/gateway/cli.js +1027 -0
- package/dist/gateway/factory.d.ts +80 -0
- package/dist/gateway/factory.js +832 -0
- package/dist/gateway/guardian.d.ts +8 -0
- package/dist/gateway/guardian.js +30 -0
- package/dist/gateway/index.d.ts +3 -0
- package/dist/gateway/index.js +3 -0
- package/dist/gateway/server.d.ts +17 -0
- package/dist/gateway/server.js +96 -0
- package/dist/gateway/tui.d.ts +16 -0
- package/dist/gateway/tui.js +3273 -0
- package/dist/hot-reload/agent-watcher.d.ts +24 -0
- package/dist/hot-reload/agent-watcher.js +175 -0
- package/dist/hot-reload/bundle-watcher.d.ts +12 -0
- package/dist/hot-reload/bundle-watcher.js +35 -0
- package/dist/hot-reload/channel-watcher.d.ts +19 -0
- package/dist/hot-reload/channel-watcher.js +54 -0
- package/dist/hot-reload/command-watcher.d.ts +14 -0
- package/dist/hot-reload/command-watcher.js +54 -0
- package/dist/hot-reload/config-watcher.d.ts +20 -0
- package/dist/hot-reload/config-watcher.js +58 -0
- package/dist/hot-reload/index.d.ts +12 -0
- package/dist/hot-reload/index.js +12 -0
- package/dist/hot-reload/manager.d.ts +58 -0
- package/dist/hot-reload/manager.js +243 -0
- package/dist/hot-reload/manifest-watcher.d.ts +9 -0
- package/dist/hot-reload/manifest-watcher.js +42 -0
- package/dist/hot-reload/mcp-watcher.d.ts +18 -0
- package/dist/hot-reload/mcp-watcher.js +64 -0
- package/dist/hot-reload/model-catalog-watcher.d.ts +18 -0
- package/dist/hot-reload/model-catalog-watcher.js +62 -0
- package/dist/hot-reload/plugin-watcher.d.ts +20 -0
- package/dist/hot-reload/plugin-watcher.js +56 -0
- package/dist/hot-reload/prompt-watcher.d.ts +6 -0
- package/dist/hot-reload/prompt-watcher.js +38 -0
- package/dist/hot-reload/provider-watcher.d.ts +16 -0
- package/dist/hot-reload/provider-watcher.js +45 -0
- package/dist/hot-reload/skill-watcher.d.ts +19 -0
- package/dist/hot-reload/skill-watcher.js +82 -0
- package/dist/hot-reload/tool-watcher.d.ts +16 -0
- package/dist/hot-reload/tool-watcher.js +168 -0
- package/dist/hot-reload/workflow-watcher.d.ts +19 -0
- package/dist/hot-reload/workflow-watcher.js +84 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +6 -0
- package/dist/knowledge/fts5-retriever.d.ts +30 -0
- package/dist/knowledge/fts5-retriever.js +223 -0
- package/dist/knowledge/index.d.ts +11 -0
- package/dist/knowledge/index.js +14 -0
- package/dist/knowledge/indexer.d.ts +41 -0
- package/dist/knowledge/indexer.js +186 -0
- package/dist/knowledge/query-preprocessor.d.ts +13 -0
- package/dist/knowledge/query-preprocessor.js +63 -0
- package/dist/knowledge/retriever.d.ts +45 -0
- package/dist/knowledge/retriever.js +9 -0
- package/dist/knowledge/store.d.ts +27 -0
- package/dist/knowledge/store.js +61 -0
- package/dist/knowledge/structured-store.d.ts +78 -0
- package/dist/knowledge/structured-store.js +280 -0
- package/dist/knowledge/structured-tools.d.ts +12 -0
- package/dist/knowledge/structured-tools.js +151 -0
- package/dist/knowledge/tools.d.ts +20 -0
- package/dist/knowledge/tools.js +238 -0
- package/dist/knowledge/watcher.d.ts +28 -0
- package/dist/knowledge/watcher.js +113 -0
- package/dist/lifecycle/index.d.ts +12 -0
- package/dist/lifecycle/index.js +14 -0
- package/dist/lifecycle/interface.d.ts +94 -0
- package/dist/lifecycle/interface.js +2 -0
- package/dist/lifecycle/local-model.d.ts +62 -0
- package/dist/lifecycle/local-model.js +331 -0
- package/dist/lifecycle/manager.d.ts +70 -0
- package/dist/lifecycle/manager.js +374 -0
- package/dist/lifecycle/supervisor.d.ts +89 -0
- package/dist/lifecycle/supervisor.js +277 -0
- package/dist/lifecycle-integration-test.d.ts +2 -0
- package/dist/lifecycle-integration-test.js +72 -0
- package/dist/local-model/download-manager.d.ts +59 -0
- package/dist/local-model/download-manager.js +517 -0
- package/dist/local-model/index.d.ts +109 -0
- package/dist/local-model/index.js +233 -0
- package/dist/local-model/llamacpp-provider.d.ts +95 -0
- package/dist/local-model/llamacpp-provider.js +379 -0
- package/dist/local-model/model-bridge.d.ts +48 -0
- package/dist/local-model/model-bridge.js +256 -0
- package/dist/local-model/model-registry.d.ts +47 -0
- package/dist/local-model/model-registry.js +188 -0
- package/dist/local-model/types.d.ts +49 -0
- package/dist/local-model/types.js +2 -0
- package/dist/logging/index.d.ts +3 -0
- package/dist/logging/index.js +3 -0
- package/dist/logging/logger.d.ts +56 -0
- package/dist/logging/logger.js +94 -0
- package/dist/machine/flows/bootstrap.d.ts +18 -0
- package/dist/machine/flows/bootstrap.js +119 -0
- package/dist/machine/flows/index.d.ts +6 -0
- package/dist/machine/flows/index.js +11 -0
- package/dist/machine/flows/spec.d.ts +17 -0
- package/dist/machine/flows/spec.js +176 -0
- package/dist/machine/flows/todo.d.ts +26 -0
- package/dist/machine/flows/todo.js +175 -0
- package/dist/machine/flows/tools.d.ts +8 -0
- package/dist/machine/flows/tools.js +119 -0
- package/dist/machine/flows/types.d.ts +33 -0
- package/dist/machine/flows/types.js +10 -0
- package/dist/machine/index.d.ts +8 -0
- package/dist/machine/index.js +9 -0
- package/dist/machine/registry.d.ts +34 -0
- package/dist/machine/registry.js +98 -0
- package/dist/machine/runner.d.ts +41 -0
- package/dist/machine/runner.js +177 -0
- package/dist/machine/types.d.ts +121 -0
- package/dist/machine/types.js +9 -0
- package/dist/mcp/bridge.d.ts +33 -0
- package/dist/mcp/bridge.js +99 -0
- package/dist/mcp/client.d.ts +37 -0
- package/dist/mcp/client.js +161 -0
- package/dist/mcp/config.d.ts +15 -0
- package/dist/mcp/config.js +85 -0
- package/dist/mcp/index.d.ts +7 -0
- package/dist/mcp/index.js +7 -0
- package/dist/mcp/install-manager.d.ts +31 -0
- package/dist/mcp/install-manager.js +158 -0
- package/dist/mcp/lifecycle.d.ts +41 -0
- package/dist/mcp/lifecycle.js +175 -0
- package/dist/mcp/process-transport.d.ts +21 -0
- package/dist/mcp/process-transport.js +59 -0
- package/dist/mcp/side-effect.d.ts +5 -0
- package/dist/mcp/side-effect.js +21 -0
- package/dist/mcp/system.d.ts +95 -0
- package/dist/mcp/system.js +279 -0
- package/dist/memory/companion-session.d.ts +22 -0
- package/dist/memory/companion-session.js +77 -0
- package/dist/memory/compression-boundary.d.ts +20 -0
- package/dist/memory/compression-boundary.js +40 -0
- package/dist/memory/conversation.d.ts +34 -0
- package/dist/memory/conversation.js +107 -0
- package/dist/memory/events.d.ts +42 -0
- package/dist/memory/events.js +56 -0
- package/dist/memory/index.d.ts +7 -0
- package/dist/memory/index.js +6 -0
- package/dist/memory/memory-store.d.ts +11 -0
- package/dist/memory/memory-store.js +51 -0
- package/dist/memory/session-allowlist.d.ts +11 -0
- package/dist/memory/session-allowlist.js +50 -0
- package/dist/memory/session.d.ts +48 -0
- package/dist/memory/session.js +275 -0
- package/dist/memory/stats.d.ts +23 -0
- package/dist/memory/stats.js +59 -0
- package/dist/memory/summary.d.ts +7 -0
- package/dist/memory/summary.js +23 -0
- package/dist/multimodal/index.d.ts +66 -0
- package/dist/multimodal/index.js +210 -0
- package/dist/orchestrator/index.d.ts +5 -0
- package/dist/orchestrator/index.js +4 -0
- package/dist/orchestrator/loop.d.ts +331 -0
- package/dist/orchestrator/loop.js +2443 -0
- package/dist/orchestrator/plan-store.d.ts +81 -0
- package/dist/orchestrator/plan-store.js +167 -0
- package/dist/orchestrator/planner.d.ts +20 -0
- package/dist/orchestrator/planner.js +34 -0
- package/dist/parser/index.d.ts +2 -0
- package/dist/parser/index.js +2 -0
- package/dist/parser/router.d.ts +30 -0
- package/dist/parser/router.js +61 -0
- package/dist/plugins/api.d.ts +39 -0
- package/dist/plugins/api.js +85 -0
- package/dist/plugins/define.d.ts +27 -0
- package/dist/plugins/define.js +32 -0
- package/dist/plugins/index.d.ts +9 -0
- package/dist/plugins/index.js +5 -0
- package/dist/plugins/loader.d.ts +39 -0
- package/dist/plugins/loader.js +128 -0
- package/dist/plugins/manager.d.ts +61 -0
- package/dist/plugins/manager.js +257 -0
- package/dist/plugins/types.d.ts +82 -0
- package/dist/plugins/types.js +2 -0
- package/dist/prompts/agents/code-reviewer.md +16 -0
- package/dist/prompts/agents/security-auditor.md +17 -0
- package/dist/prompts/agents/test-writer.md +15 -0
- package/dist/prompts/attention/attention.md +12 -0
- package/dist/prompts/environment/environment.md +18 -0
- package/dist/prompts/environment/feishu.md +107 -0
- package/dist/prompts/flows/bootstrap-confirm.md +14 -0
- package/dist/prompts/flows/bootstrap-identity.md +11 -0
- package/dist/prompts/flows/bootstrap-soul.md +19 -0
- package/dist/prompts/flows/bootstrap-user.md +11 -0
- package/dist/prompts/flows/spec-checklist.md +27 -0
- package/dist/prompts/flows/spec-define.md +64 -0
- package/dist/prompts/flows/spec-executing-checklist.md +15 -0
- package/dist/prompts/flows/spec-executing-tasks.md +15 -0
- package/dist/prompts/flows/spec-spec.md +51 -0
- package/dist/prompts/flows/spec-tasks.md +32 -0
- package/dist/prompts/flows/todo-execution.md +7 -0
- package/dist/prompts/flows/todo-planning.md +18 -0
- package/dist/prompts/framework/architecture.md +131 -0
- package/dist/prompts/identity/identity.md +2 -0
- package/dist/prompts/loader.d.ts +24 -0
- package/dist/prompts/loader.js +102 -0
- package/dist/prompts/loader.ts +119 -0
- package/dist/prompts/orchestration/summary.md +14 -0
- package/dist/prompts/persona/BOOTSTRAP.md +5 -0
- package/dist/prompts/persona/IDENTITY.md +16 -0
- package/dist/prompts/persona/PartnerMemory.md +5 -0
- package/dist/prompts/persona/PartnerSoul.md +7 -0
- package/dist/prompts/persona/SOUL.md +30 -0
- package/dist/prompts/persona/USER.md +16 -0
- package/dist/prompts/precise/analyze.md +23 -0
- package/dist/prompts/precise/persona.md +18 -0
- package/dist/prompts/safety/coding-standards.md +5 -0
- package/dist/prompts/safety/safety.md +4 -0
- package/dist/prompts/skills/code-review.md +4 -0
- package/dist/prompts/skills/debug.md +7 -0
- package/dist/prompts/skills/framework-reference.md +131 -0
- package/dist/prompts/skills/refactor.md +6 -0
- package/dist/prompts/summary.md +22 -0
- package/dist/prompts/tools/framework-capabilities.md +241 -0
- package/dist/prompts/tools/tool-rules.md +15 -0
- package/dist/provider/anthropic.d.ts +62 -0
- package/dist/provider/anthropic.js +361 -0
- package/dist/provider/catalog.d.ts +58 -0
- package/dist/provider/catalog.js +97 -0
- package/dist/provider/compatible.d.ts +89 -0
- package/dist/provider/compatible.js +328 -0
- package/dist/provider/config.d.ts +23 -0
- package/dist/provider/config.js +158 -0
- package/dist/provider/deepseek.d.ts +25 -0
- package/dist/provider/deepseek.js +37 -0
- package/dist/provider/fallback.d.ts +51 -0
- package/dist/provider/fallback.js +113 -0
- package/dist/provider/gemini.d.ts +27 -0
- package/dist/provider/gemini.js +170 -0
- package/dist/provider/index.d.ts +36 -0
- package/dist/provider/index.js +42 -0
- package/dist/provider/interface.d.ts +62 -0
- package/dist/provider/interface.js +2 -0
- package/dist/provider/local-config.d.ts +37 -0
- package/dist/provider/local-config.js +146 -0
- package/dist/provider/local.d.ts +45 -0
- package/dist/provider/local.js +248 -0
- package/dist/provider/manager.d.ts +67 -0
- package/dist/provider/manager.js +355 -0
- package/dist/provider/mimo.d.ts +19 -0
- package/dist/provider/mimo.js +30 -0
- package/dist/provider/minimax.d.ts +22 -0
- package/dist/provider/minimax.js +33 -0
- package/dist/provider/model-catalog-loader.d.ts +42 -0
- package/dist/provider/model-catalog-loader.js +89 -0
- package/dist/provider/model-channel-registry.d.ts +130 -0
- package/dist/provider/model-channel-registry.js +488 -0
- package/dist/provider/model-router.d.ts +60 -0
- package/dist/provider/model-router.js +87 -0
- package/dist/provider/openai.d.ts +54 -0
- package/dist/provider/openai.js +274 -0
- package/dist/provider/qwen.d.ts +19 -0
- package/dist/provider/qwen.js +30 -0
- package/dist/provider/resilient.d.ts +46 -0
- package/dist/provider/resilient.js +181 -0
- package/dist/provider/retry.d.ts +16 -0
- package/dist/provider/retry.js +78 -0
- package/dist/provider/router.d.ts +68 -0
- package/dist/provider/router.js +145 -0
- package/dist/provider/tool-args-recovery.d.ts +36 -0
- package/dist/provider/tool-args-recovery.js +91 -0
- package/dist/provider/user-id.d.ts +13 -0
- package/dist/provider/user-id.js +53 -0
- package/dist/provider/zhipu.d.ts +19 -0
- package/dist/provider/zhipu.js +32 -0
- package/dist/registry/agent.registry.d.ts +57 -0
- package/dist/registry/agent.registry.js +224 -0
- package/dist/registry/base.d.ts +54 -0
- package/dist/registry/base.js +99 -0
- package/dist/registry/channel.registry.d.ts +53 -0
- package/dist/registry/channel.registry.js +87 -0
- package/dist/registry/index.d.ts +9 -0
- package/dist/registry/index.js +10 -0
- package/dist/registry/mcp.registry.d.ts +2 -0
- package/dist/registry/mcp.registry.js +2 -0
- package/dist/registry/plugin.registry.d.ts +33 -0
- package/dist/registry/plugin.registry.js +66 -0
- package/dist/registry/provider.registry.d.ts +51 -0
- package/dist/registry/provider.registry.js +104 -0
- package/dist/registry/skill.registry.d.ts +33 -0
- package/dist/registry/skill.registry.js +95 -0
- package/dist/registry/tool.registry.d.ts +68 -0
- package/dist/registry/tool.registry.js +185 -0
- package/dist/repair/loop-guard.d.ts +98 -0
- package/dist/repair/loop-guard.js +217 -0
- package/dist/repair/scavenge.d.ts +19 -0
- package/dist/repair/scavenge.js +81 -0
- package/dist/repair/storm.d.ts +7 -0
- package/dist/repair/storm.js +7 -0
- package/dist/rollback/index.d.ts +5 -0
- package/dist/rollback/index.js +4 -0
- package/dist/rollback/rollback-tool.d.ts +13 -0
- package/dist/rollback/rollback-tool.js +167 -0
- package/dist/rollback/turn-recorder.d.ts +37 -0
- package/dist/rollback/turn-recorder.js +183 -0
- package/dist/rollback/turn-store.d.ts +29 -0
- package/dist/rollback/turn-store.js +114 -0
- package/dist/rollback/types.d.ts +51 -0
- package/dist/rollback/types.js +9 -0
- package/dist/runtime/config-center.d.ts +92 -0
- package/dist/runtime/config-center.js +467 -0
- package/dist/runtime/config-schema.d.ts +201 -0
- package/dist/runtime/config-schema.js +2 -0
- package/dist/runtime/defaults.d.ts +3 -0
- package/dist/runtime/defaults.js +146 -0
- package/dist/schedule/cron.d.ts +24 -0
- package/dist/schedule/cron.js +145 -0
- package/dist/schedule/index.d.ts +6 -0
- package/dist/schedule/index.js +4 -0
- package/dist/schedule/persistence.d.ts +33 -0
- package/dist/schedule/persistence.js +106 -0
- package/dist/schedule/scheduler.d.ts +85 -0
- package/dist/schedule/scheduler.js +630 -0
- package/dist/schedule/types.d.ts +185 -0
- package/dist/schedule/types.js +2 -0
- package/dist/setup/config.d.ts +189 -0
- package/dist/setup/config.js +253 -0
- package/dist/setup/index.d.ts +3 -0
- package/dist/setup/index.js +3 -0
- package/dist/setup/model-defaults.d.ts +13 -0
- package/dist/setup/model-defaults.js +87 -0
- package/dist/setup/persona-bootstrap.d.ts +42 -0
- package/dist/setup/persona-bootstrap.js +379 -0
- package/dist/setup/wizard.d.ts +32 -0
- package/dist/setup/wizard.js +384 -0
- package/dist/skills/index.d.ts +4 -0
- package/dist/skills/index.js +4 -0
- package/dist/skills/loader.d.ts +12 -0
- package/dist/skills/loader.js +83 -0
- package/dist/skills/registry.d.ts +2 -0
- package/dist/skills/registry.js +2 -0
- package/dist/skills/skill-tool.d.ts +20 -0
- package/dist/skills/skill-tool.js +49 -0
- package/dist/tools/archive.d.ts +17 -0
- package/dist/tools/archive.js +131 -0
- package/dist/tools/ask-user.d.ts +9 -0
- package/dist/tools/ask-user.js +62 -0
- package/dist/tools/background-registry.d.ts +45 -0
- package/dist/tools/background-registry.js +164 -0
- package/dist/tools/bash.d.ts +56 -0
- package/dist/tools/bash.js +391 -0
- package/dist/tools/bundle-registry.d.ts +42 -0
- package/dist/tools/bundle-registry.js +239 -0
- package/dist/tools/bundle-tools.d.ts +11 -0
- package/dist/tools/bundle-tools.js +168 -0
- package/dist/tools/channel-info.d.ts +5 -0
- package/dist/tools/channel-info.js +38 -0
- package/dist/tools/compression.d.ts +7 -0
- package/dist/tools/compression.js +21 -0
- package/dist/tools/config.d.ts +23 -0
- package/dist/tools/config.js +255 -0
- package/dist/tools/db-query.d.ts +12 -0
- package/dist/tools/db-query.js +107 -0
- package/dist/tools/diagnostics.d.ts +30 -0
- package/dist/tools/diagnostics.js +111 -0
- package/dist/tools/diff-channel.d.ts +9 -0
- package/dist/tools/diff-channel.js +17 -0
- package/dist/tools/diff-files.d.ts +17 -0
- package/dist/tools/diff-files.js +88 -0
- package/dist/tools/disk-usage.d.ts +34 -0
- package/dist/tools/disk-usage.js +258 -0
- package/dist/tools/edit.d.ts +30 -0
- package/dist/tools/edit.js +235 -0
- package/dist/tools/executor.d.ts +32 -0
- package/dist/tools/executor.js +66 -0
- package/dist/tools/file-tracker.d.ts +20 -0
- package/dist/tools/file-tracker.js +44 -0
- package/dist/tools/filtered-registry.d.ts +29 -0
- package/dist/tools/filtered-registry.js +50 -0
- package/dist/tools/flow.d.ts +10 -0
- package/dist/tools/flow.js +180 -0
- package/dist/tools/git-tool.d.ts +24 -0
- package/dist/tools/git-tool.js +113 -0
- package/dist/tools/glob.d.ts +29 -0
- package/dist/tools/glob.js +152 -0
- package/dist/tools/grep.d.ts +14 -0
- package/dist/tools/grep.js +325 -0
- package/dist/tools/http-request.d.ts +14 -0
- package/dist/tools/http-request.js +126 -0
- package/dist/tools/index.d.ts +43 -0
- package/dist/tools/index.js +76 -0
- package/dist/tools/injection-filter.d.ts +6 -0
- package/dist/tools/injection-filter.js +71 -0
- package/dist/tools/insert.d.ts +13 -0
- package/dist/tools/insert.js +61 -0
- package/dist/tools/interface.d.ts +30 -0
- package/dist/tools/interface.js +2 -0
- package/dist/tools/json-edit.d.ts +15 -0
- package/dist/tools/json-edit.js +122 -0
- package/dist/tools/multi-edit.d.ts +9 -0
- package/dist/tools/multi-edit.js +146 -0
- package/dist/tools/path-sandbox.d.ts +14 -0
- package/dist/tools/path-sandbox.js +60 -0
- package/dist/tools/process-tools.d.ts +15 -0
- package/dist/tools/process-tools.js +95 -0
- package/dist/tools/python-bridge/bridge.d.ts +24 -0
- package/dist/tools/python-bridge/bridge.js +39 -0
- package/dist/tools/python-bridge/executor.d.ts +6 -0
- package/dist/tools/python-bridge/executor.js +69 -0
- package/dist/tools/python-bridge/index.d.ts +5 -0
- package/dist/tools/python-bridge/index.js +4 -0
- package/dist/tools/python-bridge/parser.d.ts +21 -0
- package/dist/tools/python-bridge/parser.js +258 -0
- package/dist/tools/read.d.ts +16 -0
- package/dist/tools/read.js +276 -0
- package/dist/tools/registry.d.ts +2 -0
- package/dist/tools/registry.js +2 -0
- package/dist/tools/restart.d.ts +10 -0
- package/dist/tools/restart.js +46 -0
- package/dist/tools/result-buffer.d.ts +66 -0
- package/dist/tools/result-buffer.js +146 -0
- package/dist/tools/runtime-control.d.ts +163 -0
- package/dist/tools/runtime-control.js +1780 -0
- package/dist/tools/symbol-references.d.ts +5 -0
- package/dist/tools/symbol-references.js +331 -0
- package/dist/tools/system-info.d.ts +3 -0
- package/dist/tools/system-info.js +55 -0
- package/dist/tools/write.d.ts +18 -0
- package/dist/tools/write.js +118 -0
- package/dist/tools/xref/index.d.ts +25 -0
- package/dist/tools/xref/index.js +25 -0
- package/dist/tools/xref/manager.d.ts +85 -0
- package/dist/tools/xref/manager.js +948 -0
- package/dist/tools/xref/parser.d.ts +34 -0
- package/dist/tools/xref/parser.js +64 -0
- package/dist/tools/xref/regex-parser.d.ts +26 -0
- package/dist/tools/xref/regex-parser.js +446 -0
- package/dist/tools/xref/schema.d.ts +104 -0
- package/dist/tools/xref/schema.js +68 -0
- package/dist/tools/xref/ts-parser.d.ts +20 -0
- package/dist/tools/xref/ts-parser.js +403 -0
- package/dist/tools/xref/xref-build.d.ts +20 -0
- package/dist/tools/xref/xref-build.js +128 -0
- package/dist/tools/xref/xref-graph.d.ts +24 -0
- package/dist/tools/xref/xref-graph.js +88 -0
- package/dist/tools/xref/xref-query.d.ts +30 -0
- package/dist/tools/xref/xref-query.js +123 -0
- package/dist/types.d.ts +217 -0
- package/dist/types.js +2 -0
- package/dist/ui/assistant-message.d.ts +7 -0
- package/dist/ui/assistant-message.js +18 -0
- package/dist/ui/chat-log.d.ts +52 -0
- package/dist/ui/chat-log.js +246 -0
- package/dist/ui/command-registry.d.ts +73 -0
- package/dist/ui/command-registry.js +838 -0
- package/dist/ui/diff-component.d.ts +14 -0
- package/dist/ui/diff-component.js +42 -0
- package/dist/ui/hyperlink-markdown.d.ts +10 -0
- package/dist/ui/hyperlink-markdown.js +21 -0
- package/dist/ui/markdown-message.d.ts +10 -0
- package/dist/ui/markdown-message.js +16 -0
- package/dist/ui/osc8-hyperlinks.d.ts +4 -0
- package/dist/ui/osc8-hyperlinks.js +142 -0
- package/dist/ui/pi-tui-editor.d.ts +35 -0
- package/dist/ui/pi-tui-editor.js +79 -0
- package/dist/ui/slash-commands.d.ts +16 -0
- package/dist/ui/slash-commands.js +29 -0
- package/dist/ui/slash-panel.d.ts +54 -0
- package/dist/ui/slash-panel.js +199 -0
- package/dist/ui/theme.d.ts +120 -0
- package/dist/ui/theme.js +154 -0
- package/dist/ui/tool-display.d.ts +13 -0
- package/dist/ui/tool-display.js +85 -0
- package/dist/ui/tool-execution.d.ts +22 -0
- package/dist/ui/tool-execution.js +87 -0
- package/dist/ui/tui-formatters.d.ts +2 -0
- package/dist/ui/tui-formatters.js +145 -0
- package/dist/ui/user-message.d.ts +5 -0
- package/dist/ui/user-message.js +11 -0
- package/dist/update/check.d.ts +8 -0
- package/dist/update/check.js +28 -0
- package/dist/update/config.d.ts +6 -0
- package/dist/update/config.js +18 -0
- package/dist/update/download.d.ts +3 -0
- package/dist/update/download.js +27 -0
- package/dist/update/index.d.ts +6 -0
- package/dist/update/index.js +5 -0
- package/dist/update/install.d.ts +3 -0
- package/dist/update/install.js +33 -0
- package/dist/update/types.d.ts +16 -0
- package/dist/update/types.js +2 -0
- package/dist/utils/diff.d.ts +9 -0
- package/dist/utils/diff.js +45 -0
- package/dist/utils/misc.d.ts +12 -0
- package/dist/utils/misc.js +34 -0
- package/dist/world-engine/agent.d.ts +41 -0
- package/dist/world-engine/agent.js +385 -0
- package/dist/world-engine/index.d.ts +45 -0
- package/dist/world-engine/index.js +160 -0
- package/dist/world-engine/sim.d.ts +14 -0
- package/dist/world-engine/sim.js +120 -0
- package/dist/world-engine/store.d.ts +110 -0
- package/dist/world-engine/store.js +519 -0
- package/dist/world-engine/ticker.d.ts +37 -0
- package/dist/world-engine/ticker.js +214 -0
- package/dist/world-engine/tools.d.ts +6 -0
- package/dist/world-engine/tools.js +380 -0
- package/dist/world-engine/types.d.ts +202 -0
- package/dist/world-engine/types.js +56 -0
- package/docs/api.md +180 -0
- package/docs/architecture.md +206 -0
- package/docs/diagnostics/2026-06-08-config-prompt-guidance.md +67 -0
- package/docs/superpowers/plans/2026-06-08-global-bootstrap-mode.md +89 -0
- package/docs/superpowers/specs/2026-06-08-global-bootstrap-mode-design.md +174 -0
- package/docs/user-guide.md +226 -0
- package/package.json +63 -0
- package/plugins/example-greeter/index.js +55 -0
- package/plugins/example-greeter/plugin.json +8 -0
- package/pnpm-workspace.yaml +5 -0
- package/provider_arch.md +179 -0
- package/start-webui.sh +27 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/webui-channel-design.md +789 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { FullConfig } from './config-schema.js';
|
|
2
|
+
import type { ConfigManager } from '../setup/config.js';
|
|
3
|
+
export interface ConfigChangeEvent {
|
|
4
|
+
path: string;
|
|
5
|
+
oldValue: unknown;
|
|
6
|
+
newValue: unknown;
|
|
7
|
+
timestamp: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class RuntimeConfigCenter {
|
|
10
|
+
private static instance;
|
|
11
|
+
/** Default configuration provided at initialization time (immutable snapshot). */
|
|
12
|
+
private defaults;
|
|
13
|
+
/** Base defaults — the complete schema defaults, preserved for reload merging. */
|
|
14
|
+
private baseDefaults;
|
|
15
|
+
/** Runtime overrides keyed by dot-path segments (nested object). */
|
|
16
|
+
private runtime;
|
|
17
|
+
/** Persistence back-end. */
|
|
18
|
+
private configManager;
|
|
19
|
+
/** Node.js event emitter used as the pub/sub transport. */
|
|
20
|
+
private emitter;
|
|
21
|
+
/** Guards against use-before-initialize. */
|
|
22
|
+
private initialized;
|
|
23
|
+
private constructor();
|
|
24
|
+
static getInstance(): RuntimeConfigCenter;
|
|
25
|
+
/**
|
|
26
|
+
* Initialise the config centre with default values and a persistence layer.
|
|
27
|
+
* Must be called once before any other methods are used.
|
|
28
|
+
* Calling it again resets all runtime overrides.
|
|
29
|
+
*/
|
|
30
|
+
initialize(defaults: FullConfig, configManager: ConfigManager): void;
|
|
31
|
+
/**
|
|
32
|
+
* Read a single config value by dot-path.
|
|
33
|
+
* Returns `undefined` for unknown paths (does not throw).
|
|
34
|
+
* Runtime overrides take precedence over defaults.
|
|
35
|
+
*/
|
|
36
|
+
get<T = unknown>(path: string): T;
|
|
37
|
+
/**
|
|
38
|
+
* Return the complete effective configuration by deep-merging
|
|
39
|
+
* runtime overrides into the default configuration.
|
|
40
|
+
* The returned object is a fresh clone -- mutations will not affect the centre.
|
|
41
|
+
*/
|
|
42
|
+
getAll(): FullConfig;
|
|
43
|
+
/**
|
|
44
|
+
* Set a single config value at the given dot-path.
|
|
45
|
+
* Throws if the path does not structurally exist in the defaults schema.
|
|
46
|
+
* Triggers change events for the exact path and all parent wildcard paths.
|
|
47
|
+
*/
|
|
48
|
+
set(path: string, value: unknown): void;
|
|
49
|
+
/**
|
|
50
|
+
* Deep-merge a partial config into the runtime overrides.
|
|
51
|
+
* Fires change events for every path that actually changed.
|
|
52
|
+
*/
|
|
53
|
+
merge(partial: Partial<FullConfig>): void;
|
|
54
|
+
/**
|
|
55
|
+
* Reset runtime overrides.
|
|
56
|
+
* - No argument : reset everything back to defaults.
|
|
57
|
+
* - With a path : reset only that subtree.
|
|
58
|
+
* Fires change events for every value that reverts.
|
|
59
|
+
*/
|
|
60
|
+
reset(path?: string): void;
|
|
61
|
+
/**
|
|
62
|
+
* Subscribe to config changes matching a pattern.
|
|
63
|
+
*
|
|
64
|
+
* The `pattern` supports wildcards:
|
|
65
|
+
* - `"provider.*"` matches `"provider.active"`, `"provider.anthropic.model"`, etc.
|
|
66
|
+
* - `"*"` matches every path.
|
|
67
|
+
*
|
|
68
|
+
* Each callback is wrapped in a try-catch so that one failing subscriber
|
|
69
|
+
* does not prevent others from receiving the event.
|
|
70
|
+
*
|
|
71
|
+
* @returns An unsubscribe function; call it to stop receiving events.
|
|
72
|
+
*/
|
|
73
|
+
watch(pattern: string, callback: (event: ConfigChangeEvent) => void): () => void;
|
|
74
|
+
/** 是否正在保存配置(用于 config-watcher 跳过自身 save 触发的文件变更) */
|
|
75
|
+
isSaving: boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Persist the current effective configuration via the ConfigManager.
|
|
78
|
+
*/
|
|
79
|
+
save(): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Reload configuration from the ConfigManager, diff against the previously-
|
|
82
|
+
* effective config, and fire change events for every path that differs.
|
|
83
|
+
*/
|
|
84
|
+
load(): Promise<void>;
|
|
85
|
+
/** Throw a descriptive error if the centre has not been initialised yet. */
|
|
86
|
+
private ensureInitialized;
|
|
87
|
+
/**
|
|
88
|
+
* Compare two config snapshots and emit change events for every leaf that differs.
|
|
89
|
+
*/
|
|
90
|
+
private fireDiffs;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=config-center.d.ts.map
|
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
import EventEmitter from 'node:events';
|
|
2
|
+
// ============================================================
|
|
3
|
+
// Internal helpers
|
|
4
|
+
// ============================================================
|
|
5
|
+
/**
|
|
6
|
+
* Read a value from a nested object using dot-path notation.
|
|
7
|
+
* Returns `undefined` if the path does not exist.
|
|
8
|
+
*/
|
|
9
|
+
function getByPath(obj, path) {
|
|
10
|
+
if (!path)
|
|
11
|
+
return obj;
|
|
12
|
+
const parts = path.split('.');
|
|
13
|
+
let current = obj;
|
|
14
|
+
for (const part of parts) {
|
|
15
|
+
if (current === null || current === undefined || typeof current !== 'object') {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
current = current[part];
|
|
19
|
+
}
|
|
20
|
+
return current;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Write a value into a nested object using dot-path notation.
|
|
24
|
+
* Creates intermediate objects as needed.
|
|
25
|
+
*/
|
|
26
|
+
function setByPath(obj, path, value) {
|
|
27
|
+
const parts = path.split('.');
|
|
28
|
+
let current = obj;
|
|
29
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
30
|
+
const part = parts[i];
|
|
31
|
+
let next = current[part];
|
|
32
|
+
if (next === null || next === undefined || typeof next !== 'object' || Array.isArray(next)) {
|
|
33
|
+
next = {};
|
|
34
|
+
current[part] = next;
|
|
35
|
+
}
|
|
36
|
+
current = next;
|
|
37
|
+
}
|
|
38
|
+
current[parts[parts.length - 1]] = value;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Check whether a dot-path is structurally valid against the defaults schema.
|
|
42
|
+
* Every ancestor segment must exist and be an object.
|
|
43
|
+
* The final leaf is always allowed (to support Record<>-style dynamic keys).
|
|
44
|
+
*/
|
|
45
|
+
function hasPath(obj, path) {
|
|
46
|
+
if (!path)
|
|
47
|
+
return true;
|
|
48
|
+
const parts = path.split('.');
|
|
49
|
+
let current = obj;
|
|
50
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
51
|
+
if (current === null || current === undefined || typeof current !== 'object') {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
const cur = current;
|
|
55
|
+
if (!(parts[i] in cur)) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
current = cur[parts[i]];
|
|
59
|
+
}
|
|
60
|
+
// The parent of the final segment must exist and be an object (not array / primitive).
|
|
61
|
+
return current !== null && typeof current === 'object' && !Array.isArray(current);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Delete a value from a nested object by dot-path.
|
|
65
|
+
* Cleans up empty ancestor objects afterward.
|
|
66
|
+
*/
|
|
67
|
+
function deleteByPath(obj, path) {
|
|
68
|
+
const parts = path.split('.');
|
|
69
|
+
// Walk to the second-to-last node, tracking the stack for cleanup.
|
|
70
|
+
const stack = [];
|
|
71
|
+
let current = obj;
|
|
72
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
73
|
+
if (current === null || typeof current !== 'object') {
|
|
74
|
+
return; // path doesn't exist, nothing to delete
|
|
75
|
+
}
|
|
76
|
+
const container = current;
|
|
77
|
+
if (!(parts[i] in container)) {
|
|
78
|
+
return; // path doesn't exist
|
|
79
|
+
}
|
|
80
|
+
stack.push({ container, key: parts[i] });
|
|
81
|
+
current = container[parts[i]];
|
|
82
|
+
}
|
|
83
|
+
if (current === null || typeof current !== 'object') {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
delete current[parts[parts.length - 1]];
|
|
87
|
+
// Walk back up and prune empty objects.
|
|
88
|
+
for (let i = stack.length - 1; i >= 0; i--) {
|
|
89
|
+
const { container, key } = stack[i];
|
|
90
|
+
const child = container[key];
|
|
91
|
+
if (child !== undefined &&
|
|
92
|
+
typeof child === 'object' &&
|
|
93
|
+
!Array.isArray(child) &&
|
|
94
|
+
Object.keys(child).length === 0) {
|
|
95
|
+
delete container[key];
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Generate parent wildcard paths for event bubbling.
|
|
104
|
+
* "provider.active.model" --> ["provider.active.*", "provider.*", "*"]
|
|
105
|
+
*/
|
|
106
|
+
function generateParentWildcardPaths(path) {
|
|
107
|
+
const parts = path.split('.');
|
|
108
|
+
const paths = [];
|
|
109
|
+
for (let i = parts.length - 1; i >= 0; i--) {
|
|
110
|
+
paths.push([...parts.slice(0, i), '*'].join('.'));
|
|
111
|
+
}
|
|
112
|
+
return paths;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Deep-merge `source` into `target`. Returns a new object.
|
|
116
|
+
* - Nested plain objects are merged recursively.
|
|
117
|
+
* - Arrays and primitives are replaced (source wins).
|
|
118
|
+
*/
|
|
119
|
+
function deepMerge(target, source) {
|
|
120
|
+
const result = { ...target };
|
|
121
|
+
for (const key of Object.keys(source)) {
|
|
122
|
+
const sourceVal = source[key];
|
|
123
|
+
const targetVal = result[key];
|
|
124
|
+
if (sourceVal !== null &&
|
|
125
|
+
typeof sourceVal === 'object' &&
|
|
126
|
+
!Array.isArray(sourceVal) &&
|
|
127
|
+
targetVal !== null &&
|
|
128
|
+
typeof targetVal === 'object' &&
|
|
129
|
+
!Array.isArray(targetVal)) {
|
|
130
|
+
result[key] = deepMerge(targetVal, sourceVal);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
result[key] = sourceVal;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Deep-clone via JSON round-trip.
|
|
140
|
+
* Only used for FullConfig-shaped data (no functions, no undefined values).
|
|
141
|
+
*/
|
|
142
|
+
function deepClone(obj) {
|
|
143
|
+
return JSON.parse(JSON.stringify(obj));
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* 将旧格式配置(ConfigManager 的扁平格式)转换为 RuntimeConfigCenter 的嵌套格式。
|
|
147
|
+
* 例如:{ provider: 'anthropic', model: 'claude-...' } → { provider: { active: 'anthropic' } }
|
|
148
|
+
*/
|
|
149
|
+
function normalizeConfig(persisted) {
|
|
150
|
+
const normalized = { ...persisted };
|
|
151
|
+
// 旧格式:provider 是字符串(如 'anthropic')
|
|
152
|
+
// 新格式:provider 是对象 { active: string, routeMode: string, ... }
|
|
153
|
+
if (typeof normalized.provider === 'string') {
|
|
154
|
+
const providerName = normalized.provider;
|
|
155
|
+
const modelName = normalized.model;
|
|
156
|
+
normalized.provider = {
|
|
157
|
+
active: providerName,
|
|
158
|
+
routeMode: 'auto',
|
|
159
|
+
enableThinking: false,
|
|
160
|
+
anthropic: { model: modelName || providerDefault('anthropic'), apiKeyEnv: 'ANTHROPIC_API_KEY' },
|
|
161
|
+
openai: { model: providerDefault('openai'), apiKeyEnv: 'OPENAI_API_KEY' },
|
|
162
|
+
deepseek: { model: providerDefault('deepseek'), apiKeyEnv: 'DEEPSEEK_API_KEY' },
|
|
163
|
+
gemini: { model: providerDefault('gemini'), apiKeyEnv: 'GEMINI_API_KEY' },
|
|
164
|
+
local: {
|
|
165
|
+
model: modelName || 'qwen2.5-7b',
|
|
166
|
+
baseUrl: 'http://127.0.0.1:8080/v1',
|
|
167
|
+
maxOutputTokens: 4096,
|
|
168
|
+
healthCheck: {
|
|
169
|
+
restartDelayMs: 3000,
|
|
170
|
+
intervalMs: 5000,
|
|
171
|
+
timeoutMs: 5000,
|
|
172
|
+
maxRetries: 6,
|
|
173
|
+
startupTimeoutMs: 120000,
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
// 删除旧格式的扁平 model 字段(已合并到 provider.active provider 中)
|
|
179
|
+
if ('model' in normalized && typeof normalized.provider === 'object') {
|
|
180
|
+
delete normalized.model;
|
|
181
|
+
}
|
|
182
|
+
return normalized;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Compute a flat list of per-leaf differences between two config trees.
|
|
186
|
+
*/
|
|
187
|
+
function deepDiff(oldObj, newObj, prefix = '') {
|
|
188
|
+
const entries = [];
|
|
189
|
+
const allKeys = new Set([...Object.keys(oldObj), ...Object.keys(newObj)]);
|
|
190
|
+
for (const key of allKeys) {
|
|
191
|
+
const fullPath = prefix ? `${prefix}.${key}` : key;
|
|
192
|
+
const oldVal = oldObj[key];
|
|
193
|
+
const newVal = newObj[key];
|
|
194
|
+
// Key exists only in one side.
|
|
195
|
+
if (oldVal === undefined) {
|
|
196
|
+
entries.push({ path: fullPath, oldValue: undefined, newValue: newVal });
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
if (newVal === undefined) {
|
|
200
|
+
entries.push({ path: fullPath, oldValue: oldVal, newValue: undefined });
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
// Both sides are plain objects -- recurse.
|
|
204
|
+
if (oldVal !== null &&
|
|
205
|
+
typeof oldVal === 'object' &&
|
|
206
|
+
!Array.isArray(oldVal) &&
|
|
207
|
+
newVal !== null &&
|
|
208
|
+
typeof newVal === 'object' &&
|
|
209
|
+
!Array.isArray(newVal)) {
|
|
210
|
+
entries.push(...deepDiff(oldVal, newVal, fullPath));
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
// Primitives or arrays -- compare by value.
|
|
214
|
+
if (JSON.stringify(oldVal) !== JSON.stringify(newVal)) {
|
|
215
|
+
entries.push({ path: fullPath, oldValue: oldVal, newValue: newVal });
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return entries;
|
|
219
|
+
}
|
|
220
|
+
// ============================================================
|
|
221
|
+
// RuntimeConfigCenter
|
|
222
|
+
// ============================================================
|
|
223
|
+
import { DEFAULT_PROVIDERS, getProviderConfigLoader } from '../provider/config.js';
|
|
224
|
+
function providerDefault(providerId) {
|
|
225
|
+
try {
|
|
226
|
+
const loader = getProviderConfigLoader();
|
|
227
|
+
const meta = loader.getProvider(providerId);
|
|
228
|
+
if (meta?.defaultModel)
|
|
229
|
+
return meta.defaultModel;
|
|
230
|
+
}
|
|
231
|
+
catch { }
|
|
232
|
+
return DEFAULT_PROVIDERS.providers[providerId]?.defaultModel ?? 'unknown';
|
|
233
|
+
}
|
|
234
|
+
export class RuntimeConfigCenter {
|
|
235
|
+
static instance;
|
|
236
|
+
/** Default configuration provided at initialization time (immutable snapshot). */
|
|
237
|
+
defaults = null;
|
|
238
|
+
/** Base defaults — the complete schema defaults, preserved for reload merging. */
|
|
239
|
+
baseDefaults = null;
|
|
240
|
+
/** Runtime overrides keyed by dot-path segments (nested object). */
|
|
241
|
+
runtime = {};
|
|
242
|
+
/** Persistence back-end. */
|
|
243
|
+
configManager = null;
|
|
244
|
+
/** Node.js event emitter used as the pub/sub transport. */
|
|
245
|
+
emitter;
|
|
246
|
+
/** Guards against use-before-initialize. */
|
|
247
|
+
initialized = false;
|
|
248
|
+
// ----------------------------------------------------------
|
|
249
|
+
// Singleton
|
|
250
|
+
// ----------------------------------------------------------
|
|
251
|
+
constructor() {
|
|
252
|
+
this.emitter = new EventEmitter();
|
|
253
|
+
// Allow many concurrent watchers without hitting the default limit.
|
|
254
|
+
this.emitter.setMaxListeners(500);
|
|
255
|
+
}
|
|
256
|
+
static getInstance() {
|
|
257
|
+
if (!RuntimeConfigCenter.instance) {
|
|
258
|
+
RuntimeConfigCenter.instance = new RuntimeConfigCenter();
|
|
259
|
+
}
|
|
260
|
+
return RuntimeConfigCenter.instance;
|
|
261
|
+
}
|
|
262
|
+
// ----------------------------------------------------------
|
|
263
|
+
// Lifecycle
|
|
264
|
+
// ----------------------------------------------------------
|
|
265
|
+
/**
|
|
266
|
+
* Initialise the config centre with default values and a persistence layer.
|
|
267
|
+
* Must be called once before any other methods are used.
|
|
268
|
+
* Calling it again resets all runtime overrides.
|
|
269
|
+
*/
|
|
270
|
+
initialize(defaults, configManager) {
|
|
271
|
+
this.defaults = deepClone(defaults);
|
|
272
|
+
this.baseDefaults = deepClone(defaults);
|
|
273
|
+
this.configManager = configManager;
|
|
274
|
+
this.runtime = {};
|
|
275
|
+
this.initialized = true;
|
|
276
|
+
}
|
|
277
|
+
// ----------------------------------------------------------
|
|
278
|
+
// Read
|
|
279
|
+
// ----------------------------------------------------------
|
|
280
|
+
/**
|
|
281
|
+
* Read a single config value by dot-path.
|
|
282
|
+
* Returns `undefined` for unknown paths (does not throw).
|
|
283
|
+
* Runtime overrides take precedence over defaults.
|
|
284
|
+
*/
|
|
285
|
+
get(path) {
|
|
286
|
+
this.ensureInitialized();
|
|
287
|
+
// Check runtime overrides first.
|
|
288
|
+
const runtimeVal = getByPath(this.runtime, path);
|
|
289
|
+
if (runtimeVal !== undefined) {
|
|
290
|
+
return runtimeVal;
|
|
291
|
+
}
|
|
292
|
+
// Fall back to defaults.
|
|
293
|
+
return getByPath(this.defaults, path);
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Return the complete effective configuration by deep-merging
|
|
297
|
+
* runtime overrides into the default configuration.
|
|
298
|
+
* The returned object is a fresh clone -- mutations will not affect the centre.
|
|
299
|
+
*/
|
|
300
|
+
getAll() {
|
|
301
|
+
this.ensureInitialized();
|
|
302
|
+
return deepMerge(this.defaults, this.runtime);
|
|
303
|
+
}
|
|
304
|
+
// ----------------------------------------------------------
|
|
305
|
+
// Write
|
|
306
|
+
// ----------------------------------------------------------
|
|
307
|
+
/**
|
|
308
|
+
* Set a single config value at the given dot-path.
|
|
309
|
+
* Throws if the path does not structurally exist in the defaults schema.
|
|
310
|
+
* Triggers change events for the exact path and all parent wildcard paths.
|
|
311
|
+
*/
|
|
312
|
+
set(path, value) {
|
|
313
|
+
this.ensureInitialized();
|
|
314
|
+
if (!hasPath(this.defaults, path)) {
|
|
315
|
+
throw new Error(`[RuntimeConfigCenter] Cannot set unknown config path: "${path}". ` +
|
|
316
|
+
`The path (or one of its ancestors) does not exist in the default configuration schema.`);
|
|
317
|
+
}
|
|
318
|
+
const oldValue = this.get(path);
|
|
319
|
+
setByPath(this.runtime, path, value);
|
|
320
|
+
const timestamp = new Date().toISOString();
|
|
321
|
+
const event = { path, oldValue, newValue: value, timestamp };
|
|
322
|
+
// Emit for the exact path.
|
|
323
|
+
this.emitter.emit(path, event);
|
|
324
|
+
// Emit for each parent wildcard so that broader watchers fire.
|
|
325
|
+
for (const wildcardPath of generateParentWildcardPaths(path)) {
|
|
326
|
+
this.emitter.emit(wildcardPath, event);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Deep-merge a partial config into the runtime overrides.
|
|
331
|
+
* Fires change events for every path that actually changed.
|
|
332
|
+
*/
|
|
333
|
+
merge(partial) {
|
|
334
|
+
this.ensureInitialized();
|
|
335
|
+
const oldConfig = this.getAll();
|
|
336
|
+
this.runtime = deepMerge(this.runtime, normalizeConfig(partial));
|
|
337
|
+
const newConfig = this.getAll();
|
|
338
|
+
this.fireDiffs(oldConfig, newConfig);
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Reset runtime overrides.
|
|
342
|
+
* - No argument : reset everything back to defaults.
|
|
343
|
+
* - With a path : reset only that subtree.
|
|
344
|
+
* Fires change events for every value that reverts.
|
|
345
|
+
*/
|
|
346
|
+
reset(path) {
|
|
347
|
+
this.ensureInitialized();
|
|
348
|
+
if (path === undefined) {
|
|
349
|
+
// Reset all.
|
|
350
|
+
const oldConfig = this.getAll();
|
|
351
|
+
this.runtime = {};
|
|
352
|
+
const newConfig = this.getAll();
|
|
353
|
+
this.fireDiffs(oldConfig, newConfig);
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
// Reset a specific subtree.
|
|
357
|
+
const oldValue = this.get(path);
|
|
358
|
+
deleteByPath(this.runtime, path);
|
|
359
|
+
const newValue = this.get(path);
|
|
360
|
+
// Only fire if the value actually changed.
|
|
361
|
+
if (JSON.stringify(oldValue) !== JSON.stringify(newValue)) {
|
|
362
|
+
const timestamp = new Date().toISOString();
|
|
363
|
+
const event = { path, oldValue, newValue, timestamp };
|
|
364
|
+
this.emitter.emit(path, event);
|
|
365
|
+
for (const wildcardPath of generateParentWildcardPaths(path)) {
|
|
366
|
+
this.emitter.emit(wildcardPath, event);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
// ----------------------------------------------------------
|
|
371
|
+
// Watch
|
|
372
|
+
// ----------------------------------------------------------
|
|
373
|
+
/**
|
|
374
|
+
* Subscribe to config changes matching a pattern.
|
|
375
|
+
*
|
|
376
|
+
* The `pattern` supports wildcards:
|
|
377
|
+
* - `"provider.*"` matches `"provider.active"`, `"provider.anthropic.model"`, etc.
|
|
378
|
+
* - `"*"` matches every path.
|
|
379
|
+
*
|
|
380
|
+
* Each callback is wrapped in a try-catch so that one failing subscriber
|
|
381
|
+
* does not prevent others from receiving the event.
|
|
382
|
+
*
|
|
383
|
+
* @returns An unsubscribe function; call it to stop receiving events.
|
|
384
|
+
*/
|
|
385
|
+
watch(pattern, callback) {
|
|
386
|
+
const safeCallback = (event) => {
|
|
387
|
+
try {
|
|
388
|
+
callback(event);
|
|
389
|
+
}
|
|
390
|
+
catch (err) {
|
|
391
|
+
console.error(`[RuntimeConfigCenter] Error in watch callback for pattern "${pattern}":`, err);
|
|
392
|
+
}
|
|
393
|
+
};
|
|
394
|
+
this.emitter.on(pattern, safeCallback);
|
|
395
|
+
return () => {
|
|
396
|
+
this.emitter.off(pattern, safeCallback);
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
// ----------------------------------------------------------
|
|
400
|
+
// Persistence
|
|
401
|
+
// ----------------------------------------------------------
|
|
402
|
+
/** 是否正在保存配置(用于 config-watcher 跳过自身 save 触发的文件变更) */
|
|
403
|
+
isSaving = false;
|
|
404
|
+
/**
|
|
405
|
+
* Persist the current effective configuration via the ConfigManager.
|
|
406
|
+
*/
|
|
407
|
+
async save() {
|
|
408
|
+
this.ensureInitialized();
|
|
409
|
+
this.isSaving = true;
|
|
410
|
+
try {
|
|
411
|
+
const config = this.getAll();
|
|
412
|
+
// ConfigManager.save accepts AgentConfig; FullConfig is a superset so
|
|
413
|
+
// extra keys will be serialised and round-tripped safely through JSON.
|
|
414
|
+
await this.configManager.save(config);
|
|
415
|
+
}
|
|
416
|
+
finally {
|
|
417
|
+
this.isSaving = false;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Reload configuration from the ConfigManager, diff against the previously-
|
|
422
|
+
* effective config, and fire change events for every path that differs.
|
|
423
|
+
*/
|
|
424
|
+
async load() {
|
|
425
|
+
this.ensureInitialized();
|
|
426
|
+
const oldConfig = this.getAll();
|
|
427
|
+
// Reload from persistent storage and merge into the complete base defaults.
|
|
428
|
+
// This ensures the defaults schema always stays intact even if the saved
|
|
429
|
+
// config file is missing some fields.
|
|
430
|
+
const persisted = await this.configManager.load();
|
|
431
|
+
this.defaults = deepMerge(this.baseDefaults, normalizeConfig(deepClone(persisted)));
|
|
432
|
+
this.runtime = {};
|
|
433
|
+
const newConfig = this.getAll();
|
|
434
|
+
this.fireDiffs(oldConfig, newConfig);
|
|
435
|
+
}
|
|
436
|
+
// ----------------------------------------------------------
|
|
437
|
+
// Internal utilities
|
|
438
|
+
// ----------------------------------------------------------
|
|
439
|
+
/** Throw a descriptive error if the centre has not been initialised yet. */
|
|
440
|
+
ensureInitialized() {
|
|
441
|
+
if (!this.initialized) {
|
|
442
|
+
throw new Error('[RuntimeConfigCenter] Not initialized. Call initialize(defaults, configManager) before using the config center.');
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Compare two config snapshots and emit change events for every leaf that differs.
|
|
447
|
+
*/
|
|
448
|
+
fireDiffs(oldConfig, newConfig) {
|
|
449
|
+
const diffs = deepDiff(oldConfig, newConfig);
|
|
450
|
+
if (diffs.length === 0)
|
|
451
|
+
return;
|
|
452
|
+
const timestamp = new Date().toISOString();
|
|
453
|
+
for (const diff of diffs) {
|
|
454
|
+
const event = {
|
|
455
|
+
path: diff.path,
|
|
456
|
+
oldValue: diff.oldValue,
|
|
457
|
+
newValue: diff.newValue,
|
|
458
|
+
timestamp,
|
|
459
|
+
};
|
|
460
|
+
this.emitter.emit(diff.path, event);
|
|
461
|
+
for (const wildcardPath of generateParentWildcardPaths(diff.path)) {
|
|
462
|
+
this.emitter.emit(wildcardPath, event);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
//# sourceMappingURL=config-center.js.map
|