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,21 @@
|
|
|
1
|
+
import type { ChildProcess } from 'node:child_process';
|
|
2
|
+
import type { Transport, TransportSendOptions } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
3
|
+
import type { JSONRPCMessage, MessageExtraInfo } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
export declare class ProcessTransport implements Transport {
|
|
5
|
+
private proc;
|
|
6
|
+
private readBuffer;
|
|
7
|
+
private onDataHandler;
|
|
8
|
+
private onCloseHandler;
|
|
9
|
+
private onErrorHandler;
|
|
10
|
+
onclose?: () => void;
|
|
11
|
+
onerror?: (error: Error) => void;
|
|
12
|
+
onmessage?: <T extends JSONRPCMessage>(message: T, extra?: MessageExtraInfo) => void;
|
|
13
|
+
sessionId?: string;
|
|
14
|
+
setProtocolVersion?: (version: string) => void;
|
|
15
|
+
constructor(proc: ChildProcess);
|
|
16
|
+
start(): Promise<void>;
|
|
17
|
+
send(message: JSONRPCMessage, options?: TransportSendOptions): Promise<void>;
|
|
18
|
+
close(): Promise<void>;
|
|
19
|
+
private processReadBuffer;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=process-transport.d.ts.map
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { ReadBuffer, serializeMessage } from '@modelcontextprotocol/sdk/shared/stdio.js';
|
|
2
|
+
export class ProcessTransport {
|
|
3
|
+
proc;
|
|
4
|
+
readBuffer = new ReadBuffer();
|
|
5
|
+
onDataHandler;
|
|
6
|
+
onCloseHandler;
|
|
7
|
+
onErrorHandler;
|
|
8
|
+
onclose;
|
|
9
|
+
onerror;
|
|
10
|
+
onmessage;
|
|
11
|
+
sessionId;
|
|
12
|
+
setProtocolVersion;
|
|
13
|
+
constructor(proc) {
|
|
14
|
+
this.proc = proc;
|
|
15
|
+
this.onDataHandler = (chunk) => {
|
|
16
|
+
this.readBuffer.append(chunk);
|
|
17
|
+
this.processReadBuffer();
|
|
18
|
+
};
|
|
19
|
+
this.onCloseHandler = () => {
|
|
20
|
+
this.onclose?.();
|
|
21
|
+
};
|
|
22
|
+
this.onErrorHandler = (err) => {
|
|
23
|
+
this.onerror?.(err);
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
async start() {
|
|
27
|
+
if (!this.proc.stdout) {
|
|
28
|
+
throw new Error('Process stdout is not available');
|
|
29
|
+
}
|
|
30
|
+
this.proc.stdout.on('data', this.onDataHandler);
|
|
31
|
+
this.proc.on('close', this.onCloseHandler);
|
|
32
|
+
this.proc.on('error', this.onErrorHandler);
|
|
33
|
+
}
|
|
34
|
+
async send(message, options) {
|
|
35
|
+
if (!this.proc.stdin || this.proc.stdin.destroyed) {
|
|
36
|
+
throw new Error('Process stdin is not available');
|
|
37
|
+
}
|
|
38
|
+
const line = serializeMessage(message);
|
|
39
|
+
this.proc.stdin.write(line);
|
|
40
|
+
}
|
|
41
|
+
async close() {
|
|
42
|
+
this.proc.stdout?.off('data', this.onDataHandler);
|
|
43
|
+
this.proc.off('close', this.onCloseHandler);
|
|
44
|
+
this.proc.off('error', this.onErrorHandler);
|
|
45
|
+
this.readBuffer.clear();
|
|
46
|
+
this.onclose?.();
|
|
47
|
+
}
|
|
48
|
+
processReadBuffer() {
|
|
49
|
+
while (true) {
|
|
50
|
+
const message = this.readBuffer.readMessage();
|
|
51
|
+
if (message === null)
|
|
52
|
+
break;
|
|
53
|
+
if (this.onmessage) {
|
|
54
|
+
this.onmessage(message);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=process-transport.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Sanitize MCP name: replace non-alphanumeric chars (except - and _) with - */
|
|
2
|
+
export declare function sanitizeMcpName(name: string): string;
|
|
3
|
+
/** 判断 MCP 工具名是否暗示副作用(用于工具描述中标记 [side-effect]) */
|
|
4
|
+
export declare function hasSideEffect(toolName: string): boolean;
|
|
5
|
+
//# sourceMappingURL=side-effect.d.ts.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Sanitize MCP name: replace non-alphanumeric chars (except - and _) with - */
|
|
2
|
+
export function sanitizeMcpName(name) {
|
|
3
|
+
return name.replace(/[^a-zA-Z0-9_-]/g, '-').replace(/-+/g, '-');
|
|
4
|
+
}
|
|
5
|
+
/** MCP 工具名中暗示副作用的操作关键词(如 create、delete、write 等) */
|
|
6
|
+
const SIDE_EFFECT_KEYWORDS = new Set([
|
|
7
|
+
'navigate', 'create', 'delete', 'open', 'write', 'execute',
|
|
8
|
+
'run', 'start', 'launch', 'install', 'remove', 'update',
|
|
9
|
+
'send', 'post', 'put', 'patch',
|
|
10
|
+
]);
|
|
11
|
+
/** 判断 MCP 工具名是否暗示副作用(用于工具描述中标记 [side-effect]) */
|
|
12
|
+
export function hasSideEffect(toolName) {
|
|
13
|
+
const lower = toolName.toLowerCase();
|
|
14
|
+
for (const keyword of SIDE_EFFECT_KEYWORDS) {
|
|
15
|
+
if (lower === keyword || lower.startsWith(keyword) || lower.includes(keyword)) {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=side-effect.js.map
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { MCPServerManager } from './lifecycle.js';
|
|
2
|
+
import { MCPBridge } from './bridge.js';
|
|
3
|
+
import type { ToolRegistry } from '../tools/registry.js';
|
|
4
|
+
import type { LayeredContextComposer } from '../context/composer.js';
|
|
5
|
+
import type { LifecycleSupervisor } from '../lifecycle/supervisor.js';
|
|
6
|
+
import type { MCPConfig } from '../types.js';
|
|
7
|
+
import { createLogger } from '../logging/logger.js';
|
|
8
|
+
export interface MCPStatusEvent {
|
|
9
|
+
type: 'added' | 'removed' | 'failed';
|
|
10
|
+
name: string;
|
|
11
|
+
tools?: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface MCPSystemDeps {
|
|
14
|
+
cwd: string;
|
|
15
|
+
logger?: ReturnType<typeof createLogger>;
|
|
16
|
+
}
|
|
17
|
+
interface MCPServerStatus {
|
|
18
|
+
name: string;
|
|
19
|
+
connected: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* MCPSystem — MCP 模块统一管理器
|
|
23
|
+
*
|
|
24
|
+
* 对标 PluginManager 的管理模式,封装 MCP 的完整生命周期:
|
|
25
|
+
* - start(): 加载配置 → 连接所有 MCP Server → 注册工具/ContextSource/Supervisor
|
|
26
|
+
* - stop(): 断开所有 MCP Server
|
|
27
|
+
* - reload(): 热加载,增量增/删/改 MCP Server
|
|
28
|
+
*
|
|
29
|
+
* 所有 MCP Server 随主进程启动而启动,随主进程关闭而关闭。
|
|
30
|
+
*/
|
|
31
|
+
export declare class MCPSystem {
|
|
32
|
+
private managers;
|
|
33
|
+
private installManager;
|
|
34
|
+
private bridge;
|
|
35
|
+
private configLoader;
|
|
36
|
+
private currentConfigs;
|
|
37
|
+
private cwd;
|
|
38
|
+
private logger;
|
|
39
|
+
private statusCallback?;
|
|
40
|
+
private toolRegistry?;
|
|
41
|
+
private contextComposer?;
|
|
42
|
+
private supervisor?;
|
|
43
|
+
constructor(deps: MCPSystemDeps);
|
|
44
|
+
/** 启动所有 MCP Server */
|
|
45
|
+
start(): Promise<void>;
|
|
46
|
+
/** 停止所有 MCP Server */
|
|
47
|
+
stop(): Promise<void>;
|
|
48
|
+
/** 热加载重载 */
|
|
49
|
+
reload(): Promise<void>;
|
|
50
|
+
/** 注册到 ToolRegistry */
|
|
51
|
+
registerToToolRegistry(registry: ToolRegistry): void;
|
|
52
|
+
/** 注册到 ContextComposer — 每个 Server 注册为独立 ContextSource */
|
|
53
|
+
registerToContextComposer(composer: LayeredContextComposer): void;
|
|
54
|
+
/** 注册到 LifecycleSupervisor */
|
|
55
|
+
registerToLifecycleSupervisor(supervisor: LifecycleSupervisor): void;
|
|
56
|
+
/** 获取 MCPBridge 实例 */
|
|
57
|
+
getBridge(): MCPBridge;
|
|
58
|
+
/** 获取所有 Manager */
|
|
59
|
+
getManagers(): MCPServerManager[];
|
|
60
|
+
/** 获取所有 MCP Server 状态 */
|
|
61
|
+
getStatus(): MCPServerStatus[];
|
|
62
|
+
/** 注册状态变更回调 */
|
|
63
|
+
onStatusChange(cb: (event: MCPStatusEvent) => void): void;
|
|
64
|
+
/** 触发状态变更事件 */
|
|
65
|
+
private emitStatus;
|
|
66
|
+
/**
|
|
67
|
+
* 添加外部来源的 MCP Server(如插件注册)。
|
|
68
|
+
* 与 mcp.json 配置的 Server 统一走 addServer 路径,享受相同的生命周期管理、热插拔缓存策略和优雅关闭保护。
|
|
69
|
+
*/
|
|
70
|
+
addExternalServer(config: MCPConfig, opts?: {
|
|
71
|
+
isHotPlug?: boolean;
|
|
72
|
+
}): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* 批量添加外部 MCP Server 配置。用于 PluginManager 统一注册插件声明的 MCP。
|
|
75
|
+
*/
|
|
76
|
+
addExternalServers(configs: MCPConfig[], opts?: {
|
|
77
|
+
isHotPlug?: boolean;
|
|
78
|
+
}): Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* 按名称移除 Server(外部调用)。PluginManager 在 deactivate 插件时使用。
|
|
81
|
+
*/
|
|
82
|
+
removeExternalServer(name: string): Promise<void>;
|
|
83
|
+
/** 添加单个 MCP Server。isHotPlug=true 时 ContextSource 使用 live 缓存策略(进 Zone 5),避免破坏 Zone 2-3 前缀缓存。 */
|
|
84
|
+
private addServer;
|
|
85
|
+
/** 移除单个 MCP Server */
|
|
86
|
+
private removeServer;
|
|
87
|
+
/** 同步 MCPBridge 的 clients/managers 列表 */
|
|
88
|
+
private syncBridge;
|
|
89
|
+
/** 同步所有 ContextSource */
|
|
90
|
+
private syncContextSources;
|
|
91
|
+
/** 注册单个 Server 的 ContextSource。isHotPlug 时用 live 策略(进 Zone 5 临时区),否则用 manifest 策略(进 Zone 2 稳定前缀)。 */
|
|
92
|
+
private registerServerContextSource;
|
|
93
|
+
}
|
|
94
|
+
export {};
|
|
95
|
+
//# sourceMappingURL=system.d.ts.map
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { MCPConfigLoader } from './config.js';
|
|
2
|
+
import { MCPServerManager } from './lifecycle.js';
|
|
3
|
+
import { MCPBridge } from './bridge.js';
|
|
4
|
+
import { MCPInstallManager } from './install-manager.js';
|
|
5
|
+
import { createLogger } from '../logging/logger.js';
|
|
6
|
+
/**
|
|
7
|
+
* MCPSystem — MCP 模块统一管理器
|
|
8
|
+
*
|
|
9
|
+
* 对标 PluginManager 的管理模式,封装 MCP 的完整生命周期:
|
|
10
|
+
* - start(): 加载配置 → 连接所有 MCP Server → 注册工具/ContextSource/Supervisor
|
|
11
|
+
* - stop(): 断开所有 MCP Server
|
|
12
|
+
* - reload(): 热加载,增量增/删/改 MCP Server
|
|
13
|
+
*
|
|
14
|
+
* 所有 MCP Server 随主进程启动而启动,随主进程关闭而关闭。
|
|
15
|
+
*/
|
|
16
|
+
export class MCPSystem {
|
|
17
|
+
managers = [];
|
|
18
|
+
installManager;
|
|
19
|
+
bridge;
|
|
20
|
+
configLoader;
|
|
21
|
+
currentConfigs = [];
|
|
22
|
+
cwd;
|
|
23
|
+
logger;
|
|
24
|
+
statusCallback;
|
|
25
|
+
// 外部依赖(通过 register 方法注入)
|
|
26
|
+
toolRegistry;
|
|
27
|
+
contextComposer;
|
|
28
|
+
supervisor;
|
|
29
|
+
constructor(deps) {
|
|
30
|
+
this.cwd = deps.cwd;
|
|
31
|
+
this.logger = deps.logger ?? createLogger('mcp:system');
|
|
32
|
+
this.configLoader = new MCPConfigLoader();
|
|
33
|
+
this.installManager = new MCPInstallManager();
|
|
34
|
+
this.bridge = new MCPBridge([]);
|
|
35
|
+
}
|
|
36
|
+
/** 启动所有 MCP Server */
|
|
37
|
+
async start() {
|
|
38
|
+
this.currentConfigs = await this.configLoader.load(this.cwd);
|
|
39
|
+
for (const config of this.currentConfigs) {
|
|
40
|
+
await this.addServer(config);
|
|
41
|
+
}
|
|
42
|
+
this.logger.info(`MCPSystem started: ${this.managers.length}/${this.currentConfigs.length} servers connected`);
|
|
43
|
+
}
|
|
44
|
+
/** 停止所有 MCP Server */
|
|
45
|
+
async stop() {
|
|
46
|
+
for (const manager of this.managers) {
|
|
47
|
+
try {
|
|
48
|
+
await manager.disconnect();
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
52
|
+
this.logger.warn(`disconnect error for ${manager.getName()}: ${msg}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
this.managers = [];
|
|
56
|
+
this.bridge.updateClients([], []);
|
|
57
|
+
this.currentConfigs = [];
|
|
58
|
+
this.logger.info('MCPSystem stopped');
|
|
59
|
+
}
|
|
60
|
+
/** 热加载重载 */
|
|
61
|
+
async reload() {
|
|
62
|
+
const newConfigs = await this.configLoader.load(this.cwd);
|
|
63
|
+
const oldMap = new Map(this.currentConfigs.map(c => [c.name, c]));
|
|
64
|
+
const newMap = new Map(newConfigs.map(c => [c.name, c]));
|
|
65
|
+
// Added — 热插拔:新增 Server 标记 isHotPlug,ContextSource 进 Zone 5 临时区
|
|
66
|
+
for (const [name, cfg] of newMap) {
|
|
67
|
+
if (!oldMap.has(name)) {
|
|
68
|
+
this.logger.info('MCP server added (hot-plug)', { name });
|
|
69
|
+
await this.addServer(cfg, { isHotPlug: true });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Removed
|
|
73
|
+
for (const [name] of oldMap) {
|
|
74
|
+
if (!newMap.has(name)) {
|
|
75
|
+
this.logger.info('MCP server removed', { name });
|
|
76
|
+
await this.removeServer(name);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Changed — 热插拔:先 remove 再 add,新实例也标记 isHotPlug
|
|
80
|
+
for (const [name, newCfg] of newMap) {
|
|
81
|
+
const oldCfg = oldMap.get(name);
|
|
82
|
+
if (oldCfg && !configsEqual(oldCfg, newCfg)) {
|
|
83
|
+
this.logger.info('MCP server changed (hot-plug)', { name });
|
|
84
|
+
await this.removeServer(name);
|
|
85
|
+
await this.addServer(newCfg, { isHotPlug: true });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
this.currentConfigs = newConfigs;
|
|
89
|
+
this.logger.info(`MCPSystem reloaded: ${this.managers.length} servers`);
|
|
90
|
+
}
|
|
91
|
+
/** 注册到 ToolRegistry */
|
|
92
|
+
registerToToolRegistry(registry) {
|
|
93
|
+
this.toolRegistry = registry;
|
|
94
|
+
this.bridge.registerToRegistry(registry);
|
|
95
|
+
}
|
|
96
|
+
/** 注册到 ContextComposer — 每个 Server 注册为独立 ContextSource */
|
|
97
|
+
registerToContextComposer(composer) {
|
|
98
|
+
this.contextComposer = composer;
|
|
99
|
+
this.syncContextSources(composer);
|
|
100
|
+
}
|
|
101
|
+
/** 注册到 LifecycleSupervisor */
|
|
102
|
+
registerToLifecycleSupervisor(supervisor) {
|
|
103
|
+
this.supervisor = supervisor;
|
|
104
|
+
for (const manager of this.managers) {
|
|
105
|
+
supervisor.registerMCPServer(manager.getProcessManager());
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** 获取 MCPBridge 实例 */
|
|
109
|
+
getBridge() {
|
|
110
|
+
return this.bridge;
|
|
111
|
+
}
|
|
112
|
+
/** 获取所有 Manager */
|
|
113
|
+
getManagers() {
|
|
114
|
+
return this.managers;
|
|
115
|
+
}
|
|
116
|
+
/** 获取所有 MCP Server 状态 */
|
|
117
|
+
getStatus() {
|
|
118
|
+
return this.managers.map(m => ({
|
|
119
|
+
name: m.getName(),
|
|
120
|
+
connected: m.isConnected(),
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
/** 注册状态变更回调 */
|
|
124
|
+
onStatusChange(cb) {
|
|
125
|
+
this.statusCallback = cb;
|
|
126
|
+
}
|
|
127
|
+
/** 触发状态变更事件 */
|
|
128
|
+
emitStatus(event) {
|
|
129
|
+
this.statusCallback?.(event);
|
|
130
|
+
this.logger.info(`MCP status: ${event.type}`, { name: event.name, tools: event.tools?.join(',') });
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* 添加外部来源的 MCP Server(如插件注册)。
|
|
134
|
+
* 与 mcp.json 配置的 Server 统一走 addServer 路径,享受相同的生命周期管理、热插拔缓存策略和优雅关闭保护。
|
|
135
|
+
*/
|
|
136
|
+
async addExternalServer(config, opts) {
|
|
137
|
+
await this.addServer(config, opts);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* 批量添加外部 MCP Server 配置。用于 PluginManager 统一注册插件声明的 MCP。
|
|
141
|
+
*/
|
|
142
|
+
async addExternalServers(configs, opts) {
|
|
143
|
+
for (const config of configs) {
|
|
144
|
+
await this.addServer(config, opts);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* 按名称移除 Server(外部调用)。PluginManager 在 deactivate 插件时使用。
|
|
149
|
+
*/
|
|
150
|
+
async removeExternalServer(name) {
|
|
151
|
+
await this.removeServer(name);
|
|
152
|
+
}
|
|
153
|
+
// ── 内部方法 ──
|
|
154
|
+
/** 添加单个 MCP Server。isHotPlug=true 时 ContextSource 使用 live 缓存策略(进 Zone 5),避免破坏 Zone 2-3 前缀缓存。 */
|
|
155
|
+
async addServer(config, opts = {}) {
|
|
156
|
+
const isHotPlug = opts.isHotPlug ?? false;
|
|
157
|
+
// 安装管理:确保包已安装,更新 command/args
|
|
158
|
+
const resolved = await this.installManager.ensureInstalled(config);
|
|
159
|
+
if (resolved === null && config.packageType) {
|
|
160
|
+
this.logger.warn(`MCP server "${config.name}" install failed, skipping`);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const effectiveConfig = resolved ? { ...config, command: resolved.command, args: resolved.args } : config;
|
|
164
|
+
const manager = new MCPServerManager(effectiveConfig);
|
|
165
|
+
const ok = await manager.connect();
|
|
166
|
+
if (!ok) {
|
|
167
|
+
this.logger.warn(`MCP server "${config.name}" connect failed, skipping`);
|
|
168
|
+
// 连接失败时清理子进程
|
|
169
|
+
try {
|
|
170
|
+
await manager.disconnect();
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
// 忽略断开连接时的错误
|
|
174
|
+
}
|
|
175
|
+
this.emitStatus({ type: 'failed', name: config.name });
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
this.managers.push(manager);
|
|
179
|
+
this.syncBridge();
|
|
180
|
+
// 注册到 ToolRegistry
|
|
181
|
+
if (this.toolRegistry) {
|
|
182
|
+
this.bridge.registerToRegistry(this.toolRegistry);
|
|
183
|
+
}
|
|
184
|
+
// 注册到 ContextComposer — 热插拔与持久化使用不同 cacheability
|
|
185
|
+
if (this.contextComposer) {
|
|
186
|
+
this.registerServerContextSource(config.name, manager, this.contextComposer, isHotPlug);
|
|
187
|
+
}
|
|
188
|
+
// 注册到 LifecycleSupervisor
|
|
189
|
+
if (this.supervisor) {
|
|
190
|
+
this.supervisor.registerMCPServer(manager.getProcessManager());
|
|
191
|
+
}
|
|
192
|
+
this.emitStatus({ type: 'added', name: config.name, tools: manager.getClient().getTools().map(t => t.name) });
|
|
193
|
+
}
|
|
194
|
+
/** 移除单个 MCP Server */
|
|
195
|
+
async removeServer(name) {
|
|
196
|
+
const idx = this.managers.findIndex(m => m.getName() === name);
|
|
197
|
+
if (idx === -1)
|
|
198
|
+
return;
|
|
199
|
+
const manager = this.managers[idx];
|
|
200
|
+
const oldToolNames = manager.getClient().getTools().map(t => t.name);
|
|
201
|
+
// 注销工具
|
|
202
|
+
if (this.toolRegistry) {
|
|
203
|
+
this.bridge.unregisterTools(name, this.toolRegistry);
|
|
204
|
+
}
|
|
205
|
+
// 注销 ContextSource
|
|
206
|
+
if (this.contextComposer) {
|
|
207
|
+
this.contextComposer.unregisterSource(`mcp-${name}`);
|
|
208
|
+
}
|
|
209
|
+
// 断开连接
|
|
210
|
+
try {
|
|
211
|
+
await manager.disconnect();
|
|
212
|
+
}
|
|
213
|
+
catch (err) {
|
|
214
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
215
|
+
this.logger.warn(`disconnect error for ${name}: ${msg}`);
|
|
216
|
+
}
|
|
217
|
+
this.managers.splice(idx, 1);
|
|
218
|
+
this.syncBridge();
|
|
219
|
+
this.emitStatus({ type: 'removed', name, tools: oldToolNames });
|
|
220
|
+
}
|
|
221
|
+
/** 同步 MCPBridge 的 clients/managers 列表 */
|
|
222
|
+
syncBridge() {
|
|
223
|
+
const clients = this.managers.map(m => m.getClient());
|
|
224
|
+
this.bridge.updateClients(clients, this.managers);
|
|
225
|
+
}
|
|
226
|
+
/** 同步所有 ContextSource */
|
|
227
|
+
syncContextSources(composer) {
|
|
228
|
+
for (const manager of this.managers) {
|
|
229
|
+
this.registerServerContextSource(manager.getName(), manager, composer);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/** 注册单个 Server 的 ContextSource。isHotPlug 时用 live 策略(进 Zone 5 临时区),否则用 manifest 策略(进 Zone 2 稳定前缀)。 */
|
|
233
|
+
registerServerContextSource(name, manager, composer, isHotPlug = false) {
|
|
234
|
+
const client = manager.getClient();
|
|
235
|
+
composer.registerSource({
|
|
236
|
+
name: `mcp-${name}`,
|
|
237
|
+
strategy: 'index_only',
|
|
238
|
+
cacheability: isHotPlug ? 'live' : 'manifest',
|
|
239
|
+
description: name,
|
|
240
|
+
getContent: () => client.getToolIndex(),
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// ── 比较两个 MCPConfig 是否相等 ──
|
|
245
|
+
function configsEqual(a, b) {
|
|
246
|
+
return (a.command === b.command &&
|
|
247
|
+
arrayEqualUnordered(a.args, b.args) &&
|
|
248
|
+
a.url === b.url &&
|
|
249
|
+
objectEqual(a.env, b.env) &&
|
|
250
|
+
objectEqual(a.headers, b.headers) &&
|
|
251
|
+
a.packageType === b.packageType &&
|
|
252
|
+
a.package === b.package &&
|
|
253
|
+
a.packageVersion === b.packageVersion &&
|
|
254
|
+
a.connectTimeout === b.connectTimeout &&
|
|
255
|
+
a.callTimeout === b.callTimeout);
|
|
256
|
+
}
|
|
257
|
+
function arrayEqualUnordered(a, b) {
|
|
258
|
+
if (a === b)
|
|
259
|
+
return true;
|
|
260
|
+
if (!a || !b)
|
|
261
|
+
return false;
|
|
262
|
+
if (a.length !== b.length)
|
|
263
|
+
return false;
|
|
264
|
+
const sortedA = [...a].sort();
|
|
265
|
+
const sortedB = [...b].sort();
|
|
266
|
+
return sortedA.every((v, i) => v === sortedB[i]);
|
|
267
|
+
}
|
|
268
|
+
function objectEqual(a, b) {
|
|
269
|
+
if (a === b)
|
|
270
|
+
return true;
|
|
271
|
+
if (!a || !b)
|
|
272
|
+
return false;
|
|
273
|
+
const keysA = Object.keys(a).sort();
|
|
274
|
+
const keysB = Object.keys(b).sort();
|
|
275
|
+
if (keysA.length !== keysB.length)
|
|
276
|
+
return false;
|
|
277
|
+
return keysA.every((key, i) => key === keysB[i] && a[key] === b[key]);
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=system.js.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CompanionSessionManager — 管理陪伴模式专用 session(全局单例)。
|
|
3
|
+
*
|
|
4
|
+
* 每个角色独立目录。进入陪伴模式时根据角色名自动恢复,
|
|
5
|
+
* 重置时仅归档对话文件(conversation/events/stats),不动 world.json。
|
|
6
|
+
*/
|
|
7
|
+
export declare class CompanionSessionManager {
|
|
8
|
+
private dir;
|
|
9
|
+
/** 全局单例 */
|
|
10
|
+
private static instance;
|
|
11
|
+
static getInstance(): CompanionSessionManager;
|
|
12
|
+
/** 设置/切换当前角色 */
|
|
13
|
+
setCharacter(name: string): void;
|
|
14
|
+
/** 返回当前角色的陪伴目录路径(首次调用时自动创建) */
|
|
15
|
+
getOrCreate(): string;
|
|
16
|
+
/**
|
|
17
|
+
* 重置陪伴 session:仅归档对话文件,不动 world.json(世界数据跨会话保留)。
|
|
18
|
+
*/
|
|
19
|
+
reset(): Promise<string>;
|
|
20
|
+
private initSessionSync;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=companion-session.d.ts.map
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import { createLogger } from '../logging/logger.js';
|
|
6
|
+
const logger = createLogger('companion-session');
|
|
7
|
+
/**
|
|
8
|
+
* 陪伴 session 目录:~/.agent/companion/<角色名>/
|
|
9
|
+
*
|
|
10
|
+
* 按角色隔离:一个角色一个目录,内含 world.json(世界数据)+ 会话文件。
|
|
11
|
+
* 所有渠道(TUI、飞书、HTTP)共享同一份对话。
|
|
12
|
+
* 与正常 session(~/.agent/sessions/)完全分开,不受 SessionManager.cleanup() 影响。
|
|
13
|
+
*/
|
|
14
|
+
function getCompanionDir(name) {
|
|
15
|
+
return path.join(os.homedir(), '.agent', 'companion', name);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* CompanionSessionManager — 管理陪伴模式专用 session(全局单例)。
|
|
19
|
+
*
|
|
20
|
+
* 每个角色独立目录。进入陪伴模式时根据角色名自动恢复,
|
|
21
|
+
* 重置时仅归档对话文件(conversation/events/stats),不动 world.json。
|
|
22
|
+
*/
|
|
23
|
+
export class CompanionSessionManager {
|
|
24
|
+
dir = '';
|
|
25
|
+
/** 全局单例 */
|
|
26
|
+
static instance;
|
|
27
|
+
static getInstance() {
|
|
28
|
+
if (!CompanionSessionManager.instance) {
|
|
29
|
+
CompanionSessionManager.instance = new CompanionSessionManager();
|
|
30
|
+
}
|
|
31
|
+
return CompanionSessionManager.instance;
|
|
32
|
+
}
|
|
33
|
+
/** 设置/切换当前角色 */
|
|
34
|
+
setCharacter(name) {
|
|
35
|
+
this.dir = getCompanionDir(name);
|
|
36
|
+
}
|
|
37
|
+
/** 返回当前角色的陪伴目录路径(首次调用时自动创建) */
|
|
38
|
+
getOrCreate() {
|
|
39
|
+
if (!existsSync(this.dir)) {
|
|
40
|
+
mkdirSync(this.dir, { recursive: true });
|
|
41
|
+
this.initSessionSync();
|
|
42
|
+
logger.info('Created companion session', { dir: this.dir });
|
|
43
|
+
}
|
|
44
|
+
return this.dir;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 重置陪伴 session:仅归档对话文件,不动 world.json(世界数据跨会话保留)。
|
|
48
|
+
*/
|
|
49
|
+
async reset() {
|
|
50
|
+
const archiveRoot = path.join(this.dir, 'sessions-archive');
|
|
51
|
+
await fs.mkdir(archiveRoot, { recursive: true });
|
|
52
|
+
const archiveDir = path.join(archiveRoot, String(Date.now()));
|
|
53
|
+
await fs.mkdir(archiveDir, { recursive: true });
|
|
54
|
+
const sessionFiles = ['conversation.jsonl', 'events.jsonl', 'stats.json'];
|
|
55
|
+
for (const f of sessionFiles) {
|
|
56
|
+
const src = path.join(this.dir, f);
|
|
57
|
+
try {
|
|
58
|
+
await fs.rename(src, path.join(archiveDir, f));
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// 文件不存在则跳过
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
logger.info('Archived conversation files', { archiveDir });
|
|
65
|
+
this.initSessionSync();
|
|
66
|
+
logger.info('Created new companion session', { dir: this.dir });
|
|
67
|
+
return this.dir;
|
|
68
|
+
}
|
|
69
|
+
initSessionSync() {
|
|
70
|
+
const now = new Date().toISOString();
|
|
71
|
+
writeFileSync(path.join(this.dir, 'meta.json'), JSON.stringify({ type: 'companion', createdAt: now }), 'utf-8');
|
|
72
|
+
writeFileSync(path.join(this.dir, 'conversation.jsonl'), '', 'utf-8');
|
|
73
|
+
writeFileSync(path.join(this.dir, 'events.jsonl'), '', 'utf-8');
|
|
74
|
+
writeFileSync(path.join(this.dir, 'stats.json'), JSON.stringify({ turns: 0, input_tokens: 0, output_tokens: 0, tool_calls: 0 }), 'utf-8');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=companion-session.js.map
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface CompressionBoundary {
|
|
2
|
+
/** 已压缩消息的数量(conversation.jsonl 中前 N 条已被摘要覆盖) */
|
|
3
|
+
compressedCount: number;
|
|
4
|
+
/** 最后一次压缩的轮次 */
|
|
5
|
+
lastCompactTurn: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* 读取压缩边界信息。
|
|
9
|
+
* 文件不存在时返回默认值 { compressedCount: 0, lastCompactTurn: 0 }。
|
|
10
|
+
*
|
|
11
|
+
* @param sessionId 会话 ID
|
|
12
|
+
* @param jsonlLength conversation.jsonl 的当前消息数(用于 truncate 安全降级)
|
|
13
|
+
*/
|
|
14
|
+
export declare function readCompressionBoundary(sessionId: string, jsonlLength: number): Promise<CompressionBoundary>;
|
|
15
|
+
/**
|
|
16
|
+
* 写入压缩边界信息。
|
|
17
|
+
* 自动创建目录。
|
|
18
|
+
*/
|
|
19
|
+
export declare function writeCompressionBoundary(sessionId: string, boundary: CompressionBoundary): Promise<void>;
|
|
20
|
+
//# sourceMappingURL=compression-boundary.d.ts.map
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
const DEFAULT_BOUNDARY = {
|
|
5
|
+
compressedCount: 0,
|
|
6
|
+
lastCompactTurn: 0,
|
|
7
|
+
};
|
|
8
|
+
function getBoundaryPath(sessionId) {
|
|
9
|
+
return path.join(os.homedir(), '.agent', 'sessions', sessionId, 'compression-boundary.json');
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 读取压缩边界信息。
|
|
13
|
+
* 文件不存在时返回默认值 { compressedCount: 0, lastCompactTurn: 0 }。
|
|
14
|
+
*
|
|
15
|
+
* @param sessionId 会话 ID
|
|
16
|
+
* @param jsonlLength conversation.jsonl 的当前消息数(用于 truncate 安全降级)
|
|
17
|
+
*/
|
|
18
|
+
export async function readCompressionBoundary(sessionId, jsonlLength) {
|
|
19
|
+
try {
|
|
20
|
+
const content = await fs.readFile(getBoundaryPath(sessionId), 'utf-8');
|
|
21
|
+
const boundary = JSON.parse(content);
|
|
22
|
+
// truncate 安全降级:jsonl 被截断导致 compressedCount >= jsonl 长度
|
|
23
|
+
if (boundary.compressedCount >= jsonlLength) {
|
|
24
|
+
return { compressedCount: 0, lastCompactTurn: 0 };
|
|
25
|
+
}
|
|
26
|
+
return boundary;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return { ...DEFAULT_BOUNDARY };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 写入压缩边界信息。
|
|
34
|
+
* 自动创建目录。
|
|
35
|
+
*/
|
|
36
|
+
export async function writeCompressionBoundary(sessionId, boundary) {
|
|
37
|
+
await fs.mkdir(path.dirname(getBoundaryPath(sessionId)), { recursive: true });
|
|
38
|
+
await fs.writeFile(getBoundaryPath(sessionId), JSON.stringify(boundary), 'utf-8');
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=compression-boundary.js.map
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Message } from '../types.js';
|
|
2
|
+
export declare class ConversationStore {
|
|
3
|
+
private readonly maxMessages;
|
|
4
|
+
private readonly conversationFile;
|
|
5
|
+
constructor(maxMessages?: number, conversationFile?: string);
|
|
6
|
+
private getFilePath;
|
|
7
|
+
ensureFile(filePath: string): Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* 追加消息到 conversation.jsonl
|
|
10
|
+
*/
|
|
11
|
+
append(sessionDir: string, message: Message): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* 读取全部消息
|
|
14
|
+
*/
|
|
15
|
+
readAll(sessionDir: string): Promise<Message[]>;
|
|
16
|
+
/**
|
|
17
|
+
* 读取最后 n 条消息
|
|
18
|
+
*/
|
|
19
|
+
readLast(sessionDir: string, n: number): Promise<Message[]>;
|
|
20
|
+
/**
|
|
21
|
+
* 统计消息数量
|
|
22
|
+
*/
|
|
23
|
+
count(sessionDir: string): Promise<number>;
|
|
24
|
+
/**
|
|
25
|
+
* 截断旧消息,保留最新的消息
|
|
26
|
+
*/
|
|
27
|
+
private truncate;
|
|
28
|
+
/**
|
|
29
|
+
* 替换全部消息(用于压缩后写回)
|
|
30
|
+
* 使用 write-to-temp + rename 原子写入模式,防止写入过程中崩溃导致文件损坏
|
|
31
|
+
*/
|
|
32
|
+
replace(sessionDir: string, messages: Message[]): Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=conversation.d.ts.map
|