dsh-tavern-bundle 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +216 -0
- package/cordis.patch.yml +14 -0
- package/lib/adapters/model-gateway.d.ts +4 -0
- package/lib/adapters/model-gateway.d.ts.map +1 -0
- package/lib/adapters/model-gateway.js +3 -0
- package/lib/adapters/model-gateway.js.map +1 -0
- package/lib/adapters/prestep-spike.d.ts +16 -0
- package/lib/adapters/prestep-spike.d.ts.map +1 -0
- package/lib/adapters/prestep-spike.js +114 -0
- package/lib/adapters/prestep-spike.js.map +1 -0
- package/lib/adapters/runtime-probe.d.ts +67 -0
- package/lib/adapters/runtime-probe.d.ts.map +1 -0
- package/lib/adapters/runtime-probe.js +106 -0
- package/lib/adapters/runtime-probe.js.map +1 -0
- package/lib/adapters/session-agent-provider.d.ts +3 -0
- package/lib/adapters/session-agent-provider.d.ts.map +1 -0
- package/lib/adapters/session-agent-provider.js +3 -0
- package/lib/adapters/session-agent-provider.js.map +1 -0
- package/lib/adapters/subagent-gateway.d.ts +3 -0
- package/lib/adapters/subagent-gateway.d.ts.map +1 -0
- package/lib/adapters/subagent-gateway.js +3 -0
- package/lib/adapters/subagent-gateway.js.map +1 -0
- package/lib/application/chat/chat-application-service.d.ts +94 -0
- package/lib/application/chat/chat-application-service.d.ts.map +1 -0
- package/lib/application/chat/chat-application-service.js +291 -0
- package/lib/application/chat/chat-application-service.js.map +1 -0
- package/lib/application/companion/agent-orchestrator.d.ts +91 -0
- package/lib/application/companion/agent-orchestrator.d.ts.map +1 -0
- package/lib/application/companion/agent-orchestrator.js +298 -0
- package/lib/application/companion/agent-orchestrator.js.map +1 -0
- package/lib/application/companion/companion-child-service.d.ts +47 -0
- package/lib/application/companion/companion-child-service.d.ts.map +1 -0
- package/lib/application/companion/companion-child-service.js +30 -0
- package/lib/application/companion/companion-child-service.js.map +1 -0
- package/lib/application/companion/companion-invocation-service.d.ts +42 -0
- package/lib/application/companion/companion-invocation-service.d.ts.map +1 -0
- package/lib/application/companion/companion-invocation-service.js +50 -0
- package/lib/application/companion/companion-invocation-service.js.map +1 -0
- package/lib/application/companion/companion-profile-service.d.ts +32 -0
- package/lib/application/companion/companion-profile-service.d.ts.map +1 -0
- package/lib/application/companion/companion-profile-service.js +112 -0
- package/lib/application/companion/companion-profile-service.js.map +1 -0
- package/lib/application/companion/companion-promotion-service.d.ts +69 -0
- package/lib/application/companion/companion-promotion-service.d.ts.map +1 -0
- package/lib/application/companion/companion-promotion-service.js +129 -0
- package/lib/application/companion/companion-promotion-service.js.map +1 -0
- package/lib/application/group-chat/group-chat-execution-service.d.ts +22 -0
- package/lib/application/group-chat/group-chat-execution-service.d.ts.map +1 -0
- package/lib/application/group-chat/group-chat-execution-service.js +110 -0
- package/lib/application/group-chat/group-chat-execution-service.js.map +1 -0
- package/lib/application/group-chat/group-chat-orchestrator.d.ts +51 -0
- package/lib/application/group-chat/group-chat-orchestrator.d.ts.map +1 -0
- package/lib/application/group-chat/group-chat-orchestrator.js +57 -0
- package/lib/application/group-chat/group-chat-orchestrator.js.map +1 -0
- package/lib/application/memory/memory-retriever.d.ts +37 -0
- package/lib/application/memory/memory-retriever.d.ts.map +1 -0
- package/lib/application/memory/memory-retriever.js +91 -0
- package/lib/application/memory/memory-retriever.js.map +1 -0
- package/lib/application/memory/memory-service.d.ts +128 -0
- package/lib/application/memory/memory-service.d.ts.map +1 -0
- package/lib/application/memory/memory-service.js +346 -0
- package/lib/application/memory/memory-service.js.map +1 -0
- package/lib/application/ports/companion-runtime-port.d.ts +72 -0
- package/lib/application/ports/companion-runtime-port.d.ts.map +1 -0
- package/lib/application/ports/companion-runtime-port.js +2 -0
- package/lib/application/ports/companion-runtime-port.js.map +1 -0
- package/lib/application/ports/llm-port.d.ts +7 -0
- package/lib/application/ports/llm-port.d.ts.map +1 -0
- package/lib/application/ports/llm-port.js +2 -0
- package/lib/application/ports/llm-port.js.map +1 -0
- package/lib/application/ports/message-source.d.ts +4 -0
- package/lib/application/ports/message-source.d.ts.map +1 -0
- package/lib/application/ports/message-source.js +5 -0
- package/lib/application/ports/message-source.js.map +1 -0
- package/lib/application/ports/session-context-port.d.ts +13 -0
- package/lib/application/ports/session-context-port.d.ts.map +1 -0
- package/lib/application/ports/session-context-port.js +2 -0
- package/lib/application/ports/session-context-port.js.map +1 -0
- package/lib/application/ports/subagent-port.d.ts +31 -0
- package/lib/application/ports/subagent-port.d.ts.map +1 -0
- package/lib/application/ports/subagent-port.js +2 -0
- package/lib/application/ports/subagent-port.js.map +1 -0
- package/lib/application/ports/user-resolver-port.d.ts +5 -0
- package/lib/application/ports/user-resolver-port.d.ts.map +1 -0
- package/lib/application/ports/user-resolver-port.js +2 -0
- package/lib/application/ports/user-resolver-port.js.map +1 -0
- package/lib/application/relationship/relationship-event-service.d.ts +31 -0
- package/lib/application/relationship/relationship-event-service.d.ts.map +1 -0
- package/lib/application/relationship/relationship-event-service.js +43 -0
- package/lib/application/relationship/relationship-event-service.js.map +1 -0
- package/lib/application/relationship/relationship-policy.d.ts +20 -0
- package/lib/application/relationship/relationship-policy.d.ts.map +1 -0
- package/lib/application/relationship/relationship-policy.js +24 -0
- package/lib/application/relationship/relationship-policy.js.map +1 -0
- package/lib/application/relationship/relationship-projection.d.ts +14 -0
- package/lib/application/relationship/relationship-projection.d.ts.map +1 -0
- package/lib/application/relationship/relationship-projection.js +25 -0
- package/lib/application/relationship/relationship-projection.js.map +1 -0
- package/lib/application/relationship/relationship-service.d.ts +95 -0
- package/lib/application/relationship/relationship-service.d.ts.map +1 -0
- package/lib/application/relationship/relationship-service.js +254 -0
- package/lib/application/relationship/relationship-service.js.map +1 -0
- package/lib/application/workspace/workspace-service.d.ts +106 -0
- package/lib/application/workspace/workspace-service.d.ts.map +1 -0
- package/lib/application/workspace/workspace-service.js +44 -0
- package/lib/application/workspace/workspace-service.js.map +1 -0
- package/lib/bootstrap/create-domain.d.ts +5 -0
- package/lib/bootstrap/create-domain.d.ts.map +1 -0
- package/lib/bootstrap/create-domain.js +14 -0
- package/lib/bootstrap/create-domain.js.map +1 -0
- package/lib/bootstrap/create-repositories.d.ts +403 -0
- package/lib/bootstrap/create-repositories.d.ts.map +1 -0
- package/lib/bootstrap/create-repositories.js +39 -0
- package/lib/bootstrap/create-repositories.js.map +1 -0
- package/lib/bootstrap/create-runtime.d.ts +8 -0
- package/lib/bootstrap/create-runtime.d.ts.map +1 -0
- package/lib/bootstrap/create-runtime.js +10 -0
- package/lib/bootstrap/create-runtime.js.map +1 -0
- package/lib/bootstrap/create-services.d.ts +52 -0
- package/lib/bootstrap/create-services.d.ts.map +1 -0
- package/lib/bootstrap/create-services.js +79 -0
- package/lib/bootstrap/create-services.js.map +1 -0
- package/lib/bootstrap/install-commands.d.ts +4 -0
- package/lib/bootstrap/install-commands.d.ts.map +1 -0
- package/lib/bootstrap/install-commands.js +322 -0
- package/lib/bootstrap/install-commands.js.map +1 -0
- package/lib/bootstrap/install-http.d.ts +7 -0
- package/lib/bootstrap/install-http.d.ts.map +1 -0
- package/lib/bootstrap/install-http.js +265 -0
- package/lib/bootstrap/install-http.js.map +1 -0
- package/lib/bootstrap/lifecycle.d.ts +14 -0
- package/lib/bootstrap/lifecycle.d.ts.map +1 -0
- package/lib/bootstrap/lifecycle.js +56 -0
- package/lib/bootstrap/lifecycle.js.map +1 -0
- package/lib/bootstrap/types.d.ts +9 -0
- package/lib/bootstrap/types.d.ts.map +1 -0
- package/lib/bootstrap/types.js +2 -0
- package/lib/bootstrap/types.js.map +1 -0
- package/lib/client.js +6 -0
- package/lib/client.js.map +1 -0
- package/lib/core/audit-service.d.ts +43 -0
- package/lib/core/audit-service.d.ts.map +1 -0
- package/lib/core/audit-service.js +75 -0
- package/lib/core/audit-service.js.map +1 -0
- package/lib/core/candidate-extractor.d.ts +31 -0
- package/lib/core/candidate-extractor.d.ts.map +1 -0
- package/lib/core/candidate-extractor.js +83 -0
- package/lib/core/candidate-extractor.js.map +1 -0
- package/lib/core/candidate-service.d.ts +72 -0
- package/lib/core/candidate-service.d.ts.map +1 -0
- package/lib/core/candidate-service.js +283 -0
- package/lib/core/candidate-service.js.map +1 -0
- package/lib/core/character-service.d.ts +26 -0
- package/lib/core/character-service.d.ts.map +1 -0
- package/lib/core/character-service.js +68 -0
- package/lib/core/character-service.js.map +1 -0
- package/lib/core/chat-file-io.d.ts +28 -0
- package/lib/core/chat-file-io.d.ts.map +1 -0
- package/lib/core/chat-file-io.js +114 -0
- package/lib/core/chat-file-io.js.map +1 -0
- package/lib/core/chat-service.d.ts +4 -0
- package/lib/core/chat-service.d.ts.map +1 -0
- package/lib/core/chat-service.js +3 -0
- package/lib/core/chat-service.js.map +1 -0
- package/lib/core/command-arguments.d.ts +2 -0
- package/lib/core/command-arguments.d.ts.map +1 -0
- package/lib/core/command-arguments.js +42 -0
- package/lib/core/command-arguments.js.map +1 -0
- package/lib/core/companion-child-agent-service.d.ts +3 -0
- package/lib/core/companion-child-agent-service.d.ts.map +1 -0
- package/lib/core/companion-child-agent-service.js +3 -0
- package/lib/core/companion-child-agent-service.js.map +1 -0
- package/lib/core/companion-invocation-service.d.ts +3 -0
- package/lib/core/companion-invocation-service.d.ts.map +1 -0
- package/lib/core/companion-invocation-service.js +3 -0
- package/lib/core/companion-invocation-service.js.map +1 -0
- package/lib/core/companion-profile-service.d.ts +3 -0
- package/lib/core/companion-profile-service.d.ts.map +1 -0
- package/lib/core/companion-profile-service.js +3 -0
- package/lib/core/companion-profile-service.js.map +1 -0
- package/lib/core/companion-promotion-service.d.ts +3 -0
- package/lib/core/companion-promotion-service.d.ts.map +1 -0
- package/lib/core/companion-promotion-service.js +3 -0
- package/lib/core/companion-promotion-service.js.map +1 -0
- package/lib/core/context-assembler.d.ts +92 -0
- package/lib/core/context-assembler.d.ts.map +1 -0
- package/lib/core/context-assembler.js +185 -0
- package/lib/core/context-assembler.js.map +1 -0
- package/lib/core/conversation-repository.d.ts +42 -0
- package/lib/core/conversation-repository.d.ts.map +1 -0
- package/lib/core/conversation-repository.js +94 -0
- package/lib/core/conversation-repository.js.map +1 -0
- package/lib/core/group-chat-execution-service.d.ts +3 -0
- package/lib/core/group-chat-execution-service.d.ts.map +1 -0
- package/lib/core/group-chat-execution-service.js +3 -0
- package/lib/core/group-chat-execution-service.js.map +1 -0
- package/lib/core/group-chat-orchestrator.d.ts +3 -0
- package/lib/core/group-chat-orchestrator.d.ts.map +1 -0
- package/lib/core/group-chat-orchestrator.js +3 -0
- package/lib/core/group-chat-orchestrator.js.map +1 -0
- package/lib/core/memory-retriever.d.ts +3 -0
- package/lib/core/memory-retriever.d.ts.map +1 -0
- package/lib/core/memory-retriever.js +3 -0
- package/lib/core/memory-retriever.js.map +1 -0
- package/lib/core/memory-service.d.ts +3 -0
- package/lib/core/memory-service.d.ts.map +1 -0
- package/lib/core/memory-service.js +3 -0
- package/lib/core/memory-service.js.map +1 -0
- package/lib/core/personality-candidate-service.d.ts +46 -0
- package/lib/core/personality-candidate-service.d.ts.map +1 -0
- package/lib/core/personality-candidate-service.js +65 -0
- package/lib/core/personality-candidate-service.js.map +1 -0
- package/lib/core/prompt-assembler.d.ts +43 -0
- package/lib/core/prompt-assembler.d.ts.map +1 -0
- package/lib/core/prompt-assembler.js +67 -0
- package/lib/core/prompt-assembler.js.map +1 -0
- package/lib/core/relationship-event-service.d.ts +3 -0
- package/lib/core/relationship-event-service.d.ts.map +1 -0
- package/lib/core/relationship-event-service.js +3 -0
- package/lib/core/relationship-event-service.js.map +1 -0
- package/lib/core/relationship-policy.d.ts +3 -0
- package/lib/core/relationship-policy.d.ts.map +1 -0
- package/lib/core/relationship-policy.js +3 -0
- package/lib/core/relationship-policy.js.map +1 -0
- package/lib/core/relationship-projection.d.ts +3 -0
- package/lib/core/relationship-projection.d.ts.map +1 -0
- package/lib/core/relationship-projection.js +3 -0
- package/lib/core/relationship-projection.js.map +1 -0
- package/lib/core/relationship-service.d.ts +3 -0
- package/lib/core/relationship-service.d.ts.map +1 -0
- package/lib/core/relationship-service.js +3 -0
- package/lib/core/relationship-service.js.map +1 -0
- package/lib/core/roleplay-contract.d.ts +11 -0
- package/lib/core/roleplay-contract.d.ts.map +1 -0
- package/lib/core/roleplay-contract.js +27 -0
- package/lib/core/roleplay-contract.js.map +1 -0
- package/lib/core/runtime-binding-service.d.ts +19 -0
- package/lib/core/runtime-binding-service.d.ts.map +1 -0
- package/lib/core/runtime-binding-service.js +66 -0
- package/lib/core/runtime-binding-service.js.map +1 -0
- package/lib/core/scene-service.d.ts +60 -0
- package/lib/core/scene-service.d.ts.map +1 -0
- package/lib/core/scene-service.js +212 -0
- package/lib/core/scene-service.js.map +1 -0
- package/lib/core/session-binding-service.d.ts +51 -0
- package/lib/core/session-binding-service.d.ts.map +1 -0
- package/lib/core/session-binding-service.js +106 -0
- package/lib/core/session-binding-service.js.map +1 -0
- package/lib/core/skill-service.d.ts +82 -0
- package/lib/core/skill-service.d.ts.map +1 -0
- package/lib/core/skill-service.js +45 -0
- package/lib/core/skill-service.js.map +1 -0
- package/lib/core/tavern-session-bridge.d.ts +3 -0
- package/lib/core/tavern-session-bridge.d.ts.map +1 -0
- package/lib/core/tavern-session-bridge.js +3 -0
- package/lib/core/tavern-session-bridge.js.map +1 -0
- package/lib/core/user-resolver.d.ts +15 -0
- package/lib/core/user-resolver.d.ts.map +1 -0
- package/lib/core/user-resolver.js +17 -0
- package/lib/core/user-resolver.js.map +1 -0
- package/lib/core/workspace-service.d.ts +3 -0
- package/lib/core/workspace-service.d.ts.map +1 -0
- package/lib/core/workspace-service.js +3 -0
- package/lib/core/workspace-service.js.map +1 -0
- package/lib/core/workspace-session-service.d.ts +11 -0
- package/lib/core/workspace-session-service.d.ts.map +1 -0
- package/lib/core/workspace-session-service.js +14 -0
- package/lib/core/workspace-session-service.js.map +1 -0
- package/lib/domain/schemas.d.ts +1173 -0
- package/lib/domain/schemas.d.ts.map +1 -0
- package/lib/domain/schemas.js +590 -0
- package/lib/domain/schemas.js.map +1 -0
- package/lib/domain/spec.d.ts +494 -0
- package/lib/domain/spec.d.ts.map +1 -0
- package/lib/domain/spec.js +63 -0
- package/lib/domain/spec.js.map +1 -0
- package/lib/import/artifact-service.d.ts +33 -0
- package/lib/import/artifact-service.d.ts.map +1 -0
- package/lib/import/artifact-service.js +67 -0
- package/lib/import/artifact-service.js.map +1 -0
- package/lib/import/import-service.d.ts +30 -0
- package/lib/import/import-service.d.ts.map +1 -0
- package/lib/import/import-service.js +154 -0
- package/lib/import/import-service.js.map +1 -0
- package/lib/import/parser.d.ts +81 -0
- package/lib/import/parser.d.ts.map +1 -0
- package/lib/import/parser.js +423 -0
- package/lib/import/parser.js.map +1 -0
- package/lib/index.d.ts +60 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +111 -0
- package/lib/index.js.map +1 -0
- package/lib/infrastructure/dsh/llm/llm-port.d.ts +3 -0
- package/lib/infrastructure/dsh/llm/llm-port.d.ts.map +1 -0
- package/lib/infrastructure/dsh/llm/llm-port.js +2 -0
- package/lib/infrastructure/dsh/llm/llm-port.js.map +1 -0
- package/lib/infrastructure/dsh/llm/model-gateway.d.ts +10 -0
- package/lib/infrastructure/dsh/llm/model-gateway.d.ts.map +1 -0
- package/lib/infrastructure/dsh/llm/model-gateway.js +21 -0
- package/lib/infrastructure/dsh/llm/model-gateway.js.map +1 -0
- package/lib/infrastructure/dsh/session/session-agent-provider.d.ts +28 -0
- package/lib/infrastructure/dsh/session/session-agent-provider.d.ts.map +1 -0
- package/lib/infrastructure/dsh/session/session-agent-provider.js +40 -0
- package/lib/infrastructure/dsh/session/session-agent-provider.js.map +1 -0
- package/lib/infrastructure/dsh/session/tavern-session-bridge.d.ts +142 -0
- package/lib/infrastructure/dsh/session/tavern-session-bridge.d.ts.map +1 -0
- package/lib/infrastructure/dsh/session/tavern-session-bridge.js +544 -0
- package/lib/infrastructure/dsh/session/tavern-session-bridge.js.map +1 -0
- package/lib/infrastructure/dsh/subagent/subagent-gateway.d.ts +63 -0
- package/lib/infrastructure/dsh/subagent/subagent-gateway.d.ts.map +1 -0
- package/lib/infrastructure/dsh/subagent/subagent-gateway.js +70 -0
- package/lib/infrastructure/dsh/subagent/subagent-gateway.js.map +1 -0
- package/lib/infrastructure/runtime/companion-runtime.d.ts +128 -0
- package/lib/infrastructure/runtime/companion-runtime.d.ts.map +1 -0
- package/lib/infrastructure/runtime/companion-runtime.js +127 -0
- package/lib/infrastructure/runtime/companion-runtime.js.map +1 -0
- package/lib/infrastructure/runtime/runtime-factory.d.ts +10 -0
- package/lib/infrastructure/runtime/runtime-factory.d.ts.map +1 -0
- package/lib/infrastructure/runtime/runtime-factory.js +14 -0
- package/lib/infrastructure/runtime/runtime-factory.js.map +1 -0
- package/lib/interfaces/http/chat/chat-http.d.ts +23 -0
- package/lib/interfaces/http/chat/chat-http.d.ts.map +1 -0
- package/lib/interfaces/http/chat/chat-http.js +310 -0
- package/lib/interfaces/http/chat/chat-http.js.map +1 -0
- package/lib/interfaces/http/companion/companion-http.d.ts +8 -0
- package/lib/interfaces/http/companion/companion-http.d.ts.map +1 -0
- package/lib/interfaces/http/companion/companion-http.js +76 -0
- package/lib/interfaces/http/companion/companion-http.js.map +1 -0
- package/lib/interfaces/http/companion/promotion-http.d.ts +6 -0
- package/lib/interfaces/http/companion/promotion-http.d.ts.map +1 -0
- package/lib/interfaces/http/companion/promotion-http.js +25 -0
- package/lib/interfaces/http/companion/promotion-http.js.map +1 -0
- package/lib/interfaces/http/companion/runtime-http.d.ts +13 -0
- package/lib/interfaces/http/companion/runtime-http.d.ts.map +1 -0
- package/lib/interfaces/http/companion/runtime-http.js +51 -0
- package/lib/interfaces/http/companion/runtime-http.js.map +1 -0
- package/lib/interfaces/http/companion/stage4-companion-http.d.ts +30 -0
- package/lib/interfaces/http/companion/stage4-companion-http.d.ts.map +1 -0
- package/lib/interfaces/http/companion/stage4-companion-http.js +149 -0
- package/lib/interfaces/http/companion/stage4-companion-http.js.map +1 -0
- package/lib/interfaces/http/group/group-http.d.ts +11 -0
- package/lib/interfaces/http/group/group-http.d.ts.map +1 -0
- package/lib/interfaces/http/group/group-http.js +77 -0
- package/lib/interfaces/http/group/group-http.js.map +1 -0
- package/lib/interfaces/http/memory/candidate-http.d.ts +8 -0
- package/lib/interfaces/http/memory/candidate-http.d.ts.map +1 -0
- package/lib/interfaces/http/memory/candidate-http.js +86 -0
- package/lib/interfaces/http/memory/candidate-http.js.map +1 -0
- package/lib/interfaces/http/relationship/companion-relationship-http.d.ts +7 -0
- package/lib/interfaces/http/relationship/companion-relationship-http.d.ts.map +1 -0
- package/lib/interfaces/http/relationship/companion-relationship-http.js +30 -0
- package/lib/interfaces/http/relationship/companion-relationship-http.js.map +1 -0
- package/lib/interfaces/http/workspace/workspace-http.d.ts +19 -0
- package/lib/interfaces/http/workspace/workspace-http.d.ts.map +1 -0
- package/lib/interfaces/http/workspace/workspace-http.js +78 -0
- package/lib/interfaces/http/workspace/workspace-http.js.map +1 -0
- package/lib/interfaces/read-model/tavern-read-api.d.ts +44 -0
- package/lib/interfaces/read-model/tavern-read-api.d.ts.map +1 -0
- package/lib/interfaces/read-model/tavern-read-api.js +189 -0
- package/lib/interfaces/read-model/tavern-read-api.js.map +1 -0
- package/lib/remote/candidate-api.d.ts +3 -0
- package/lib/remote/candidate-api.d.ts.map +1 -0
- package/lib/remote/candidate-api.js +3 -0
- package/lib/remote/candidate-api.js.map +1 -0
- package/lib/remote/chat-api.d.ts +3 -0
- package/lib/remote/chat-api.d.ts.map +1 -0
- package/lib/remote/chat-api.js +3 -0
- package/lib/remote/chat-api.js.map +1 -0
- package/lib/remote/companion-api.d.ts +3 -0
- package/lib/remote/companion-api.d.ts.map +1 -0
- package/lib/remote/companion-api.js +3 -0
- package/lib/remote/companion-api.js.map +1 -0
- package/lib/remote/companion-promotion-api.d.ts +3 -0
- package/lib/remote/companion-promotion-api.d.ts.map +1 -0
- package/lib/remote/companion-promotion-api.js +3 -0
- package/lib/remote/companion-promotion-api.js.map +1 -0
- package/lib/remote/import-http.d.ts +29 -0
- package/lib/remote/import-http.d.ts.map +1 -0
- package/lib/remote/import-http.js +106 -0
- package/lib/remote/import-http.js.map +1 -0
- package/lib/remote/stage4-api.d.ts +6 -0
- package/lib/remote/stage4-api.d.ts.map +1 -0
- package/lib/remote/stage4-api.js +4 -0
- package/lib/remote/stage4-api.js.map +1 -0
- package/lib/remote/stage5-runtime-api.d.ts +4 -0
- package/lib/remote/stage5-runtime-api.d.ts.map +1 -0
- package/lib/remote/stage5-runtime-api.js +2 -0
- package/lib/remote/stage5-runtime-api.js.map +1 -0
- package/lib/remote/stage6-group-api.d.ts +4 -0
- package/lib/remote/stage6-group-api.d.ts.map +1 -0
- package/lib/remote/stage6-group-api.js +2 -0
- package/lib/remote/stage6-group-api.js.map +1 -0
- package/lib/remote/tavern-api.d.ts +3 -0
- package/lib/remote/tavern-api.d.ts.map +1 -0
- package/lib/remote/tavern-api.js +3 -0
- package/lib/remote/tavern-api.js.map +1 -0
- package/lib/runtime/agent-orchestrator.d.ts +3 -0
- package/lib/runtime/agent-orchestrator.d.ts.map +1 -0
- package/lib/runtime/agent-orchestrator.js +3 -0
- package/lib/runtime/agent-orchestrator.js.map +1 -0
- package/lib/runtime/companion-runtime.d.ts +3 -0
- package/lib/runtime/companion-runtime.d.ts.map +1 -0
- package/lib/runtime/companion-runtime.js +3 -0
- package/lib/runtime/companion-runtime.js.map +1 -0
- package/lib/runtime/langgraph-graph.d.ts +32 -0
- package/lib/runtime/langgraph-graph.d.ts.map +1 -0
- package/lib/runtime/langgraph-graph.js +32 -0
- package/lib/runtime/langgraph-graph.js.map +1 -0
- package/lib/runtime/state.d.ts +38 -0
- package/lib/runtime/state.d.ts.map +1 -0
- package/lib/runtime/state.js +16 -0
- package/lib/runtime/state.js.map +1 -0
- package/lib/seed/elaine.d.ts +9 -0
- package/lib/seed/elaine.d.ts.map +1 -0
- package/lib/seed/elaine.js +27 -0
- package/lib/seed/elaine.js.map +1 -0
- package/lib/tools/import-character.d.ts +16 -0
- package/lib/tools/import-character.d.ts.map +1 -0
- package/lib/tools/import-character.js +98 -0
- package/lib/tools/import-character.js.map +1 -0
- package/package.json +108 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ContextAssembler —— 世界书 + 记忆上下文组装(阶段 4 + 5.2)。
|
|
3
|
+
*
|
|
4
|
+
* 每次 summon / followup 前调用:按用户消息检索角色世界书的关键词条目与
|
|
5
|
+
* 独立记忆(MemoryService.recall),稳定排序(Lore 优先,Memory 次之),
|
|
6
|
+
* 按条目数与字符预算截断,生成注入的 ContentBlock[] 与确定性 fingerprint
|
|
7
|
+
* (审计用)。记忆块格式遵循产品文档:
|
|
8
|
+
* <context source="tavern:memory">\n- fact\n- fact\n</context>
|
|
9
|
+
* 位于 Lore 块之后、用户消息之前。
|
|
10
|
+
*
|
|
11
|
+
* 注意:constant(始终激活)世界书条目在导入时已并入 persona,不参与检索;
|
|
12
|
+
* 本模块只处理**非 constant 的触发条目**(社区卡的世界书主体内容)。
|
|
13
|
+
*/
|
|
14
|
+
import { createHash } from 'node:crypto';
|
|
15
|
+
/** 默认注入预算:最多 5 条 / 2000 字符。 */
|
|
16
|
+
export const DEFAULT_MAX_LORE_ENTRIES = 5;
|
|
17
|
+
export const DEFAULT_MAX_LORE_CHARS = 2000;
|
|
18
|
+
/** 记忆注入预算:最多 3 条 / 1000 字符。 */
|
|
19
|
+
export const DEFAULT_MAX_MEMORY_ENTRIES = 3;
|
|
20
|
+
export const DEFAULT_MAX_MEMORY_CHARS = 1000;
|
|
21
|
+
/** 单个关键词是否命中(contains=子串;word=完整词 \b 边界)。 */
|
|
22
|
+
export function keyMatches(entry, key, message) {
|
|
23
|
+
const haystack = entry.caseSensitive ? message : message.toLocaleLowerCase();
|
|
24
|
+
const needle = entry.caseSensitive ? key : key.toLocaleLowerCase();
|
|
25
|
+
if (needle === '')
|
|
26
|
+
return false;
|
|
27
|
+
if (entry.matchMode === 'word') {
|
|
28
|
+
const escaped = needle.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&');
|
|
29
|
+
return new RegExp(`(^|[^\\p{L}\\p{N}_])${escaped}(?=$|[^\\p{L}\\p{N}_])`, 'u').test(haystack);
|
|
30
|
+
}
|
|
31
|
+
return haystack.includes(needle);
|
|
32
|
+
}
|
|
33
|
+
/** 检索 + 排序 + 截断的纯函数(单元测试核心)。 */
|
|
34
|
+
export function selectLoreEntries(lorebook, userMessage, maxEntries, maxChars) {
|
|
35
|
+
if (lorebook === undefined || userMessage.trim() === '') {
|
|
36
|
+
return { entries: [], matched: [], requested: 0, kept: 0, keptChars: 0 };
|
|
37
|
+
}
|
|
38
|
+
const hits = [];
|
|
39
|
+
for (const entry of lorebook.entries) {
|
|
40
|
+
// constant(始终激活)条目已并入 persona,不参与检索注入,避免重复。
|
|
41
|
+
if (!entry.enabled || entry.constant)
|
|
42
|
+
continue;
|
|
43
|
+
for (const key of entry.keys) {
|
|
44
|
+
if (keyMatches(entry, key, userMessage)) {
|
|
45
|
+
hits.push({ entry, key });
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// 稳定排序:priority DESC,id ASC
|
|
51
|
+
const sorted = hits
|
|
52
|
+
.map(item => item.entry)
|
|
53
|
+
.sort((a, b) => (b.priority - a.priority) || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
|
|
54
|
+
// 截断:条目数与字符预算
|
|
55
|
+
const kept = [];
|
|
56
|
+
let keptChars = 0;
|
|
57
|
+
for (const entry of sorted) {
|
|
58
|
+
if (kept.length >= maxEntries)
|
|
59
|
+
break;
|
|
60
|
+
if (keptChars + entry.content.length > maxChars && kept.length > 0)
|
|
61
|
+
break;
|
|
62
|
+
kept.push(entry);
|
|
63
|
+
keptChars += entry.content.length;
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
entries: kept,
|
|
67
|
+
matched: hits.map(item => ({ entryId: item.entry.id, key: item.key })),
|
|
68
|
+
requested: sorted.length,
|
|
69
|
+
kept: kept.length,
|
|
70
|
+
keptChars,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/** 命中条目 → 注入的 ContentBlock[](每条一个块,带关键词标注)。 */
|
|
74
|
+
export function buildLoreContentBlocks(entries) {
|
|
75
|
+
return entries.map(entry => ({
|
|
76
|
+
type: 'text',
|
|
77
|
+
text: `【世界书 · ${entry.keys.join(' / ')}】\n${entry.content}`,
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
80
|
+
/** 记忆字符预算截断(salience 已在 recall 内排序;首条超长仍保留)。 */
|
|
81
|
+
export function truncateMemoriesByChars(entries, maxChars) {
|
|
82
|
+
const kept = [];
|
|
83
|
+
let keptChars = 0;
|
|
84
|
+
for (const memory of entries) {
|
|
85
|
+
if (kept.length > 0 && keptChars + memory.fact.length > maxChars)
|
|
86
|
+
break;
|
|
87
|
+
kept.push(memory);
|
|
88
|
+
keptChars += memory.fact.length;
|
|
89
|
+
}
|
|
90
|
+
return kept;
|
|
91
|
+
}
|
|
92
|
+
/** 记忆 → 注入块(单块,格式见文件头文档)。 */
|
|
93
|
+
export function buildMemoryContextBlock(entries) {
|
|
94
|
+
if (entries.length === 0)
|
|
95
|
+
return undefined;
|
|
96
|
+
const lines = entries.map(memory => `- ${memory.fact}`).join('\n');
|
|
97
|
+
return { type: 'text', text: `<context source="tavern:memory">\n${lines}\n</context>` };
|
|
98
|
+
}
|
|
99
|
+
/** 确定性指纹:sha256(characterId|message|entryIds|contents)。 */
|
|
100
|
+
export function loreFingerprint(characterId, userMessage, entries) {
|
|
101
|
+
const material = [
|
|
102
|
+
characterId,
|
|
103
|
+
userMessage,
|
|
104
|
+
...entries.map(entry => `${entry.id}:${entry.content}`),
|
|
105
|
+
].join('|');
|
|
106
|
+
return createHash('sha256').update(material, 'utf8').digest('hex').slice(0, 16);
|
|
107
|
+
}
|
|
108
|
+
/** 确定性指纹:sha256(characterId|message|memoryIds|facts)。 */
|
|
109
|
+
export function memoryFingerprint(characterId, userMessage, entries) {
|
|
110
|
+
const material = [
|
|
111
|
+
characterId,
|
|
112
|
+
userMessage,
|
|
113
|
+
...entries.map(memory => `${memory.id}:${memory.fact}`),
|
|
114
|
+
].join('|');
|
|
115
|
+
return createHash('sha256').update(material, 'utf8').digest('hex').slice(0, 16);
|
|
116
|
+
}
|
|
117
|
+
/** 带存储的组装器:characterId → 角色 → lorebookIds[0] → 世界书 → 记忆 → 注入。 */
|
|
118
|
+
export class ContextAssembler {
|
|
119
|
+
#characters;
|
|
120
|
+
#lorebooks;
|
|
121
|
+
#memories;
|
|
122
|
+
constructor(characters, lorebooks, memories) {
|
|
123
|
+
this.#characters = characters;
|
|
124
|
+
this.#lorebooks = lorebooks;
|
|
125
|
+
this.#memories = memories;
|
|
126
|
+
}
|
|
127
|
+
/** 角色的世界书(未绑定或不存在返回 undefined)。 */
|
|
128
|
+
lorebookOf(characterId) {
|
|
129
|
+
const character = this.#characters.get(characterId);
|
|
130
|
+
const lorebookId = character?.lorebookIds[0];
|
|
131
|
+
if (lorebookId === undefined)
|
|
132
|
+
return undefined;
|
|
133
|
+
return this.#lorebooks.get(lorebookId);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* 组装一次投递的世界书 + 记忆上下文。空消息 / 无世界书 / 无命中均返回
|
|
137
|
+
* 空结果(不抛异常);fingerprint 在空结果时也确定性可算。
|
|
138
|
+
* 顺序:Lore 块在前,Memory 块在后(均位于用户消息之前)。
|
|
139
|
+
*/
|
|
140
|
+
async assemble(params) {
|
|
141
|
+
const maxEntries = params.maxLoreEntries ?? DEFAULT_MAX_LORE_ENTRIES;
|
|
142
|
+
const maxChars = params.maxLoreChars ?? DEFAULT_MAX_LORE_CHARS;
|
|
143
|
+
const maxMemoryEntries = params.maxMemoryEntries ?? DEFAULT_MAX_MEMORY_ENTRIES;
|
|
144
|
+
const maxMemoryChars = params.maxMemoryChars ?? DEFAULT_MAX_MEMORY_CHARS;
|
|
145
|
+
const lorebook = this.lorebookOf(params.characterId);
|
|
146
|
+
const selection = selectLoreEntries(lorebook, params.userMessage, maxEntries, maxChars);
|
|
147
|
+
// 阶段 3 M6:统一混合检索——将本轮用户消息作为 query,相关性 +
|
|
148
|
+
// salience + recency + 类别配额;pending 候选永远不在此处被召回。
|
|
149
|
+
const recalled = await this.#memories.retrieve({
|
|
150
|
+
characterId: params.characterId,
|
|
151
|
+
query: params.userMessage,
|
|
152
|
+
...(params.sceneId === undefined ? {} : { sceneId: params.sceneId }),
|
|
153
|
+
limit: maxMemoryEntries,
|
|
154
|
+
updateAccess: false,
|
|
155
|
+
});
|
|
156
|
+
const keptMemory = truncateMemoriesByChars(recalled.map(hit => hit.memory), maxMemoryChars);
|
|
157
|
+
const memoryBlock = buildMemoryContextBlock(keptMemory);
|
|
158
|
+
const contentBlocks = [
|
|
159
|
+
...buildLoreContentBlocks(selection.entries),
|
|
160
|
+
...(memoryBlock === undefined ? [] : [memoryBlock]),
|
|
161
|
+
];
|
|
162
|
+
const fingerprint = [
|
|
163
|
+
loreFingerprint(params.characterId, params.userMessage, selection.entries),
|
|
164
|
+
memoryFingerprint(params.characterId, params.userMessage, keptMemory),
|
|
165
|
+
].join(':');
|
|
166
|
+
return {
|
|
167
|
+
injectedLore: selection.entries,
|
|
168
|
+
injectedMemory: keptMemory,
|
|
169
|
+
matched: selection.matched,
|
|
170
|
+
contentBlocks,
|
|
171
|
+
fingerprint,
|
|
172
|
+
truncated: {
|
|
173
|
+
requested: selection.requested,
|
|
174
|
+
kept: selection.kept,
|
|
175
|
+
keptChars: selection.keptChars,
|
|
176
|
+
},
|
|
177
|
+
memoryTruncated: {
|
|
178
|
+
requested: recalled.length,
|
|
179
|
+
kept: keptMemory.length,
|
|
180
|
+
keptChars: keptMemory.reduce((sum, memory) => sum + memory.fact.length, 0),
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=context-assembler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-assembler.js","sourceRoot":"","sources":["../../src/core/context-assembler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConversationRepository —— 普通聊天的领域事实源(阶段 1,ADR-003)。
|
|
3
|
+
*
|
|
4
|
+
* Conversation / ConversationMessage 是 Tavern 自己存储的消息树:
|
|
5
|
+
* parentMessageId 原生支持编辑/重新生成/swipe/分支;DSH 会话只作呈现通道。
|
|
6
|
+
* 乐观并发:updateActiveLeaf 用 expectedActiveLeafId 做 CAS(ADR-003 §5)。
|
|
7
|
+
*/
|
|
8
|
+
import type { KvTable } from '@deepseek-ai/dsh-storage-domain';
|
|
9
|
+
import type { Conversation, ConversationMessage } from '../domain/schemas.js';
|
|
10
|
+
export interface ConversationRepository {
|
|
11
|
+
create(conversation: Omit<Conversation, 'createdAt' | 'updatedAt'>): Promise<Conversation>;
|
|
12
|
+
get(id: string): Promise<Conversation | null>;
|
|
13
|
+
update(id: string, updates: Partial<Conversation>): Promise<Conversation>;
|
|
14
|
+
listByUser(userId: string): Promise<Conversation[]>;
|
|
15
|
+
updateByCharacter(characterId: string, updates: Partial<Conversation>): Promise<number>;
|
|
16
|
+
addMessage(message: Omit<ConversationMessage, 'createdAt'> & {
|
|
17
|
+
createdAt?: string;
|
|
18
|
+
}): Promise<ConversationMessage>;
|
|
19
|
+
getMessage(id: string): Promise<ConversationMessage | null>;
|
|
20
|
+
updateMessage(id: string, updates: Partial<ConversationMessage>): Promise<ConversationMessage>;
|
|
21
|
+
getMessageTree(conversationId: string): Promise<ConversationMessage[]>;
|
|
22
|
+
getActiveLeaf(conversationId: string): Promise<ConversationMessage | null>;
|
|
23
|
+
updateActiveLeaf(conversationId: string, messageId: string, expectedActiveLeafId?: string): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
export declare class KvTableConversationRepository implements ConversationRepository {
|
|
26
|
+
#private;
|
|
27
|
+
constructor(conversationTable: KvTable<string, Conversation>, messageTable: KvTable<string, ConversationMessage>);
|
|
28
|
+
create(input: Omit<Conversation, 'createdAt' | 'updatedAt'>): Promise<Conversation>;
|
|
29
|
+
get(id: string): Promise<Conversation | null>;
|
|
30
|
+
update(id: string, updates: Partial<Conversation>): Promise<Conversation>;
|
|
31
|
+
listByUser(userId: string): Promise<Conversation[]>;
|
|
32
|
+
updateByCharacter(characterId: string, updates: Partial<Conversation>): Promise<number>;
|
|
33
|
+
addMessage(input: Omit<ConversationMessage, 'createdAt'> & {
|
|
34
|
+
createdAt?: string;
|
|
35
|
+
}): Promise<ConversationMessage>;
|
|
36
|
+
getMessage(id: string): Promise<ConversationMessage | null>;
|
|
37
|
+
getMessageTree(conversationId: string): Promise<ConversationMessage[]>;
|
|
38
|
+
updateMessage(id: string, updates: Partial<ConversationMessage>): Promise<ConversationMessage>;
|
|
39
|
+
getActiveLeaf(conversationId: string): Promise<ConversationMessage | null>;
|
|
40
|
+
updateActiveLeaf(conversationId: string, messageId: string, expectedActiveLeafId?: string): Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=conversation-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-repository.d.ts","sourceRoot":"","sources":["../../src/core/conversation-repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConversationRepository —— 普通聊天的领域事实源(阶段 1,ADR-003)。
|
|
3
|
+
*
|
|
4
|
+
* Conversation / ConversationMessage 是 Tavern 自己存储的消息树:
|
|
5
|
+
* parentMessageId 原生支持编辑/重新生成/swipe/分支;DSH 会话只作呈现通道。
|
|
6
|
+
* 乐观并发:updateActiveLeaf 用 expectedActiveLeafId 做 CAS(ADR-003 §5)。
|
|
7
|
+
*/
|
|
8
|
+
export class KvTableConversationRepository {
|
|
9
|
+
#conversations;
|
|
10
|
+
#messages;
|
|
11
|
+
constructor(conversationTable, messageTable) {
|
|
12
|
+
this.#conversations = conversationTable;
|
|
13
|
+
this.#messages = messageTable;
|
|
14
|
+
}
|
|
15
|
+
async create(input) {
|
|
16
|
+
const now = new Date().toISOString();
|
|
17
|
+
const conversation = { ...input, createdAt: now, updatedAt: now };
|
|
18
|
+
await this.#conversations.put(input.id, conversation);
|
|
19
|
+
return conversation;
|
|
20
|
+
}
|
|
21
|
+
get(id) {
|
|
22
|
+
return Promise.resolve(this.#conversations.get(id) ?? null);
|
|
23
|
+
}
|
|
24
|
+
async update(id, updates) {
|
|
25
|
+
const current = this.#conversations.get(id);
|
|
26
|
+
if (current === undefined)
|
|
27
|
+
throw new Error(`[Tavern] Conversation 不存在:${id}`);
|
|
28
|
+
const next = { ...current, ...updates, updatedAt: new Date().toISOString() };
|
|
29
|
+
await this.#conversations.put(id, next);
|
|
30
|
+
return next;
|
|
31
|
+
}
|
|
32
|
+
async listByUser(userId) {
|
|
33
|
+
const result = [];
|
|
34
|
+
for (const [, conversation] of this.#conversations.entries()) {
|
|
35
|
+
if (conversation.ownerUserId === userId)
|
|
36
|
+
result.push(conversation);
|
|
37
|
+
}
|
|
38
|
+
// 更新时间倒序;同时间按 id 倒序(确定性 tie-break,便于测试与稳定展示)。
|
|
39
|
+
result.sort((a, b) => (a.updatedAt > b.updatedAt ? -1 : a.updatedAt < b.updatedAt ? 1
|
|
40
|
+
: (a.id > b.id ? -1 : a.id < b.id ? 1 : 0)));
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
async updateByCharacter(characterId, updates) {
|
|
44
|
+
let updated = 0;
|
|
45
|
+
for (const [id, conversation] of this.#conversations.entries()) {
|
|
46
|
+
if (conversation.characterId !== characterId)
|
|
47
|
+
continue;
|
|
48
|
+
await this.#conversations.put(id, { ...conversation, ...updates, updatedAt: new Date().toISOString() });
|
|
49
|
+
updated += 1;
|
|
50
|
+
}
|
|
51
|
+
return updated;
|
|
52
|
+
}
|
|
53
|
+
async addMessage(input) {
|
|
54
|
+
const message = { ...input, createdAt: input.createdAt ?? new Date().toISOString() };
|
|
55
|
+
await this.#messages.put(input.id, message);
|
|
56
|
+
return message;
|
|
57
|
+
}
|
|
58
|
+
getMessage(id) {
|
|
59
|
+
return Promise.resolve(this.#messages.get(id) ?? null);
|
|
60
|
+
}
|
|
61
|
+
async getMessageTree(conversationId) {
|
|
62
|
+
const result = [];
|
|
63
|
+
for (const [, message] of this.#messages.entries()) {
|
|
64
|
+
if (message.conversationId === conversationId)
|
|
65
|
+
result.push(message);
|
|
66
|
+
}
|
|
67
|
+
result.sort((a, b) => (a.createdAt < b.createdAt ? -1 : a.createdAt > b.createdAt ? 1 : 0));
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
async updateMessage(id, updates) {
|
|
71
|
+
const current = this.#messages.get(id);
|
|
72
|
+
if (current === undefined)
|
|
73
|
+
throw new Error(`[Tavern] 消息不存在:${id}`);
|
|
74
|
+
const next = { ...current, ...updates };
|
|
75
|
+
await this.#messages.put(id, next);
|
|
76
|
+
return next;
|
|
77
|
+
}
|
|
78
|
+
async getActiveLeaf(conversationId) {
|
|
79
|
+
const conversation = this.#conversations.get(conversationId);
|
|
80
|
+
if (conversation === undefined || conversation.activeLeafMessageId === undefined)
|
|
81
|
+
return null;
|
|
82
|
+
return this.getMessage(conversation.activeLeafMessageId);
|
|
83
|
+
}
|
|
84
|
+
async updateActiveLeaf(conversationId, messageId, expectedActiveLeafId) {
|
|
85
|
+
// KvTable.update 在 domain 写链上原子执行:CAS 校验 + 更新。
|
|
86
|
+
await this.#conversations.update(conversationId, current => {
|
|
87
|
+
if (expectedActiveLeafId !== undefined && current.activeLeafMessageId !== expectedActiveLeafId) {
|
|
88
|
+
throw new Error(`[Tavern] active leaf 已被其他分支更新(期望 ${expectedActiveLeafId},实际 ${current.activeLeafMessageId ?? '<无>'})`);
|
|
89
|
+
}
|
|
90
|
+
return { ...current, activeLeafMessageId: messageId, updatedAt: new Date().toISOString() };
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=conversation-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-repository.js","sourceRoot":"","sources":["../../src/core/conversation-repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-chat-execution-service.d.ts","sourceRoot":"","sources":["../../src/core/group-chat-execution-service.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,cAAc,2DAA2D,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-chat-execution-service.js","sourceRoot":"","sources":["../../src/core/group-chat-execution-service.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,cAAc,2DAA2D,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-chat-orchestrator.d.ts","sourceRoot":"","sources":["../../src/core/group-chat-orchestrator.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,cAAc,sDAAsD,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-chat-orchestrator.js","sourceRoot":"","sources":["../../src/core/group-chat-orchestrator.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,cAAc,sDAAsD,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-retriever.d.ts","sourceRoot":"","sources":["../../src/core/memory-retriever.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,cAAc,2CAA2C,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-retriever.js","sourceRoot":"","sources":["../../src/core/memory-retriever.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,cAAc,2CAA2C,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-service.d.ts","sourceRoot":"","sources":["../../src/core/memory-service.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,cAAc,yCAAyC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-service.js","sourceRoot":"","sources":["../../src/core/memory-service.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,cAAc,yCAAyC,CAAA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { KvTable } from '@deepseek-ai/dsh-storage-domain';
|
|
2
|
+
import type { AuditService } from './audit-service.js';
|
|
3
|
+
import type { CompanionProfile, PersonalityCandidate } from '../domain/schemas.js';
|
|
4
|
+
import { KvTableConversationRepository } from './conversation-repository.js';
|
|
5
|
+
export interface CreatePersonalityCandidateParams {
|
|
6
|
+
ownerUserId: string;
|
|
7
|
+
companionProfileId: string;
|
|
8
|
+
conversationId: string;
|
|
9
|
+
traitName: string;
|
|
10
|
+
description: string;
|
|
11
|
+
strength: number;
|
|
12
|
+
confidence: number;
|
|
13
|
+
sourceMessageIds: string[];
|
|
14
|
+
extractionVersion: string;
|
|
15
|
+
}
|
|
16
|
+
export declare class PersonalityCandidateService {
|
|
17
|
+
#private;
|
|
18
|
+
constructor(candidates: KvTable<string, PersonalityCandidate>, profiles: KvTable<string, CompanionProfile>, conversations: KvTableConversationRepository, audit: AuditService);
|
|
19
|
+
create(p: CreatePersonalityCandidateParams): Promise<PersonalityCandidate>;
|
|
20
|
+
listForUser(owner: string, profileId?: string): {
|
|
21
|
+
id: string;
|
|
22
|
+
ownerUserId: string;
|
|
23
|
+
companionProfileId: string;
|
|
24
|
+
conversationId: string;
|
|
25
|
+
traitName: string;
|
|
26
|
+
description: string;
|
|
27
|
+
strength: number;
|
|
28
|
+
confidence: number;
|
|
29
|
+
sourceMessageIds: string[];
|
|
30
|
+
extractionVersion: string;
|
|
31
|
+
status: "accepted" | "superseded" | "pending" | "rejected" | "evidence-invalid";
|
|
32
|
+
createdAt: string;
|
|
33
|
+
updatedAt: string;
|
|
34
|
+
reviewerUserId?: string | undefined;
|
|
35
|
+
reviewedAt?: string | undefined;
|
|
36
|
+
invalidationReason?: string | undefined;
|
|
37
|
+
invalidatedAt?: string | undefined;
|
|
38
|
+
supersedes?: string | undefined;
|
|
39
|
+
}[];
|
|
40
|
+
review(owner: string, id: string, decision: 'accept' | 'reject', edits?: {
|
|
41
|
+
traitName?: string;
|
|
42
|
+
description?: string;
|
|
43
|
+
strength?: number;
|
|
44
|
+
}): Promise<PersonalityCandidate>;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=personality-candidate-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"personality-candidate-service.d.ts","sourceRoot":"","sources":["../../src/core/personality-candidate-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAoB,MAAM,sBAAsB,CAAA;AACpG,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAA;AAE5E,MAAM,WAAW,gCAAgC;IAAG,WAAW,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE;AAClQ,qBAAa,2BAA2B;;gBAK1B,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAAE,aAAa,EAAE,6BAA6B,EAAE,KAAK,EAAE,YAAY;IAIvK,MAAM,CAAC,CAAC,EAAE,gCAAgC,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAahF,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;IACvC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAC,QAAQ,EAAE,KAAK,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAOjL"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { KvTableConversationRepository } from './conversation-repository.js';
|
|
3
|
+
export class PersonalityCandidateService {
|
|
4
|
+
#candidates;
|
|
5
|
+
#profiles;
|
|
6
|
+
#conversations;
|
|
7
|
+
#audit;
|
|
8
|
+
constructor(candidates, profiles, conversations, audit) {
|
|
9
|
+
this.#candidates = candidates;
|
|
10
|
+
this.#profiles = profiles;
|
|
11
|
+
this.#conversations = conversations;
|
|
12
|
+
this.#audit = audit;
|
|
13
|
+
}
|
|
14
|
+
#owned(owner, id) { const c = this.#candidates.get(id); if (!c || c.ownerUserId !== owner)
|
|
15
|
+
throw new Error('[Tavern] 性格候选不存在或无权访问'); return c; }
|
|
16
|
+
async create(p) {
|
|
17
|
+
const profile = this.#profiles.get(p.companionProfileId);
|
|
18
|
+
if (!profile || profile.ownerUserId !== p.ownerUserId)
|
|
19
|
+
throw new Error('[Tavern] Companion 不存在或无权访问');
|
|
20
|
+
const conversation = await this.#conversations.get(p.conversationId);
|
|
21
|
+
if (!conversation || conversation.ownerUserId !== p.ownerUserId)
|
|
22
|
+
throw new Error('[Tavern] Conversation 不存在或无权访问');
|
|
23
|
+
if (conversation.characterId !== profile.characterId)
|
|
24
|
+
throw new Error('[Tavern] 性格证据与 Companion 角色不匹配');
|
|
25
|
+
const ids = [...new Set(p.sourceMessageIds)];
|
|
26
|
+
if (!ids.length)
|
|
27
|
+
throw new Error('[Tavern] 性格候选至少需要一条证据');
|
|
28
|
+
const evidence = await Promise.all(ids.map(id => this.#conversations.getMessage(id)));
|
|
29
|
+
if (evidence.some(m => !m || m.conversationId !== p.conversationId) || !evidence.some(m => m?.role === 'user'))
|
|
30
|
+
throw new Error('[Tavern] 性格候选必须包含有效用户证据');
|
|
31
|
+
const evidenceKey = ids.slice().sort().join(',');
|
|
32
|
+
const duplicate = [...this.#candidates.entries()].map(([, candidate]) => candidate).find(candidate => candidate.ownerUserId === p.ownerUserId && candidate.companionProfileId === p.companionProfileId && candidate.conversationId === p.conversationId && candidate.traitName === p.traitName.trim() && candidate.description === p.description.trim() && candidate.sourceMessageIds.slice().sort().join(',') === evidenceKey);
|
|
33
|
+
if (duplicate)
|
|
34
|
+
return duplicate;
|
|
35
|
+
const now = new Date().toISOString();
|
|
36
|
+
const candidate = { id: randomUUID(), ownerUserId: p.ownerUserId, companionProfileId: p.companionProfileId, conversationId: p.conversationId, traitName: p.traitName.trim(), description: p.description.trim(), strength: p.strength, confidence: p.confidence, sourceMessageIds: ids, extractionVersion: p.extractionVersion, status: 'pending', createdAt: now, updatedAt: now };
|
|
37
|
+
if (!candidate.traitName || !candidate.description)
|
|
38
|
+
throw new Error('[Tavern] 性格候选内容不能为空');
|
|
39
|
+
await this.#candidates.put(candidate.id, candidate);
|
|
40
|
+
await this.#audit.log({ entityType: 'personality_candidate', entityId: candidate.id, action: 'create', after: candidate, source: 'system', actorId: p.ownerUserId });
|
|
41
|
+
return candidate;
|
|
42
|
+
}
|
|
43
|
+
listForUser(owner, profileId) { return [...this.#candidates.entries()].map(([, c]) => c).filter(c => c.ownerUserId === owner && (profileId === undefined || c.companionProfileId === profileId)); }
|
|
44
|
+
async review(owner, id, decision, edits = {}) {
|
|
45
|
+
const current = this.#owned(owner, id);
|
|
46
|
+
if (current.status !== 'pending')
|
|
47
|
+
return current;
|
|
48
|
+
const now = new Date().toISOString();
|
|
49
|
+
const next = { ...current, ...(edits.traitName === undefined ? {} : { traitName: edits.traitName.trim() }), ...(edits.description === undefined ? {} : { description: edits.description.trim() }), ...(edits.strength === undefined ? {} : { strength: edits.strength }), status: decision === 'accept' ? 'accepted' : 'rejected', reviewerUserId: owner, reviewedAt: now, updatedAt: now };
|
|
50
|
+
await this.#candidates.put(id, next);
|
|
51
|
+
if (decision === 'accept') {
|
|
52
|
+
const profile = this.#profiles.get(current.companionProfileId);
|
|
53
|
+
const oldTraits = profile.personalityTraits ?? [];
|
|
54
|
+
const trait = { id: `trait:${id}`, name: next.traitName, description: next.description, strength: next.strength, confidence: next.confidence, source: 'user-confirmed', status: 'active' };
|
|
55
|
+
const version = (profile.personalityVersion ?? 0) + 1;
|
|
56
|
+
const traits = oldTraits.map(t => t.name === trait.name ? { ...t, status: 'superseded' } : t);
|
|
57
|
+
const updated = { ...profile, personalityTraits: [...traits, trait], personalitySummary: [...traits, trait].filter(t => t.status === 'active').map(t => `${t.name}: ${t.description}`).join(';'), personalityVersion: version, personalitySourceConversationIds: [...new Set([...(profile.personalitySourceConversationIds ?? []), current.conversationId])], personalitySourceMessageIds: [...new Set([...(profile.personalitySourceMessageIds ?? []), ...current.sourceMessageIds])], personalitySummarizedAt: now, personalityConfirmedAt: now, updatedAt: now };
|
|
58
|
+
await this.#profiles.put(profile.id, updated);
|
|
59
|
+
await this.#audit.log({ entityType: 'companion_profile', entityId: profile.id, action: 'update', before: profile, after: updated, source: 'user', actorId: owner });
|
|
60
|
+
}
|
|
61
|
+
await this.#audit.log({ entityType: 'personality_candidate', entityId: id, action: 'update', before: current, after: next, source: 'user', actorId: owner });
|
|
62
|
+
return next;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=personality-candidate-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"personality-candidate-service.js","sourceRoot":"","sources":["../../src/core/personality-candidate-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PromptAssembler —— 普通聊天的上下文组装(阶段 1,ADR-002/003)。
|
|
3
|
+
*
|
|
4
|
+
* 组装顺序(方案 §23.3):
|
|
5
|
+
* 角色 persona/scenario → 世界书命中 + 已确认记忆(复用 ContextAssembler)→
|
|
6
|
+
* 消息树历史 → 用户本轮消息 → 生成 system + messages + contextSources。
|
|
7
|
+
*
|
|
8
|
+
* 骨架阶段:消息树历史取全量(按 createdAt 排序);分支路径裁剪与历史摘要
|
|
9
|
+
* 在 v0.2(Context Policy)接入。
|
|
10
|
+
*/
|
|
11
|
+
import type { CharacterService } from './character-service.js';
|
|
12
|
+
import type { ContextAssembler } from './context-assembler.js';
|
|
13
|
+
import type { ConversationMessage } from '../domain/schemas.js';
|
|
14
|
+
import type { ConversationRepository } from './conversation-repository.js';
|
|
15
|
+
export interface AssembledPrompt {
|
|
16
|
+
/** system 槽:persona + scenario(+ 注入块经 messages 传递)。 */
|
|
17
|
+
system: string;
|
|
18
|
+
/** 有序对话消息(user/assistant;注入块以 system 角色放在最前)。 */
|
|
19
|
+
messages: Array<{
|
|
20
|
+
role: 'user' | 'assistant' | 'system';
|
|
21
|
+
content: string;
|
|
22
|
+
}>;
|
|
23
|
+
/** 本轮上下文来源(lore/memory 命中 id,审计与 UI 展示用)。 */
|
|
24
|
+
contextSources: string[];
|
|
25
|
+
/** 粗略 token 估算(字符数 / 4,正式估算见 ModelCapabilityRegistry)。 */
|
|
26
|
+
tokenEstimate?: number;
|
|
27
|
+
}
|
|
28
|
+
export declare class PromptAssembler {
|
|
29
|
+
#private;
|
|
30
|
+
constructor(characters: CharacterService, assembler: ContextAssembler, conversations: ConversationRepository);
|
|
31
|
+
assemble(params: {
|
|
32
|
+
characterId: string;
|
|
33
|
+
conversationId: string;
|
|
34
|
+
userMessage: string;
|
|
35
|
+
sceneId?: string;
|
|
36
|
+
activeLeafMessageId?: string;
|
|
37
|
+
/** 伙伴 Agent 会话:用伙伴身份/背景/关系替代角色卡 persona。 */
|
|
38
|
+
systemOverride?: string;
|
|
39
|
+
}): Promise<AssembledPrompt>;
|
|
40
|
+
}
|
|
41
|
+
/** 从消息树提取历史文本(供 PromptAssembler 使用;保留导出便于测试)。 */
|
|
42
|
+
export declare function historyTextOf(messages: readonly ConversationMessage[]): string;
|
|
43
|
+
//# sourceMappingURL=prompt-assembler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-assembler.d.ts","sourceRoot":"","sources":["../../src/core/prompt-assembler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AAE1E,MAAM,WAAW,eAAe;IAC9B,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAA;IACd,iDAAiD;IACjD,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC3E,6CAA6C;IAC7C,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,qBAAa,eAAe;;gBAMxB,UAAU,EAAE,gBAAgB,EAC5B,SAAS,EAAE,gBAAgB,EAC3B,aAAa,EAAE,sBAAsB;IAOjC,QAAQ,CAAC,MAAM,EAAE;QACrB,WAAW,EAAE,MAAM,CAAA;QACnB,cAAc,EAAE,MAAM,CAAA;QACtB,WAAW,EAAE,MAAM,CAAA;QACnB,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,mBAAmB,CAAC,EAAE,MAAM,CAAA;QAC5B,4CAA4C;QAC5C,cAAc,CAAC,EAAE,MAAM,CAAA;KACxB,GAAG,OAAO,CAAC,eAAe,CAAC;CA8C7B;AAED,iDAAiD;AACjD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,GAAG,MAAM,CAE9E"}
|