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 @@
|
|
|
1
|
+
{"version":3,"file":"group-chat-orchestrator.js","sourceRoot":"","sources":["../../../src/application/group-chat/group-chat-orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { KvTable } from '@deepseek-ai/dsh-storage-domain';
|
|
2
|
+
import type { MemoryCategory, MemoryEntry } from '../../domain/schemas.js';
|
|
3
|
+
export interface MemoryQuery {
|
|
4
|
+
readonly characterId: string;
|
|
5
|
+
/** 本轮用户消息;空查询时相关项退化为 salience/recency 排序。 */
|
|
6
|
+
readonly query?: string;
|
|
7
|
+
readonly sceneId?: string;
|
|
8
|
+
readonly instanceId?: string;
|
|
9
|
+
readonly ownerUserId?: string;
|
|
10
|
+
readonly category?: MemoryCategory;
|
|
11
|
+
readonly limit?: number;
|
|
12
|
+
readonly minConfidence?: number;
|
|
13
|
+
readonly updateAccess?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface MemoryHit {
|
|
16
|
+
readonly memory: MemoryEntry;
|
|
17
|
+
readonly score: number;
|
|
18
|
+
readonly relevance: number;
|
|
19
|
+
readonly recency: number;
|
|
20
|
+
readonly reasons: readonly string[];
|
|
21
|
+
}
|
|
22
|
+
/** 关键词相关性:完整 query 命中得 1;否则按非字母数字 token 的命中比例。 */
|
|
23
|
+
export declare function relevanceScore(fact: string, query: string): number;
|
|
24
|
+
/** 时间衰减:updatedAt 距 now 的天数,越大越旧,得分趋近 0。 */
|
|
25
|
+
export declare function recencyScore(updatedAt: string, now?: Date): number;
|
|
26
|
+
export declare function scoreMemory(memory: MemoryEntry, query: string, now?: Date): {
|
|
27
|
+
readonly score: number;
|
|
28
|
+
readonly relevance: number;
|
|
29
|
+
readonly recency: number;
|
|
30
|
+
readonly reasons: readonly string[];
|
|
31
|
+
};
|
|
32
|
+
export declare class MemoryRetriever {
|
|
33
|
+
#private;
|
|
34
|
+
constructor(memories: KvTable<string, MemoryEntry>);
|
|
35
|
+
retrieve(query: MemoryQuery): Promise<MemoryHit[]>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=memory-retriever.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-retriever.d.ts","sourceRoot":"","sources":["../../../src/application/memory/memory-retriever.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAE1E,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,6CAA6C;IAC7C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAA;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CACpC;AAMD,kDAAkD;AAClD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAUlE;AAED,4CAA4C;AAC5C,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG,MAAM,CAKlE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG;IAC3E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CACpC,CAMA;AAED,qBAAa,eAAe;;gBAGd,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC;IAI5C,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;CAuCzD"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
const DEFAULT_MIN_CONFIDENCE = 0.3;
|
|
2
|
+
const DEFAULT_LIMIT = 5;
|
|
3
|
+
const CATEGORY_QUOTA = { player: 2, world: 2, npc: 2, general: 2, 'shared-experience': 3, 'relationship-milestone': 2 };
|
|
4
|
+
/** 关键词相关性:完整 query 命中得 1;否则按非字母数字 token 的命中比例。 */
|
|
5
|
+
export function relevanceScore(fact, query) {
|
|
6
|
+
const q = query.trim().toLocaleLowerCase();
|
|
7
|
+
if (q === '')
|
|
8
|
+
return 0;
|
|
9
|
+
const f = fact.toLocaleLowerCase();
|
|
10
|
+
if (f.includes(q))
|
|
11
|
+
return 1;
|
|
12
|
+
const tokens = q.split(/[^\p{L}\p{N}]+/u).filter(Boolean);
|
|
13
|
+
if (tokens.length === 0)
|
|
14
|
+
return 0;
|
|
15
|
+
let hits = 0;
|
|
16
|
+
for (const token of tokens)
|
|
17
|
+
if (f.includes(token))
|
|
18
|
+
hits += 1;
|
|
19
|
+
return hits / tokens.length;
|
|
20
|
+
}
|
|
21
|
+
/** 时间衰减:updatedAt 距 now 的天数,越大越旧,得分趋近 0。 */
|
|
22
|
+
export function recencyScore(updatedAt, now) {
|
|
23
|
+
const updated = Date.parse(updatedAt);
|
|
24
|
+
if (!Number.isFinite(updated))
|
|
25
|
+
return 0;
|
|
26
|
+
const ageDays = Math.max(0, (now?.getTime() ?? Date.now()) - updated) / 86_400_000;
|
|
27
|
+
return 1 / (1 + ageDays);
|
|
28
|
+
}
|
|
29
|
+
export function scoreMemory(memory, query, now) {
|
|
30
|
+
const relevance = relevanceScore(memory.fact, query);
|
|
31
|
+
const recency = recencyScore(memory.updatedAt, now);
|
|
32
|
+
const salience = memory.salience;
|
|
33
|
+
const score = relevance * 0.5 + salience * 0.3 + recency * 0.2;
|
|
34
|
+
return { score, relevance, recency, reasons: [`rel=${relevance.toFixed(2)}`, `sal=${salience.toFixed(2)}`, `rec=${recency.toFixed(2)}`] };
|
|
35
|
+
}
|
|
36
|
+
export class MemoryRetriever {
|
|
37
|
+
#memories;
|
|
38
|
+
constructor(memories) {
|
|
39
|
+
this.#memories = memories;
|
|
40
|
+
}
|
|
41
|
+
async retrieve(query) {
|
|
42
|
+
const limit = query.limit ?? DEFAULT_LIMIT;
|
|
43
|
+
const minConfidence = query.minConfidence ?? DEFAULT_MIN_CONFIDENCE;
|
|
44
|
+
const text = query.query ?? '';
|
|
45
|
+
const hits = [];
|
|
46
|
+
for (const [, memory] of this.#memories.entries()) {
|
|
47
|
+
if (memory.characterId !== query.characterId)
|
|
48
|
+
continue;
|
|
49
|
+
if (memory.status !== 'active')
|
|
50
|
+
continue;
|
|
51
|
+
// 伙伴升格记忆属于个人 Agent 关系,不进入普通角色卡聊天上下文。
|
|
52
|
+
if (memory.sourceEventId?.startsWith('promotion:'))
|
|
53
|
+
continue;
|
|
54
|
+
if (query.sceneId !== undefined && memory.sceneId !== query.sceneId)
|
|
55
|
+
continue;
|
|
56
|
+
if (query.instanceId !== undefined && memory.instanceId !== query.instanceId)
|
|
57
|
+
continue;
|
|
58
|
+
if (query.category !== undefined && memory.category !== query.category)
|
|
59
|
+
continue;
|
|
60
|
+
if (query.ownerUserId !== undefined && memory.ownerUserId !== query.ownerUserId)
|
|
61
|
+
continue;
|
|
62
|
+
if (memory.confidence < minConfidence)
|
|
63
|
+
continue;
|
|
64
|
+
const scored = scoreMemory(memory, text);
|
|
65
|
+
hits.push({ memory, score: scored.score, relevance: scored.relevance, recency: scored.recency, reasons: scored.reasons });
|
|
66
|
+
}
|
|
67
|
+
hits.sort((a, b) => (b.score - a.score)
|
|
68
|
+
|| (b.memory.salience - a.memory.salience)
|
|
69
|
+
|| (a.memory.updatedAt < b.memory.updatedAt ? 1 : a.memory.updatedAt > b.memory.updatedAt ? -1 : 0)
|
|
70
|
+
|| (a.memory.id < b.memory.id ? -1 : a.memory.id > b.memory.id ? 1 : 0));
|
|
71
|
+
const selected = [];
|
|
72
|
+
const quota = {};
|
|
73
|
+
for (const hit of hits) {
|
|
74
|
+
if (selected.length >= limit)
|
|
75
|
+
break;
|
|
76
|
+
const used = quota[hit.memory.category] ?? 0;
|
|
77
|
+
if (used >= CATEGORY_QUOTA[hit.memory.category])
|
|
78
|
+
continue;
|
|
79
|
+
quota[hit.memory.category] = used + 1;
|
|
80
|
+
selected.push(hit);
|
|
81
|
+
}
|
|
82
|
+
if (query.updateAccess === true && selected.length > 0) {
|
|
83
|
+
const accessedAt = new Date().toISOString();
|
|
84
|
+
for (const hit of selected) {
|
|
85
|
+
await this.#memories.put(hit.memory.id, { ...hit.memory, lastAccessedAt: accessedAt });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return selected;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=memory-retriever.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-retriever.js","sourceRoot":"","sources":["../../../src/application/memory/memory-retriever.ts"],"names":[],"mappings":"AAwBA,MAAM,sBAAsB,GAAG,GAAG,CAAA;AAClC,MAAM,aAAa,GAAG,CAAC,CAAA;AACvB,MAAM,cAAc,GAA6C,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,mBAAmB,EAAE,CAAC,EAAE,wBAAwB,EAAE,CAAC,EAAE,CAAA;AAEjK,kDAAkD;AAClD,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,KAAa;IACxD,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,iBAAiB,EAAE,CAAA;IAC1C,IAAI,CAAC,KAAK,EAAE;QAAE,OAAO,CAAC,CAAA;IACtB,MAAM,CAAC,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAA;IAClC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAA;IAC3B,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACzD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAA;IACjC,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,KAAK,MAAM,KAAK,IAAI,MAAM;QAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,IAAI,IAAI,CAAC,CAAA;IAC5D,OAAO,IAAI,GAAG,MAAM,CAAC,MAAM,CAAA;AAC7B,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,YAAY,CAAC,SAAiB,EAAE,GAAU;IACxD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,CAAC,CAAA;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,GAAG,UAAU,CAAA;IAClF,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAA;AAC1B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAmB,EAAE,KAAa,EAAE,GAAU;IAMxE,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IACpD,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;IACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAA;IAChC,MAAM,KAAK,GAAG,SAAS,GAAG,GAAG,GAAG,QAAQ,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,CAAA;IAC9D,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;AAC3I,CAAC;AAED,MAAM,OAAO,eAAe;IACjB,SAAS,CAA8B;IAEhD,YAAY,QAAsC;QAChD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;IAC3B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAkB;QAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,aAAa,CAAA;QAC1C,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,sBAAsB,CAAA;QACnE,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAA;QAC9B,MAAM,IAAI,GAAgB,EAAE,CAAA;QAC5B,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;YAClD,IAAI,MAAM,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW;gBAAE,SAAQ;YACtD,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ;gBAAE,SAAQ;YACxC,qCAAqC;YACrC,IAAI,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,YAAY,CAAC;gBAAE,SAAQ;YAC5D,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO;gBAAE,SAAQ;YAC7E,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,MAAM,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU;gBAAE,SAAQ;YACtF,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ;gBAAE,SAAQ;YAChF,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,MAAM,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW;gBAAE,SAAQ;YACzF,IAAI,MAAM,CAAC,UAAU,GAAG,aAAa;gBAAE,SAAQ;YAC/C,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YACxC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;QAC3H,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;eAClC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;eACvC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;eAChG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1E,MAAM,QAAQ,GAAgB,EAAE,CAAA;QAChC,MAAM,KAAK,GAA2B,EAAE,CAAA;QACxC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,QAAQ,CAAC,MAAM,IAAI,KAAK;gBAAE,MAAK;YACnC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;YAC5C,IAAI,IAAI,IAAI,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAAE,SAAQ;YACzD,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,GAAG,CAAC,CAAA;YACrC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACpB,CAAC;QACD,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvD,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;YAC3C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC,CAAA;YACxF,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;CACF"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MemoryService —— 独立记忆系统(阶段 5.2)。
|
|
3
|
+
*
|
|
4
|
+
* 数据模型(memories 表):characterId 必填(跨角色隔离);来源可追溯
|
|
5
|
+
* (source + sourceEventId);更正不删历史(supersedes 标记);遗忘标记
|
|
6
|
+
* forgotten。
|
|
7
|
+
*
|
|
8
|
+
* 约束(产品文档 §5.2):
|
|
9
|
+
* - 模型不得自行写入记忆:只有通过 remember 工具(或明确来源的系统/
|
|
10
|
+
* user/game-rule 调用方)才能写入;
|
|
11
|
+
* - 记忆不跨角色混淆:characterId 是必填字段;
|
|
12
|
+
* - 召回按 salience 排序(重要记忆优先),tie-break 最新优先。
|
|
13
|
+
*
|
|
14
|
+
* 关系图谱联动(由调用方提供 userNodeId 触发;character-instance 节点在
|
|
15
|
+
* summon 时由 orchestrator 登记):
|
|
16
|
+
* - remember 写入新记忆 → familiarity +1(上限 100);
|
|
17
|
+
* - remember 携带 category='player'(用户信任声明)→ trust +5;
|
|
18
|
+
* - supersede 更正同一事实 → trust +1;
|
|
19
|
+
* - recall 命中 → familiarity +0.5(每轮)。
|
|
20
|
+
* ContextAssembler 的检索路径暂不传 userNodeId(无用户上下文),联动留待
|
|
21
|
+
* 后续子阶段在投递链路接入。
|
|
22
|
+
*/
|
|
23
|
+
import type { KvTable } from '@deepseek-ai/dsh-storage-domain';
|
|
24
|
+
import type { MemoryCategory, MemoryEntry, MemorySource } from '../../domain/schemas.js';
|
|
25
|
+
import type { AuditService } from '../../core/audit-service.js';
|
|
26
|
+
import { RelationshipService } from '../relationship/relationship-service.js';
|
|
27
|
+
import type { RelationshipEventService } from '../relationship/relationship-event-service.js';
|
|
28
|
+
import type { RelationshipProjection } from '../relationship/relationship-projection.js';
|
|
29
|
+
export declare const DEFAULT_MEMORY_LIMIT = 5;
|
|
30
|
+
export declare const DEFAULT_MIN_CONFIDENCE = 0.3;
|
|
31
|
+
export declare const DEFAULT_CONFIDENCE = 0.8;
|
|
32
|
+
export declare const DEFAULT_SALIENCE = 0.5;
|
|
33
|
+
/** 关系值上限(0-100 语义约定)。 */
|
|
34
|
+
export declare const MAX_RELATIONSHIP_VALUE = 100;
|
|
35
|
+
/** 关系联动规则(单位 delta)。 */
|
|
36
|
+
export declare const FAMILIARITY_PER_REMEMBER = 1;
|
|
37
|
+
export declare const FAMILIARITY_PER_RECALL_HIT = 0.5;
|
|
38
|
+
export declare const TRUST_PER_PLAYER_DECLARATION = 5;
|
|
39
|
+
export declare const TRUST_PER_SUPERSEDE = 1;
|
|
40
|
+
export interface RememberParams {
|
|
41
|
+
readonly characterId: string;
|
|
42
|
+
readonly instanceId?: string;
|
|
43
|
+
readonly sceneId?: string;
|
|
44
|
+
/** 幂等键:同 id 更新(不新建)。缺省生成新 id。 */
|
|
45
|
+
readonly id?: string;
|
|
46
|
+
readonly fact: string;
|
|
47
|
+
readonly category?: MemoryCategory;
|
|
48
|
+
readonly source?: MemorySource;
|
|
49
|
+
/** 稳定用户与消息证据仅由受信调用方提供(阶段 3)。 */
|
|
50
|
+
readonly ownerUserId?: string;
|
|
51
|
+
readonly sourceMessageIds?: readonly string[];
|
|
52
|
+
readonly candidateId?: string;
|
|
53
|
+
readonly sourceEventId?: string;
|
|
54
|
+
readonly confidence?: number;
|
|
55
|
+
readonly salience?: number;
|
|
56
|
+
/** 联动:提供时 familiarity +1;category='player' 额外 trust +5。 */
|
|
57
|
+
readonly userNodeId?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface RecallParams {
|
|
60
|
+
readonly characterId: string;
|
|
61
|
+
readonly instanceId?: string;
|
|
62
|
+
readonly sceneId?: string;
|
|
63
|
+
/** 在 fact 中模糊匹配(大小写不敏感)。 */
|
|
64
|
+
readonly keyword?: string;
|
|
65
|
+
readonly category?: MemoryCategory;
|
|
66
|
+
readonly limit?: number;
|
|
67
|
+
readonly minConfidence?: number;
|
|
68
|
+
/** 联动:命中时 familiarity +0.5。 */
|
|
69
|
+
readonly userNodeId?: string;
|
|
70
|
+
/** 是否更新命中记忆的 lastAccessedAt(默认 true)。 */
|
|
71
|
+
readonly updateAccess?: boolean;
|
|
72
|
+
}
|
|
73
|
+
export interface SupersedeParams {
|
|
74
|
+
readonly oldId: string;
|
|
75
|
+
readonly newFact: string;
|
|
76
|
+
readonly category?: MemoryCategory;
|
|
77
|
+
readonly source?: MemorySource;
|
|
78
|
+
readonly sourceEventId?: string;
|
|
79
|
+
readonly confidence?: number;
|
|
80
|
+
readonly salience?: number;
|
|
81
|
+
/** 联动:更正后 trust +1。 */
|
|
82
|
+
readonly userNodeId?: string;
|
|
83
|
+
}
|
|
84
|
+
export declare class MemoryService {
|
|
85
|
+
#private;
|
|
86
|
+
constructor(memoryTable: KvTable<string, MemoryEntry>, _relationshipService: RelationshipService, audit: AuditService, events?: RelationshipEventService, projection?: RelationshipProjection);
|
|
87
|
+
/** 读一条记忆;不存在返回 null。 */
|
|
88
|
+
get(memoryId: string): MemoryEntry | null;
|
|
89
|
+
/**
|
|
90
|
+
* 写入记忆(幂等:同 id 更新)。写入后按规则联动关系图谱
|
|
91
|
+
* (提供 userNodeId 时:familiarity +1;category='player' 额外 trust +5)。
|
|
92
|
+
*/
|
|
93
|
+
remember(params: RememberParams): Promise<MemoryEntry>;
|
|
94
|
+
/**
|
|
95
|
+
* 检索记忆:按 characterId(必填)+ 可选 instanceId/sceneId/category/
|
|
96
|
+
* keyword/minConfidence 过滤,salience DESC → updatedAt DESC 排序,
|
|
97
|
+
* 取 limit 条(默认 5)。命中时更新 lastAccessedAt(updateAccess=true),
|
|
98
|
+
* 提供 userNodeId 时联动 familiarity +0.5。
|
|
99
|
+
*/
|
|
100
|
+
recall(params: RecallParams): Promise<MemoryEntry[]>;
|
|
101
|
+
/**
|
|
102
|
+
* 更正记忆:旧记忆标记 superseded(不删除,保留审计链路),创建新记忆
|
|
103
|
+
* (supersedes 指向旧 id)。提供 userNodeId 时联动 trust +1。
|
|
104
|
+
*/
|
|
105
|
+
supersede(params: SupersedeParams): Promise<MemoryEntry>;
|
|
106
|
+
/**
|
|
107
|
+
* 标记正式记忆的聊天证据已失效。用户已经审阅接受的内容不会被自动删除,
|
|
108
|
+
* 但后续 UI/检索策略可据此提示或降权;重复标记不产生额外审计。
|
|
109
|
+
*/
|
|
110
|
+
markEvidenceInvalidated(memoryId: string): Promise<MemoryEntry | null>;
|
|
111
|
+
/** 遗忘记忆:标记 forgotten(幂等;不存在或已非 active 时不写)。记录审计。 */
|
|
112
|
+
forget(memoryId: string): Promise<void>;
|
|
113
|
+
/** 遗忘某个来源事件下的全部 active 记忆;返回处理条数。 */
|
|
114
|
+
forgetBySourceEvent(sourceEventId: string, characterId?: string): Promise<number>;
|
|
115
|
+
/** 遗忘 sourceEventId 以指定前缀开头的全部 active 记忆;返回处理条数。 */
|
|
116
|
+
forgetBySourceEventPrefix(prefix: string, characterId?: string): Promise<number>;
|
|
117
|
+
/** 指定角色(可再按场景)的全部 active 记忆;供候选冲突检测等只读扫描使用。 */
|
|
118
|
+
listActiveByCharacter(characterId: string, sceneId?: string): MemoryEntry[];
|
|
119
|
+
/**
|
|
120
|
+
* 场景内全部记忆(UI 数据面;含 superseded/forgotten 历史)。
|
|
121
|
+
* filter 支持 category / status;salience DESC → updatedAt DESC 排序。
|
|
122
|
+
*/
|
|
123
|
+
listByScene(sceneId: string, filter?: {
|
|
124
|
+
category?: MemoryCategory;
|
|
125
|
+
status?: 'active' | 'superseded' | 'forgotten';
|
|
126
|
+
}): Promise<MemoryEntry[]>;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=memory-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-service.d.ts","sourceRoot":"","sources":["../../../src/application/memory/memory-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MemoryService —— 独立记忆系统(阶段 5.2)。
|
|
3
|
+
*
|
|
4
|
+
* 数据模型(memories 表):characterId 必填(跨角色隔离);来源可追溯
|
|
5
|
+
* (source + sourceEventId);更正不删历史(supersedes 标记);遗忘标记
|
|
6
|
+
* forgotten。
|
|
7
|
+
*
|
|
8
|
+
* 约束(产品文档 §5.2):
|
|
9
|
+
* - 模型不得自行写入记忆:只有通过 remember 工具(或明确来源的系统/
|
|
10
|
+
* user/game-rule 调用方)才能写入;
|
|
11
|
+
* - 记忆不跨角色混淆:characterId 是必填字段;
|
|
12
|
+
* - 召回按 salience 排序(重要记忆优先),tie-break 最新优先。
|
|
13
|
+
*
|
|
14
|
+
* 关系图谱联动(由调用方提供 userNodeId 触发;character-instance 节点在
|
|
15
|
+
* summon 时由 orchestrator 登记):
|
|
16
|
+
* - remember 写入新记忆 → familiarity +1(上限 100);
|
|
17
|
+
* - remember 携带 category='player'(用户信任声明)→ trust +5;
|
|
18
|
+
* - supersede 更正同一事实 → trust +1;
|
|
19
|
+
* - recall 命中 → familiarity +0.5(每轮)。
|
|
20
|
+
* ContextAssembler 的检索路径暂不传 userNodeId(无用户上下文),联动留待
|
|
21
|
+
* 后续子阶段在投递链路接入。
|
|
22
|
+
*/
|
|
23
|
+
import { randomUUID } from 'node:crypto';
|
|
24
|
+
import { RelationshipService } from '../relationship/relationship-service.js';
|
|
25
|
+
export const DEFAULT_MEMORY_LIMIT = 5;
|
|
26
|
+
export const DEFAULT_MIN_CONFIDENCE = 0.3;
|
|
27
|
+
export const DEFAULT_CONFIDENCE = 0.8;
|
|
28
|
+
export const DEFAULT_SALIENCE = 0.5;
|
|
29
|
+
/** 关系值上限(0-100 语义约定)。 */
|
|
30
|
+
export const MAX_RELATIONSHIP_VALUE = 100;
|
|
31
|
+
/** 关系联动规则(单位 delta)。 */
|
|
32
|
+
export const FAMILIARITY_PER_REMEMBER = 1;
|
|
33
|
+
export const FAMILIARITY_PER_RECALL_HIT = 0.5;
|
|
34
|
+
export const TRUST_PER_PLAYER_DECLARATION = 5;
|
|
35
|
+
export const TRUST_PER_SUPERSEDE = 1;
|
|
36
|
+
function clamp01(value) {
|
|
37
|
+
return Math.min(1, Math.max(0, value));
|
|
38
|
+
}
|
|
39
|
+
export class MemoryService {
|
|
40
|
+
#memories;
|
|
41
|
+
#audit;
|
|
42
|
+
#events;
|
|
43
|
+
#projection;
|
|
44
|
+
constructor(memoryTable, _relationshipService, audit, events, projection) {
|
|
45
|
+
this.#memories = memoryTable;
|
|
46
|
+
this.#audit = audit;
|
|
47
|
+
this.#events = events;
|
|
48
|
+
this.#projection = projection;
|
|
49
|
+
}
|
|
50
|
+
/** 读一条记忆;不存在返回 null。 */
|
|
51
|
+
get(memoryId) {
|
|
52
|
+
return this.#memories.get(memoryId) ?? null;
|
|
53
|
+
}
|
|
54
|
+
/** 记忆关键字段快照(审计用)。 */
|
|
55
|
+
#snapshotOf(memory) {
|
|
56
|
+
return {
|
|
57
|
+
id: memory.id,
|
|
58
|
+
characterId: memory.characterId,
|
|
59
|
+
fact: memory.fact,
|
|
60
|
+
category: memory.category,
|
|
61
|
+
status: memory.status,
|
|
62
|
+
...(memory.sceneId === undefined ? {} : { sceneId: memory.sceneId }),
|
|
63
|
+
...(memory.supersedes === undefined ? {} : { supersedes: memory.supersedes }),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/** 内部纯写入(幂等:同 id 更新,保留 characterId/createdAt)。返回是否新建与更新前状态。 */
|
|
67
|
+
async #write(params) {
|
|
68
|
+
const now = new Date().toISOString();
|
|
69
|
+
const existing = this.#memories.get(params.id);
|
|
70
|
+
if (existing !== undefined) {
|
|
71
|
+
const updated = {
|
|
72
|
+
...existing,
|
|
73
|
+
fact: params.fact,
|
|
74
|
+
category: params.category ?? existing.category,
|
|
75
|
+
source: params.source ?? existing.source,
|
|
76
|
+
...(params.ownerUserId === undefined ? {} : { ownerUserId: params.ownerUserId }),
|
|
77
|
+
...(params.sourceMessageIds === undefined ? {} : { sourceMessageIds: [...params.sourceMessageIds] }),
|
|
78
|
+
...(params.candidateId === undefined ? {} : { candidateId: params.candidateId }),
|
|
79
|
+
...(params.sourceEventId === undefined ? {} : { sourceEventId: params.sourceEventId }),
|
|
80
|
+
confidence: clamp01(params.confidence ?? existing.confidence),
|
|
81
|
+
salience: clamp01(params.salience ?? existing.salience),
|
|
82
|
+
updatedAt: now,
|
|
83
|
+
};
|
|
84
|
+
await this.#memories.put(params.id, updated);
|
|
85
|
+
return { entry: updated, created: false, previous: existing };
|
|
86
|
+
}
|
|
87
|
+
const entry = {
|
|
88
|
+
id: params.id,
|
|
89
|
+
characterId: params.characterId,
|
|
90
|
+
...(params.instanceId === undefined ? {} : { instanceId: params.instanceId }),
|
|
91
|
+
...(params.sceneId === undefined ? {} : { sceneId: params.sceneId }),
|
|
92
|
+
fact: params.fact,
|
|
93
|
+
category: params.category ?? 'general',
|
|
94
|
+
status: 'active',
|
|
95
|
+
...(params.supersedes === undefined ? {} : { supersedes: params.supersedes }),
|
|
96
|
+
source: params.source ?? 'tool',
|
|
97
|
+
...(params.ownerUserId === undefined ? {} : { ownerUserId: params.ownerUserId }),
|
|
98
|
+
...(params.sourceMessageIds === undefined ? {} : { sourceMessageIds: [...params.sourceMessageIds] }),
|
|
99
|
+
...(params.candidateId === undefined ? {} : { candidateId: params.candidateId }),
|
|
100
|
+
...(params.sourceEventId === undefined ? {} : { sourceEventId: params.sourceEventId }),
|
|
101
|
+
confidence: clamp01(params.confidence ?? DEFAULT_CONFIDENCE),
|
|
102
|
+
salience: clamp01(params.salience ?? DEFAULT_SALIENCE),
|
|
103
|
+
createdAt: now,
|
|
104
|
+
updatedAt: now,
|
|
105
|
+
};
|
|
106
|
+
await this.#memories.put(params.id, entry);
|
|
107
|
+
return { entry, created: true };
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* 写入记忆(幂等:同 id 更新)。写入后按规则联动关系图谱
|
|
111
|
+
* (提供 userNodeId 时:familiarity +1;category='player' 额外 trust +5)。
|
|
112
|
+
*/
|
|
113
|
+
async remember(params) {
|
|
114
|
+
const { entry, created, previous } = await this.#write({ ...params, id: params.id ?? randomUUID() });
|
|
115
|
+
await this.#audit.log({
|
|
116
|
+
entityType: 'memory',
|
|
117
|
+
entityId: entry.id,
|
|
118
|
+
action: created ? 'create' : 'update',
|
|
119
|
+
...(previous === undefined ? {} : { before: this.#snapshotOf(previous) }),
|
|
120
|
+
after: this.#snapshotOf(entry),
|
|
121
|
+
source: params.source ?? 'tool',
|
|
122
|
+
...(params.sourceEventId === undefined ? {} : { sourceEventId: params.sourceEventId }),
|
|
123
|
+
...(params.sceneId === undefined ? {} : { sceneId: params.sceneId }),
|
|
124
|
+
});
|
|
125
|
+
if (created && params.source !== 'tool' && this.#events !== undefined && params.ownerUserId !== undefined && params.userNodeId !== undefined && params.instanceId !== undefined) {
|
|
126
|
+
await this.#events.appendEvent({ ownerUserId: params.ownerUserId, characterId: params.characterId, ...(params.sceneId === undefined ? {} : { sceneId: params.sceneId }), fromNodeId: `character-instance:${params.instanceId}`, toNodeId: params.userNodeId, type: 'familiarity', delta: 1, source: params.source ?? 'system', idempotencyKey: `memory:${entry.id}:familiarity`, ...(params.sourceEventId === undefined ? {} : { sourceEventId: params.sourceEventId }) });
|
|
127
|
+
if (this.#projection !== undefined)
|
|
128
|
+
await this.#projection.recompute({ ownerUserId: params.ownerUserId, characterId: params.characterId, ...(params.sceneId === undefined ? {} : { sceneId: params.sceneId }) });
|
|
129
|
+
}
|
|
130
|
+
return entry;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* 检索记忆:按 characterId(必填)+ 可选 instanceId/sceneId/category/
|
|
134
|
+
* keyword/minConfidence 过滤,salience DESC → updatedAt DESC 排序,
|
|
135
|
+
* 取 limit 条(默认 5)。命中时更新 lastAccessedAt(updateAccess=true),
|
|
136
|
+
* 提供 userNodeId 时联动 familiarity +0.5。
|
|
137
|
+
*/
|
|
138
|
+
async recall(params) {
|
|
139
|
+
const limit = params.limit ?? DEFAULT_MEMORY_LIMIT;
|
|
140
|
+
const minConfidence = params.minConfidence ?? DEFAULT_MIN_CONFIDENCE;
|
|
141
|
+
const keyword = params.keyword?.trim().toLocaleLowerCase();
|
|
142
|
+
const hits = [];
|
|
143
|
+
for (const [, memory] of this.#memories.entries()) {
|
|
144
|
+
if (memory.characterId !== params.characterId)
|
|
145
|
+
continue;
|
|
146
|
+
if (memory.status !== 'active')
|
|
147
|
+
continue;
|
|
148
|
+
if (params.instanceId !== undefined && memory.instanceId !== params.instanceId)
|
|
149
|
+
continue;
|
|
150
|
+
if (params.sceneId !== undefined && memory.sceneId !== params.sceneId)
|
|
151
|
+
continue;
|
|
152
|
+
if (params.category !== undefined && memory.category !== params.category)
|
|
153
|
+
continue;
|
|
154
|
+
if (memory.confidence < minConfidence)
|
|
155
|
+
continue;
|
|
156
|
+
if (keyword !== undefined && keyword !== '' && !memory.fact.toLocaleLowerCase().includes(keyword))
|
|
157
|
+
continue;
|
|
158
|
+
hits.push(memory);
|
|
159
|
+
}
|
|
160
|
+
hits.sort((a, b) => (b.salience - a.salience)
|
|
161
|
+
|| (a.updatedAt < b.updatedAt ? 1 : a.updatedAt > b.updatedAt ? -1 : 0));
|
|
162
|
+
const kept = hits.slice(0, limit);
|
|
163
|
+
if (kept.length === 0)
|
|
164
|
+
return kept;
|
|
165
|
+
// 访问日志:更新 lastAccessedAt(不改 updatedAt,避免污染排序)。
|
|
166
|
+
if (params.updateAccess !== false) {
|
|
167
|
+
const accessedAt = new Date().toISOString();
|
|
168
|
+
for (const memory of kept) {
|
|
169
|
+
await this.#memories.put(memory.id, { ...memory, lastAccessedAt: accessedAt });
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// 联动:recall 命中 → familiarity +0.5。
|
|
173
|
+
return kept;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* 更正记忆:旧记忆标记 superseded(不删除,保留审计链路),创建新记忆
|
|
177
|
+
* (supersedes 指向旧 id)。提供 userNodeId 时联动 trust +1。
|
|
178
|
+
*/
|
|
179
|
+
async supersede(params) {
|
|
180
|
+
const oldEntry = this.#memories.get(params.oldId);
|
|
181
|
+
if (oldEntry === undefined)
|
|
182
|
+
throw new Error(`[Tavern] 记忆不存在:${params.oldId}`);
|
|
183
|
+
const now = new Date().toISOString();
|
|
184
|
+
if (oldEntry.status === 'active') {
|
|
185
|
+
await this.#memories.put(oldEntry.id, { ...oldEntry, status: 'superseded', updatedAt: now });
|
|
186
|
+
await this.#audit.log({
|
|
187
|
+
entityType: 'memory',
|
|
188
|
+
entityId: oldEntry.id,
|
|
189
|
+
action: 'supersede',
|
|
190
|
+
before: this.#snapshotOf(oldEntry),
|
|
191
|
+
after: { ...this.#snapshotOf(oldEntry), status: 'superseded' },
|
|
192
|
+
source: params.source ?? oldEntry.source,
|
|
193
|
+
...(params.sourceEventId === undefined ? {} : { sourceEventId: params.sourceEventId }),
|
|
194
|
+
...(oldEntry.sceneId === undefined ? {} : { sceneId: oldEntry.sceneId }),
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
const { entry: fresh } = await this.#write({
|
|
198
|
+
id: randomUUID(),
|
|
199
|
+
characterId: oldEntry.characterId,
|
|
200
|
+
...(oldEntry.instanceId === undefined ? {} : { instanceId: oldEntry.instanceId }),
|
|
201
|
+
...(oldEntry.sceneId === undefined ? {} : { sceneId: oldEntry.sceneId }),
|
|
202
|
+
fact: params.newFact,
|
|
203
|
+
category: params.category ?? oldEntry.category,
|
|
204
|
+
source: params.source ?? oldEntry.source,
|
|
205
|
+
...(params.sourceEventId === undefined ? {} : { sourceEventId: params.sourceEventId }),
|
|
206
|
+
confidence: params.confidence ?? oldEntry.confidence,
|
|
207
|
+
salience: params.salience ?? oldEntry.salience,
|
|
208
|
+
supersedes: oldEntry.id,
|
|
209
|
+
});
|
|
210
|
+
await this.#audit.log({
|
|
211
|
+
entityType: 'memory',
|
|
212
|
+
entityId: fresh.id,
|
|
213
|
+
action: 'create',
|
|
214
|
+
after: this.#snapshotOf(fresh),
|
|
215
|
+
source: params.source ?? oldEntry.source,
|
|
216
|
+
...(params.sourceEventId === undefined ? {} : { sourceEventId: params.sourceEventId }),
|
|
217
|
+
...(oldEntry.sceneId === undefined ? {} : { sceneId: oldEntry.sceneId }),
|
|
218
|
+
});
|
|
219
|
+
const oldOwnerUserId = oldEntry.ownerUserId;
|
|
220
|
+
if (params.source !== 'tool' && this.#events !== undefined && oldOwnerUserId !== undefined && params.userNodeId !== undefined && oldEntry.instanceId !== undefined) {
|
|
221
|
+
await this.#events.appendEvent({ ownerUserId: oldOwnerUserId, characterId: oldEntry.characterId, ...(oldEntry.sceneId === undefined ? {} : { sceneId: oldEntry.sceneId }), fromNodeId: `character-instance:${oldEntry.instanceId}`, toNodeId: params.userNodeId, type: 'trust', delta: 1, source: params.source ?? 'system', idempotencyKey: `memory-supersede:${oldEntry.id}:${fresh.id}`, ...(params.sourceEventId === undefined ? {} : { sourceEventId: params.sourceEventId }) });
|
|
222
|
+
if (this.#projection !== undefined)
|
|
223
|
+
await this.#projection.recompute({ ownerUserId: oldOwnerUserId, characterId: oldEntry.characterId, ...(oldEntry.sceneId === undefined ? {} : { sceneId: oldEntry.sceneId }) });
|
|
224
|
+
}
|
|
225
|
+
return fresh;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* 标记正式记忆的聊天证据已失效。用户已经审阅接受的内容不会被自动删除,
|
|
229
|
+
* 但后续 UI/检索策略可据此提示或降权;重复标记不产生额外审计。
|
|
230
|
+
*/
|
|
231
|
+
async markEvidenceInvalidated(memoryId) {
|
|
232
|
+
const memory = this.#memories.get(memoryId);
|
|
233
|
+
if (memory === undefined)
|
|
234
|
+
return null;
|
|
235
|
+
if (memory.evidenceInvalidatedAt !== undefined)
|
|
236
|
+
return memory;
|
|
237
|
+
const next = { ...memory, evidenceInvalidatedAt: new Date().toISOString(), updatedAt: new Date().toISOString() };
|
|
238
|
+
await this.#memories.put(memoryId, next);
|
|
239
|
+
await this.#audit.log({
|
|
240
|
+
entityType: 'memory', entityId: memoryId, action: 'update',
|
|
241
|
+
before: this.#snapshotOf(memory), after: this.#snapshotOf(next), source: 'system',
|
|
242
|
+
...(next.sceneId === undefined ? {} : { sceneId: next.sceneId }),
|
|
243
|
+
});
|
|
244
|
+
return next;
|
|
245
|
+
}
|
|
246
|
+
/** 遗忘记忆:标记 forgotten(幂等;不存在或已非 active 时不写)。记录审计。 */
|
|
247
|
+
async forget(memoryId) {
|
|
248
|
+
const memory = this.#memories.get(memoryId);
|
|
249
|
+
if (memory === undefined || memory.status !== 'active')
|
|
250
|
+
return;
|
|
251
|
+
await this.#memories.put(memoryId, { ...memory, status: 'forgotten', updatedAt: new Date().toISOString() });
|
|
252
|
+
await this.#audit.log({
|
|
253
|
+
entityType: 'memory',
|
|
254
|
+
entityId: memoryId,
|
|
255
|
+
action: 'forget',
|
|
256
|
+
before: this.#snapshotOf(memory),
|
|
257
|
+
after: { ...this.#snapshotOf(memory), status: 'forgotten' },
|
|
258
|
+
source: memory.source,
|
|
259
|
+
...(memory.sceneId === undefined ? {} : { sceneId: memory.sceneId }),
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
/** 遗忘某个来源事件下的全部 active 记忆;返回处理条数。 */
|
|
263
|
+
async forgetBySourceEvent(sourceEventId, characterId) {
|
|
264
|
+
let forgotten = 0;
|
|
265
|
+
const now = new Date().toISOString();
|
|
266
|
+
for (const [, memory] of this.#memories.entries()) {
|
|
267
|
+
if (memory.status !== 'active')
|
|
268
|
+
continue;
|
|
269
|
+
if (memory.sourceEventId !== sourceEventId)
|
|
270
|
+
continue;
|
|
271
|
+
if (characterId !== undefined && memory.characterId !== characterId)
|
|
272
|
+
continue;
|
|
273
|
+
await this.#memories.put(memory.id, { ...memory, status: 'forgotten', updatedAt: now });
|
|
274
|
+
await this.#audit.log({
|
|
275
|
+
entityType: 'memory',
|
|
276
|
+
entityId: memory.id,
|
|
277
|
+
action: 'forget',
|
|
278
|
+
before: this.#snapshotOf(memory),
|
|
279
|
+
after: { ...this.#snapshotOf(memory), status: 'forgotten' },
|
|
280
|
+
source: memory.source,
|
|
281
|
+
...(memory.sceneId === undefined ? {} : { sceneId: memory.sceneId }),
|
|
282
|
+
});
|
|
283
|
+
forgotten += 1;
|
|
284
|
+
}
|
|
285
|
+
return forgotten;
|
|
286
|
+
}
|
|
287
|
+
/** 遗忘 sourceEventId 以指定前缀开头的全部 active 记忆;返回处理条数。 */
|
|
288
|
+
async forgetBySourceEventPrefix(prefix, characterId) {
|
|
289
|
+
let forgotten = 0;
|
|
290
|
+
const now = new Date().toISOString();
|
|
291
|
+
for (const [, memory] of this.#memories.entries()) {
|
|
292
|
+
if (memory.status !== 'active')
|
|
293
|
+
continue;
|
|
294
|
+
if (memory.sourceEventId === undefined || !memory.sourceEventId.startsWith(prefix))
|
|
295
|
+
continue;
|
|
296
|
+
if (characterId !== undefined && memory.characterId !== characterId)
|
|
297
|
+
continue;
|
|
298
|
+
await this.#memories.put(memory.id, { ...memory, status: 'forgotten', updatedAt: now });
|
|
299
|
+
await this.#audit.log({
|
|
300
|
+
entityType: 'memory',
|
|
301
|
+
entityId: memory.id,
|
|
302
|
+
action: 'forget',
|
|
303
|
+
before: this.#snapshotOf(memory),
|
|
304
|
+
after: { ...this.#snapshotOf(memory), status: 'forgotten' },
|
|
305
|
+
source: memory.source,
|
|
306
|
+
...(memory.sceneId === undefined ? {} : { sceneId: memory.sceneId }),
|
|
307
|
+
});
|
|
308
|
+
forgotten += 1;
|
|
309
|
+
}
|
|
310
|
+
return forgotten;
|
|
311
|
+
}
|
|
312
|
+
/** 指定角色(可再按场景)的全部 active 记忆;供候选冲突检测等只读扫描使用。 */
|
|
313
|
+
listActiveByCharacter(characterId, sceneId) {
|
|
314
|
+
const result = [];
|
|
315
|
+
for (const [, memory] of this.#memories.entries()) {
|
|
316
|
+
if (memory.characterId !== characterId)
|
|
317
|
+
continue;
|
|
318
|
+
if (memory.status !== 'active')
|
|
319
|
+
continue;
|
|
320
|
+
if (sceneId !== undefined && memory.sceneId !== sceneId)
|
|
321
|
+
continue;
|
|
322
|
+
result.push(memory);
|
|
323
|
+
}
|
|
324
|
+
return result;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* 场景内全部记忆(UI 数据面;含 superseded/forgotten 历史)。
|
|
328
|
+
* filter 支持 category / status;salience DESC → updatedAt DESC 排序。
|
|
329
|
+
*/
|
|
330
|
+
async listByScene(sceneId, filter) {
|
|
331
|
+
const result = [];
|
|
332
|
+
for (const [, memory] of this.#memories.entries()) {
|
|
333
|
+
if (memory.sceneId !== sceneId)
|
|
334
|
+
continue;
|
|
335
|
+
if (filter?.category !== undefined && memory.category !== filter.category)
|
|
336
|
+
continue;
|
|
337
|
+
if (filter?.status !== undefined && memory.status !== filter.status)
|
|
338
|
+
continue;
|
|
339
|
+
result.push(memory);
|
|
340
|
+
}
|
|
341
|
+
result.sort((a, b) => (b.salience - a.salience)
|
|
342
|
+
|| (a.updatedAt < b.updatedAt ? 1 : a.updatedAt > b.updatedAt ? -1 : 0));
|
|
343
|
+
return result;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=memory-service.js.map
|