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":"client.js","names":[],"sources":["../src/client/api/index.ts","../src/client/components/CompanionWorkspace.tsx","../src/client/components/PromotionWizard.tsx","../src/client/components/TavernDashboard.tsx","../src/client/index.tsx"],"sourcesContent":["/**\r\n * Tavern Remote API 客户端(阶段 5.5):类型 + fetch 封装 + useTavernApi hook。\r\n *\r\n * 所有数据只读(写操作经命令/工具);唯一写路径是「当前场景指针」\r\n * (POST /api/tavern/scene/current,会话级 UI 状态)。\r\n */\r\n\r\nimport { useCallback, useEffect, useState } from 'react'\r\n\r\nexport interface SceneView {\r\n readonly id: string\r\n readonly ownerUserId: string\r\n readonly title?: string\r\n readonly status: 'active' | 'archived' | 'trashed'\r\n readonly createdAt: string\r\n}\r\n\r\nexport interface InstanceView {\r\n readonly characterId: string\r\n readonly sceneId: string\r\n readonly parentSessionId: string\r\n readonly childId: string\r\n readonly createdAt: string\r\n}\r\n\r\nexport interface MemoryView {\r\n readonly id: string\r\n readonly characterId: string\r\n readonly sceneId?: string\r\n readonly instanceId?: string\r\n readonly fact: string\r\n readonly category: 'player' | 'world' | 'npc' | 'general'\r\n readonly status: 'active' | 'superseded' | 'forgotten'\r\n readonly confidence: number\r\n readonly salience: number\r\n readonly createdAt: string\r\n readonly updatedAt: string\r\n /** 已审阅记忆保留,但其来源消息后来已失效。 */\r\n readonly evidenceInvalidatedAt?: string\r\n}\r\n\r\nexport interface RelationshipEventView {\r\n readonly id: string\r\n readonly fromNodeId: string\r\n readonly toNodeId: string\r\n readonly type: 'trust' | 'familiarity' | 'affection' | 'ally' | 'rival'\r\n readonly delta: number\r\n readonly reason?: string\r\n readonly createdAt: string\r\n}\r\nexport async function listRelationshipEvents(sceneId?: string): Promise<RelationshipEventView[]> {\r\n const query = sceneId === undefined ? '' : `?sceneId=${encodeURIComponent(sceneId)}`\r\n const result = await getJson<{ readonly events: readonly RelationshipEventView[] }>(`/api/tavern/relationships/events${query}`)\r\n return [...result.events]\r\n}\r\n\r\n\r\nexport interface RelationshipView {\r\n readonly id: string\r\n readonly fromNodeId: string\r\n readonly toNodeId: string\r\n readonly type: 'trust' | 'familiarity' | 'affection' | 'ally' | 'rival'\r\n readonly value: number\r\n readonly status: 'active' | 'superseded' | 'archived'\r\n readonly sceneId?: string\r\n readonly createdAt: string\r\n}\r\n\r\nexport interface AuditView {\r\n readonly id: string\r\n readonly entityType: string\r\n readonly entityId: string\r\n readonly action: string\r\n readonly before?: unknown\r\n readonly after?: unknown\r\n readonly source: string\r\n readonly sourceEventId?: string\r\n readonly actorId?: string\r\n readonly sceneId?: string\r\n readonly createdAt: string\r\n}\r\n\r\nexport async function getJson<T>(path: string): Promise<T> {\r\n const response = await fetch(path, { headers: { accept: 'application/json' } })\r\n const value = await response.json() as { readonly error?: string } & T\r\n if (!response.ok) throw new Error(value.error ?? `请求失败(${response.status})`)\r\n return value\r\n}\r\n\r\nexport interface TavernApi {\r\n readonly scenes: readonly SceneView[] | null\r\n readonly sceneId: string | null\r\n readonly error: string | null\r\n readonly refresh: () => void\r\n readonly switchScene: (sceneId: string) => Promise<void>\r\n}\r\n\r\n/** 场景数据面 hook:拉取场景列表 + 当前场景指针;切换后自动刷新。 */\r\nexport function useTavernApi(): TavernApi {\r\n const [scenes, setScenes] = useState<readonly SceneView[] | null>(null)\r\n const [sceneId, setSceneId] = useState<string | null>(null)\r\n const [error, setError] = useState<string | null>(null)\r\n const [tick, setTick] = useState(0)\r\n\r\n useEffect(() => {\r\n let cancelled = false\r\n Promise.all([\r\n getJson<{ readonly scenes: readonly SceneView[] }>('/api/tavern/scenes'),\r\n getJson<{ readonly sceneId: string | null }>('/api/tavern/scene/current'),\r\n ])\r\n .then(([scenesResult, current]) => {\r\n if (cancelled) return\r\n setScenes(scenesResult.scenes)\r\n setSceneId(current.sceneId)\r\n setError(null)\r\n })\r\n .catch(caught => {\r\n if (!cancelled) setError(caught instanceof Error ? caught.message : String(caught))\r\n })\r\n return () => { cancelled = true }\r\n }, [tick])\r\n\r\n const refresh = useCallback(() => setTick(value => value + 1), [])\r\n\r\n const switchScene = useCallback(async (next: string): Promise<void> => {\r\n try {\r\n const response = await fetch('/api/tavern/scene/current', {\r\n method: 'POST',\r\n headers: { accept: 'application/json', 'content-type': 'application/json' },\r\n body: JSON.stringify({ sceneId: next }),\r\n })\r\n const value = await response.json() as { readonly error?: string; readonly sceneId?: unknown }\r\n if (!response.ok || typeof value.sceneId !== 'string') {\r\n throw new Error(value.error ?? `切换场景失败(${response.status})`)\r\n }\r\n setSceneId(value.sceneId)\r\n setError(null)\r\n setTick(current => current + 1)\r\n } catch (caught) {\r\n setError(caught instanceof Error ? caught.message : String(caught))\r\n }\r\n }, [])\r\n\r\n return { scenes, sceneId, error, refresh, switchScene }\r\n}\r\n\r\n// ── 阶段 2:普通聊天 API(非 Agent,SSE)──\r\n\r\nexport interface CharacterChoice {\r\n readonly id: string\r\n readonly name: string\r\n readonly revision: number\r\n}\r\n\r\nexport interface ChatConversationView {\r\n readonly id: string\r\n readonly characterId: string\r\n readonly characterRevision: number\r\n /** 场景归属(工作区分组:文件夹 = 场景)。 */\r\n readonly sceneId?: string\r\n readonly title?: string\r\n readonly activeLeafMessageId?: string\r\n readonly status: 'active' | 'archived' | 'trashed'\r\n readonly createdAt: string\r\n readonly updatedAt: string\r\n}\r\n\r\nexport interface TavernSceneChoice {\r\n readonly id: string\r\n readonly title?: string\r\n readonly status: 'active' | 'archived' | 'trashed'\r\n readonly createdAt: string\r\n}\r\n\r\nexport async function listTavernScenes(): Promise<TavernSceneChoice[]> {\r\n const value = await getJson<{ readonly scenes: readonly TavernSceneChoice[] }>('/api/tavern/scenes')\r\n return [...value.scenes]\r\n}\r\n\r\nexport interface ChatMessageView {\r\n readonly id: string\r\n readonly conversationId: string\r\n readonly parentMessageId?: string\r\n readonly role: 'user' | 'assistant' | 'system'\r\n readonly content: string\r\n readonly status: 'active' | 'edited' | 'superseded'\r\n readonly createdAt: string\r\n}\r\n\r\nexport interface SseEvent {\r\n readonly type: string\r\n readonly [key: string]: unknown\r\n}\r\n\r\nexport async function listCharacters(): Promise<CharacterChoice[]> {\r\n const value = await getJson<{ readonly characters: readonly CharacterChoice[] }>('/api/tavern/characters')\r\n return [...value.characters]\r\n}\r\n\r\nexport async function getTavernWorkspacePath(): Promise<string> {\r\n const value = await getJson<{ readonly path: string }>('/api/tavern/workspace')\r\n return value.path\r\n}\r\n\r\nexport async function listChatConversations(): Promise<ChatConversationView[]> {\r\n const value = await getJson<{ readonly conversations: readonly ChatConversationView[] }>('/api/chat/conversations')\r\n return [...value.conversations]\r\n}\r\n\r\nexport async function listChatMessages(conversationId: string): Promise<ChatMessageView[]> {\r\n const value = await getJson<{ readonly messages: readonly ChatMessageView[] }>(\r\n `/api/chat/messages?conversationId=${encodeURIComponent(conversationId)}`,\r\n )\r\n return [...value.messages]\r\n}\r\n\r\nexport async function getChatGreetings(characterId: string): Promise<string[]> {\r\n const value = await getJson<{ readonly greetings: readonly string[] }>(\r\n `/api/chat/greetings?characterId=${encodeURIComponent(characterId)}`,\r\n )\r\n return [...value.greetings]\r\n}\r\n\r\nexport async function createChatConversation(characterId: string, options?: {\r\n greetingIndex?: number\r\n sceneId?: string\r\n}): Promise<string> {\r\n const response = await fetch('/api/chat/conversations', {\r\n method: 'POST',\r\n headers: { accept: 'application/json', 'content-type': 'application/json' },\r\n body: JSON.stringify({\r\n characterId,\r\n ...(options?.greetingIndex === undefined ? {} : { greetingIndex: options.greetingIndex }),\r\n ...(options?.sceneId === undefined ? {} : { sceneId: options.sceneId }),\r\n }),\r\n })\r\n const value = await response.json() as { readonly error?: string; readonly conversationId?: unknown }\r\n if (!response.ok || typeof value.conversationId !== 'string') {\r\n throw new Error(value.error ?? `新建会话失败(${response.status})`)\r\n }\r\n return value.conversationId\r\n}\r\n\r\nexport async function editChatMessage(conversationId: string, messageId: string, newContent: string): Promise<string> {\r\n const response = await fetch('/api/chat/edit', {\r\n method: 'POST',\r\n headers: { accept: 'application/json', 'content-type': 'application/json' },\r\n body: JSON.stringify({ conversationId, messageId, newContent }),\r\n })\r\n const value = await response.json() as { readonly error?: string; readonly messageId?: unknown }\r\n if (!response.ok || typeof value.messageId !== 'string') {\r\n throw new Error(value.error ?? `编辑失败(${response.status})`)\r\n }\r\n return value.messageId\r\n}\r\n\r\nexport async function switchChatBranch(conversationId: string, messageId: string): Promise<void> {\r\n const response = await fetch('/api/chat/branch', {\r\n method: 'POST',\r\n headers: { accept: 'application/json', 'content-type': 'application/json' },\r\n body: JSON.stringify({ conversationId, messageId }),\r\n })\r\n if (!response.ok) {\r\n const value = await response.json() as { readonly error?: string }\r\n throw new Error(value.error ?? `切换分支失败(${response.status})`)\r\n }\r\n}\r\n\r\n/** SSE POST 流(/api/chat/stream、/api/chat/regenerate)。 */\r\nasync function streamSse(url: string, body: unknown): Promise<AsyncIterable<SseEvent>> {\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: { accept: 'text/event-stream', 'content-type': 'application/json' },\r\n body: JSON.stringify(body),\r\n })\r\n if (!response.ok) {\r\n const raw = await response.text()\r\n throw new Error(raw.trim() === '' ? `HTTP ${response.status}` : raw)\r\n }\r\n if (response.body === null) throw new Error('无响应体')\r\n\r\n const reader = response.body.getReader()\r\n const decoder = new TextDecoder()\r\n let buffer = ''\r\n return (async function* () {\r\n while (true) {\r\n const { done, value } = await reader.read()\r\n if (done) break\r\n buffer += decoder.decode(value, { stream: true })\r\n let index: number\r\n while ((index = buffer.indexOf('\\n\\n')) !== -1) {\r\n const chunk = buffer.slice(0, index)\r\n buffer = buffer.slice(index + 2)\r\n const line = chunk.split('\\n').find(item => item.startsWith('data: '))\r\n if (line !== undefined) {\r\n try {\r\n yield JSON.parse(line.slice(6)) as SseEvent\r\n } catch {\r\n // 忽略坏帧(SSE 仅预览通道,持久消息是事实源)\r\n }\r\n }\r\n }\r\n }\r\n })()\r\n}\r\n\r\n/** 把聊天文件载入或恢复为它独有的 Tavern 原生会话。 */\r\nexport async function trashCharacter(characterId: string): Promise<void> {\r\n const response = await fetch('/api/chat/characters/trash', { method: 'POST', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify({ characterId }) })\r\n if (!response.ok) { const value = await response.json() as { error?: string }; throw new Error(value.error ?? `删除角色失败(${response.status})`) }\r\n}\r\nexport interface TrashedCharacterChoice extends CharacterChoice { readonly trashedAt?: string }\r\nexport async function listTrashedCharacters(): Promise<TrashedCharacterChoice[]> { const value = await getJson<{ characters: readonly TrashedCharacterChoice[] }>('/api/chat/characters/trashed'); return [...value.characters] }\r\nexport async function restoreCharacter(characterId: string): Promise<void> { const response = await fetch('/api/chat/characters/restore', { method: 'POST', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify({ characterId }) }); if (!response.ok) { const value = await response.json() as { error?: string }; throw new Error(value.error ?? `恢复角色失败(${response.status})`) } }\r\n\r\nexport async function renameChatConversation(conversationId: string, title: string): Promise<void> { const response = await fetch('/api/chat/rename', { method: 'POST', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify({ conversationId, title }) }); if (!response.ok) { const value = await response.json() as { error?: string }; throw new Error(value.error ?? `重命名失败(${response.status})`) } }\r\nexport async function trashChatConversation(conversationId: string): Promise<void> { const response = await fetch('/api/chat/trash', { method: 'POST', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify({ conversationId }) }); if (!response.ok) { const value = await response.json() as { error?: string }; throw new Error(value.error ?? `删除聊天失败(${response.status})`) } }\r\nexport async function restoreChatConversation(conversationId: string): Promise<void> { const response = await fetch('/api/chat/restore', { method: 'POST', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify({ conversationId }) }); if (!response.ok) { const value = await response.json() as { error?: string }; throw new Error(value.error ?? `恢复聊天失败(${response.status})`) } }\r\n\r\nexport async function openChatConversation(conversationId: string): Promise<{ sessionId: string; conversationId: string }> {\r\n const response = await fetch('/api/chat/open', {\r\n method: 'POST',\r\n headers: { accept: 'application/json', 'content-type': 'application/json' },\r\n body: JSON.stringify({ conversationId }),\r\n })\r\n const value = await response.json() as { readonly error?: string; readonly sessionId?: unknown; readonly conversationId?: unknown }\r\n if (!response.ok || typeof value.sessionId !== 'string' || typeof value.conversationId !== 'string') {\r\n throw new Error(value.error ?? `打开聊天失败(${response.status})`)\r\n }\r\n return { sessionId: value.sessionId, conversationId: value.conversationId }\r\n}\r\n\r\nexport interface CharacterImportResult {\r\n readonly characterId: string\r\n readonly name: string\r\n readonly revision: number\r\n readonly deduplicated: boolean\r\n}\r\n\r\n/** 在 Tavern 设置页明确选择文件导入角色卡。 */\r\nexport async function importCharacterCard(file: File): Promise<CharacterImportResult> {\r\n const response = await fetch(`/api/tavern/import?filename=${encodeURIComponent(file.name)}`, {\r\n method: 'POST', headers: { accept: 'application/json' }, body: file,\r\n })\r\n const value = await response.json() as { readonly error?: string } & CharacterImportResult\r\n if (!response.ok || typeof value.characterId !== 'string') throw new Error(value.error ?? `导入角色卡失败(${response.status})`)\r\n return value\r\n}\r\n\r\n/** 导出聊天文件(SillyTavern 兼容 jsonl 文本)。 */\r\nexport async function exportChatFile(conversationId: string): Promise<string> {\r\n const value = await getJson<{ readonly jsonl: string }>(\r\n `/api/chat/export?conversationId=${encodeURIComponent(conversationId)}`,\r\n )\r\n return value.jsonl\r\n}\r\n\r\n/** 导入聊天文件(SillyTavern jsonl → 新聊天文件)。 */\r\nexport async function importChatFile(characterId: string, content: string, title?: string): Promise<string> {\r\n const response = await fetch('/api/chat/import', {\r\n method: 'POST',\r\n headers: { accept: 'application/json', 'content-type': 'application/json' },\r\n body: JSON.stringify({ characterId, content, ...(title === undefined ? {} : { title }) }),\r\n })\r\n const value = await response.json() as { readonly error?: string; readonly conversationId?: unknown }\r\n if (!response.ok || typeof value.conversationId !== 'string') {\r\n throw new Error(value.error ?? `导入失败(${response.status})`)\r\n }\r\n return value.conversationId\r\n}\r\n\r\nexport async function streamChat(body: {\r\n characterId: string\r\n message: string\r\n conversationId?: string\r\n sceneId?: string\r\n}): Promise<AsyncIterable<SseEvent>> {\r\n return streamSse('/api/chat/stream', body)\r\n}\r\n\r\n// ── 阶段 2:DSH 原生会话绑定(ADR-008,工作区管理)──\r\n\r\nexport interface ChatBindingView {\r\n readonly sessionId: string\r\n readonly conversationId: string\r\n readonly characterId: string\r\n readonly updatedAt: string\r\n}\r\n\r\nexport async function listChatBindings(): Promise<ChatBindingView[]> {\r\n const value = await getJson<{ readonly bindings: readonly ChatBindingView[] }>('/api/chat/bindings')\r\n return [...value.bindings]\r\n}\r\n\r\nexport async function bindChatConversation(characterId: string, options?: {\r\n greetingIndex?: number\r\n sceneId?: string\r\n}): Promise<{ sessionId: string; conversationId: string }> {\r\n const response = await fetch('/api/chat/bind', {\r\n method: 'POST',\r\n headers: { accept: 'application/json', 'content-type': 'application/json' },\r\n body: JSON.stringify({\r\n characterId,\r\n ...(options?.greetingIndex === undefined ? {} : { greetingIndex: options.greetingIndex }),\r\n ...(options?.sceneId === undefined ? {} : { sceneId: options.sceneId }),\r\n }),\r\n })\r\n const value = await response.json() as {\r\n readonly error?: string\r\n readonly sessionId?: unknown\r\n readonly conversationId?: unknown\r\n }\r\n if (!response.ok || typeof value.sessionId !== 'string' || typeof value.conversationId !== 'string') {\r\n throw new Error(value.error ?? `绑定会话失败(${response.status})`)\r\n }\r\n return { sessionId: value.sessionId, conversationId: value.conversationId }\r\n}\r\n\r\nexport async function bindCompanionAgentSession(companionProfileId: string): Promise<{ sessionId: string; conversationId: string; restored: boolean }> {\r\n const response = await fetch('/api/chat/bind-companion-agent', {\r\n method: 'POST',\r\n headers: { accept: 'application/json', 'content-type': 'application/json' },\r\n body: JSON.stringify({ companionProfileId }),\r\n })\r\n const value = await response.json() as { readonly error?: string; readonly sessionId?: unknown; readonly conversationId?: unknown; readonly restored?: unknown }\r\n if (!response.ok || typeof value.sessionId !== 'string' || typeof value.conversationId !== 'string' || typeof value.restored !== 'boolean') throw new Error(value.error ?? `打开伙伴 Agent 会话失败(${response.status})`)\r\n return { sessionId: value.sessionId, conversationId: value.conversationId, restored: value.restored }\r\n}\r\nexport async function regenerateChat(body: {\r\n conversationId: string\r\n messageId: string\r\n sceneId?: string\r\n}): Promise<AsyncIterable<SseEvent>> {\r\n return streamSse('/api/chat/regenerate', body)\r\n}\r\n\r\n// ── 阶段 3:候选记忆审阅(所有 owner/ACL 判断在 Host 端完成)──\r\nexport interface CandidateView {\r\n readonly id: string\r\n readonly characterId: string\r\n readonly conversationId: string\r\n readonly kind: string\r\n readonly proposedContent: string\r\n readonly sourceMessageIds: readonly string[]\r\n readonly rationale?: string\r\n readonly confidence: number\r\n readonly sensitivity: 'low' | 'medium' | 'high'\r\n readonly status: 'pending' | 'accepted' | 'rejected' | 'superseded' | 'evidence-invalid'\r\n}\r\nexport interface CandidateEvidenceMessage {\r\n readonly id: string\r\n readonly role: 'user' | 'assistant' | 'system'\r\n readonly content: string\r\n readonly createdAt: string\r\n}\r\nexport async function listMemoryCandidates(status: CandidateView['status'] = 'pending'): Promise<CandidateView[]> {\r\n const result = await getJson<{ readonly candidates: readonly CandidateView[] }>(`/api/tavern/candidates?status=${encodeURIComponent(status)}`)\r\n return [...result.candidates]\r\n}\r\nexport async function getMemoryCandidateEvidence(id: string): Promise<CandidateEvidenceMessage[]> {\r\n const result = await getJson<{ readonly messages: readonly CandidateEvidenceMessage[] }>(\r\n `/api/tavern/candidates/${encodeURIComponent(id)}/evidence`,\r\n )\r\n return [...result.messages]\r\n}\r\nexport interface CandidateConflictView {\r\n readonly id: string\r\n readonly fact: string\r\n readonly sourceMessageIds?: readonly string[]\r\n readonly sourceEventId?: string\r\n}\r\nexport class CandidateConflictError extends Error {\r\n readonly conflicts: readonly CandidateConflictView[]\r\n constructor(conflicts: readonly CandidateConflictView[]) {\r\n super('candidate-conflict')\r\n this.conflicts = conflicts\r\n }\r\n}\r\nexport async function reviewMemoryCandidate(id: string, accepted: boolean, content?: string, supersedeMemoryId?: string): Promise<void> {\r\n const response = await fetch(`/api/tavern/candidates/${encodeURIComponent(id)}/${accepted ? 'accept' : 'reject'}`, {\r\n method: 'POST', headers: { accept: 'application/json', 'content-type': 'application/json' },\r\n ...(accepted && (content !== undefined || supersedeMemoryId !== undefined)\r\n ? { body: JSON.stringify({ ...(content === undefined ? {} : { content }), ...(supersedeMemoryId === undefined ? {} : { supersedeMemoryId }) }) }\r\n : {}),\r\n })\r\n if (!response.ok) {\r\n const value = await response.json() as { error?: string; conflicts?: unknown }\r\n if (response.status === 409 && Array.isArray(value.conflicts)) {\r\n throw new CandidateConflictError(value.conflicts as CandidateConflictView[])\r\n }\r\n throw new Error(value.error ?? `审阅失败(${response.status})`)\r\n }\r\n}\r\nexport async function markMemoryCandidateSensitive(id: string, sensitivity: 'low' | 'medium' | 'high'): Promise<void> {\r\n const response = await fetch(`/api/tavern/candidates/${encodeURIComponent(id)}/mark-sensitive`, {\r\n method: 'POST', headers: { accept: 'application/json', 'content-type': 'application/json' },\r\n body: JSON.stringify({ sensitivity }),\r\n })\r\n if (!response.ok) { const value = await response.json() as { error?: string }; throw new Error(value.error ?? `标记敏感失败(${response.status})`) }\r\n}\r\nexport async function supersedeMemoryCandidate(id: string, newContent: string): Promise<void> {\r\n const response = await fetch(`/api/tavern/candidates/${encodeURIComponent(id)}/supersede`, {\r\n method: 'POST', headers: { accept: 'application/json', 'content-type': 'application/json' },\r\n body: JSON.stringify({ newContent }),\r\n })\r\n if (!response.ok) { const value = await response.json() as { error?: string }; throw new Error(value.error ?? `更正候选失败(${response.status})`) }\r\n}\r\nexport async function extractMemoryCandidates(conversationId: string): Promise<void> {\r\n const response = await fetch('/api/tavern/candidates/extract', { method: 'POST', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify({ conversationId }) })\r\n if (!response.ok) { const value = await response.json() as { error?: string }; throw new Error(value.error ?? `提取失败(${response.status})`) }\r\n}\r\n\r\n// ── 阶段 4:伙伴档案 API ──\r\nexport interface CompanionProfileView { readonly id: string; readonly characterId: string; readonly displayName?: string; readonly modelPreference?: { readonly mode: 'inherit-dsh-session' | 'inherit-dsh-default' | 'runtime-default'; readonly providerId?: string; readonly modelId?: string }; readonly characterRevision?: number; readonly status: 'active' | 'paused' | 'retired'; readonly identitySummary?: string; readonly communicationPreferences?: string; readonly personalitySummary?: string; readonly personalityVersion?: number; readonly userRelationshipSummary?: string; readonly sharedHistorySummary?: string; readonly boundaries: readonly string[]; readonly goals: readonly string[] }\r\nexport interface PersonalityCandidateView { readonly id: string; readonly traitName: string; readonly description: string; readonly strength: number; readonly confidence: number; readonly status: 'pending' | 'accepted' | 'rejected' | 'superseded' | 'evidence-invalid' }\r\nasync function stage4Post<T>(path: string, body: unknown): Promise<T> { const response = await fetch(`/api/tavern/stage4${path}`, { method: 'POST', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify(body) }); const value = await response.json() as T & { error?: string }; if (!response.ok) throw new Error(value.error ?? `请求失败(${response.status})`); return value }\r\nexport async function listCompanionProfiles(): Promise<readonly CompanionProfileView[]> { return (await getJson<{ readonly profiles: readonly CompanionProfileView[] }>('/api/tavern/stage4/companions')).profiles }\r\nexport interface PromotionCandidateView { readonly source: { readonly characterId: string; readonly conversationId: string; readonly messageIds: readonly string[]; readonly provider: string; readonly model: string }; readonly identity: { readonly suggestedDisplayName: string; readonly identitySummary: string }; readonly relationship: { readonly summary: string; readonly communicationStyle: readonly string[]; readonly evidenceMessageIds: readonly string[] }; readonly sharedHistory: { readonly summary: string; readonly events: readonly { readonly content: string; readonly evidenceMessageIds: readonly string[] }[]; readonly evidenceMessageIds: readonly string[] }; readonly memories: readonly { readonly content: string; readonly category: string; readonly confidence: number; readonly sensitivity: 'normal' | 'sensitive' | 'high'; readonly evidenceMessageIds: readonly string[]; readonly recommendation: 'keep' | 'review' | 'exclude' }[]; readonly personality: readonly { readonly name: string; readonly description: string; readonly strength: number; readonly confidence: number; readonly evidenceMessageIds: readonly string[]; readonly recommendation: 'keep' | 'review' | 'exclude' }[]; readonly roleplay: { readonly speakingStyle: readonly string[]; readonly preferredPatterns: readonly string[]; readonly avoidPatterns: readonly string[] }; readonly goals: readonly string[]; readonly boundaries: readonly string[] }\r\nexport async function previewCompanionPromotion(characterId: string, conversationId: string): Promise<PromotionCandidateView> { return (await stage4Post<{ readonly candidate: PromotionCandidateView }>('/promotions/preview', { characterId, conversationId })).candidate }\r\nexport interface PromoteCompanionInput { readonly characterId: string; readonly displayName?: string; readonly identitySummary?: string; readonly userRelationshipSummary?: string; readonly sharedHistorySummary?: string; readonly communicationPreferences?: string; readonly boundaries?: readonly string[]; readonly goals?: readonly string[]; readonly sourceConversationId?: string; readonly confirmedMemories?: readonly { readonly content: string; readonly category: string; readonly confidence: number; readonly evidenceMessageIds: readonly string[] }[]; readonly confirmedSharedHistory?: readonly { readonly content: string; readonly evidenceMessageIds: readonly string[] }[]; readonly confirmedPersonality?: readonly { readonly name: string; readonly description: string; readonly strength: number; readonly confidence: number; readonly evidenceMessageIds: readonly string[] }[] }\r\nexport async function promoteCompanion(input: PromoteCompanionInput): Promise<CompanionProfileView> { return (await stage4Post<{ readonly profile: CompanionProfileView }>('/companions/promote', input)).profile }\r\nexport interface CompanionDetailView { readonly profile: CompanionProfileView & { readonly personalityTraits?: readonly { id: string; name: string; description: string; strength: number; confidence: number; source: string }[] }; readonly skills: readonly { id: string; name: string; description: string; status: 'active' | 'disabled'; version: number }[]; readonly memories: readonly { id: string; fact: string; category: string }[]; readonly workspaces: readonly { workspace: { id: string; name: string }; sceneIds: readonly string[] }[]; readonly personalityCandidates: readonly PersonalityCandidateView[] }\r\nexport interface CompanionRuntimeBindingView { readonly id: string; readonly companionProfileId: string; readonly runtimeType: 'dsh-child' | 'langgraph-thread' | 'generation'; readonly runtimeId: string; readonly purpose: 'companion' | 'group-delivery' | 'chat-generation'; readonly status: 'requested' | 'active' | 'suspended' | 'released' | 'orphaned' | 'reclaimed'; readonly createdAt: string; readonly releasedAt?: string }\r\nexport async function listCompanionRuntimeBindings(): Promise<readonly CompanionRuntimeBindingView[]> {\r\n return (await getJson<{ readonly bindings: readonly CompanionRuntimeBindingView[] }>('/api/tavern/stage5/runtime/bindings')).bindings\r\n}\r\nexport async function getCompanionDetail(id: string): Promise<CompanionDetailView> { return getJson<CompanionDetailView>(`/api/tavern/stage4/companions/${encodeURIComponent(id)}`) }\r\nexport async function createCompanionSkill(profileId: string, input: { name: string; description: string; instructions: string; workflowId: 'conversation' | 'analysis' | 'planning' | 'research' }): Promise<void> {\r\n await stage4Post(`/companions/${encodeURIComponent(profileId)}/skills`, input)\r\n}\r\nexport async function setCompanionSkillStatus(id: string, enabled: boolean): Promise<void> { await stage4Post(`/skills/${encodeURIComponent(id)}/${enabled ? 'enable' : 'disable'}`, {}) }\r\nexport async function setCompanionModelPreference(id: string, preference: { mode: 'inherit-dsh-session' | 'inherit-dsh-default' | 'runtime-default' }): Promise<void> { await stage4Post(`/companions/${encodeURIComponent(id)}/model`, preference) }\r\nexport async function renameCompanion(id: string, displayName: string): Promise<CompanionProfileView> { return (await stage4Post<{ readonly profile: CompanionProfileView }>(`/companions/${encodeURIComponent(id)}/name`, { displayName })).profile }\r\nexport async function setCompanionStatus(id: string, status: 'active' | 'paused' | 'retired'): Promise<CompanionProfileView> { return (await stage4Post<{ readonly profile: CompanionProfileView }>(`/companions/${encodeURIComponent(id)}/status`, { status })).profile }\r\n\r\nexport async function listCompanionRelationships(id: string, sceneId?: string): Promise<readonly { fromNodeId: string; toNodeId: string; type: string; value: number }[]> { const query = sceneId === undefined ? '' : `?sceneId=${encodeURIComponent(sceneId)}`; return (await getJson<{ relationships: readonly { fromNodeId: string; toNodeId: string; type: string; value: number }[] }>(`/api/companions/${encodeURIComponent(id)}/relationships${query}`)).relationships }\r\nexport async function reviewPersonalityCandidate(id: string, accepted: boolean): Promise<void> { const response = await fetch(`/api/tavern/personality-candidates/${encodeURIComponent(id)}/${accepted ? 'accept' : 'reject'}`, { method: 'POST', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify({}) }); if (!response.ok) { const value = await response.json() as { error?: string }; throw new Error(value.error ?? `性格审阅失败(${response.status})`) } }\r\n\r\n\r\n\r\n// ── 阶段 5/6:Companion 运行与娱乐空间 ──\r\nexport interface WorkspaceView { readonly id: string; readonly name: string; readonly status: 'active' | 'suspended' | 'archived'; readonly sceneIds: readonly string[] }\r\nexport interface RuntimeEventView { readonly type: string; readonly message?: string; readonly content?: string; readonly tool?: string; readonly reason?: string; readonly [key: string]: unknown }\r\nexport interface RuntimeRunView { readonly binding: { readonly id: string; readonly status: string; readonly purpose: string }; readonly events: readonly RuntimeEventView[] }\r\nexport async function listCompanionWorkspaces(): Promise<readonly WorkspaceView[]> {\r\n return (await getJson<{ readonly workspaces: readonly WorkspaceView[] }>('/api/tavern/stage4/workspaces')).workspaces\r\n}\r\nexport async function createCompanionWorkspace(name: string): Promise<WorkspaceView> { const value = await stage4Post<{ readonly workspace: Omit<WorkspaceView, 'sceneIds'>; readonly sceneId?: string }>('/workspaces', { name, createDefaultScene: true }); return { ...value.workspace, sceneIds: value.sceneId ? [value.sceneId] : [] } }\r\nexport async function addCompanionToWorkspace(workspaceId: string, companionProfileId: string, sceneId: string): Promise<void> { await stage4Post('/workspaces/members', { workspaceId, companionProfileId, sceneId }) }\r\nexport interface WorkspaceDetailView { readonly members: readonly { readonly entityId: string }[]; readonly scenes: readonly { readonly id: string; readonly title?: string; readonly status: 'active' | 'archived' }[] }\r\nexport async function getCompanionWorkspaceDetail(workspaceId: string): Promise<WorkspaceDetailView> { return getJson<WorkspaceDetailView>(`/api/tavern/stage4/workspaces/${encodeURIComponent(workspaceId)}/details`) }\r\nexport async function removeCompanionFromWorkspace(workspaceId: string, companionProfileId: string): Promise<void> { await stage4Post('/workspaces/members/remove', { workspaceId, companionProfileId }) }\r\nexport async function openEntertainmentWorkspaceSession(workspaceId: string): Promise<{ sessionId: string; threadId: string }> { return stage4Post(`/workspaces/${encodeURIComponent(workspaceId)}/open-session`, {}) }\r\nexport async function invokeCompanion(input: { companionProfileId: string; message: string; directParentSessionId: string; workspaceId?: string; sceneId?: string }): Promise<RuntimeRunView> {\r\n const response = await fetch('/api/tavern/stage5/runtime/invoke', { method: 'POST', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify(input) })\r\n const value = await response.json() as RuntimeRunView & { error?: string }\r\n if (!response.ok) throw new Error(value.error ?? `子代理运行失败(${response.status})`)\r\n return value\r\n}\r\nexport interface GroupThreadView { readonly id: string; readonly workspaceId: string; readonly sceneId: string; readonly status: 'active' | 'closed' }\r\nexport interface GroupMessageView { readonly id: string; readonly senderKind: 'user' | 'companion'; readonly senderId: string; readonly senderName?: string; readonly content: string; readonly sequence: number }\r\nexport type GroupBatchState = 'queued' | 'running' | 'completed' | 'partial' | 'failed'\r\nexport interface GroupDeliveryView { readonly id: string; readonly companionProfileId: string; readonly companionName?: string; readonly status: 'accepted' | 'running' | 'completed' | 'failed' | 'cancelled'; readonly responseMessageId?: string; readonly error?: string }\r\nexport interface GroupBatchStatusView {\r\n readonly batch: { readonly id: string; readonly status: GroupBatchState; readonly completedAt?: string }\r\n readonly decision: { readonly selectedCompanionIds: readonly string[]; readonly excludedCompanionIds: readonly string[]; readonly selectionReasons: Readonly<Record<string, readonly string[]>>; readonly exclusionReasons: Readonly<Record<string, readonly string[]>> }\r\n readonly deliveries: readonly GroupDeliveryView[]\r\n}\r\nexport async function listGroupThreads(workspaceId: string): Promise<readonly GroupThreadView[]> { return (await getJson<{ readonly threads: readonly GroupThreadView[] }>(`/api/tavern/stage6/groups/threads?workspaceId=${encodeURIComponent(workspaceId)}`)).threads }\r\nexport async function createGroupThread(workspaceId: string, sceneId: string): Promise<GroupThreadView> {\r\n const response = await fetch('/api/tavern/stage6/groups/threads', { method: 'POST', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify({ workspaceId, sceneId }) })\r\n const value = await response.json() as { thread?: GroupThreadView; error?: string }\r\n if (!response.ok || !value.thread) throw new Error(value.error ?? `创建娱乐空间失败(${response.status})`)\r\n return value.thread\r\n}\r\nexport async function postGroupMessage(threadId: string, content: string, mentions: string[] = []): Promise<{ message: GroupMessageView; batch: { id: string }; deliveries: readonly GroupDeliveryView[] }> {\r\n const response = await fetch(`/api/tavern/stage6/groups/threads/${encodeURIComponent(threadId)}/messages`, { method: 'POST', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify({ content, mentions }) })\r\n const value = await response.json() as { message?: GroupMessageView; batch?: { id: string }; deliveries?: readonly GroupDeliveryView[]; error?: string }\r\n if (!response.ok || !value.message || !value.batch) throw new Error(value.error ?? `发送群聊消息失败(${response.status})`)\r\n return { message: value.message, batch: value.batch, deliveries: value.deliveries ?? [] }\r\n}\r\nexport async function listGroupMessages(threadId: string): Promise<readonly GroupMessageView[]> {\r\n return (await getJson<{ readonly messages: readonly GroupMessageView[] }>(`/api/tavern/stage6/groups/threads/${encodeURIComponent(threadId)}/messages`)).messages\r\n}\r\nexport async function getGroupBatchStatus(batchId: string): Promise<GroupBatchStatusView> {\r\n return getJson<GroupBatchStatusView>(`/api/tavern/stage6/groups/batches/${encodeURIComponent(batchId)}`)\r\n}\r\nexport async function runGroupBatch(batchId: string, directParentSessionId: string): Promise<{ messages: readonly GroupMessageView[]; deliveries: readonly { companionProfileId: string; status: string }[] }> {\r\n const response = await fetch(`/api/tavern/stage6/groups/batches/${encodeURIComponent(batchId)}/run`, { method: 'POST', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify({ directParentSessionId }) })\r\n const value = await response.json() as { messages?: readonly GroupMessageView[]; deliveries?: readonly { companionProfileId: string; status: string }[]; error?: string }\r\n if (!response.ok) throw new Error(value.error ?? `运行娱乐空间失败(${response.status})`)\r\n return { messages: value.messages ?? [], deliveries: value.deliveries ?? [] }\r\n}\r\n","import { useCallback, useEffect, useMemo, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport type { CompanionDetailView, CompanionProfileView, GroupBatchState, GroupDeliveryView, GroupMessageView, WorkspaceView } from '../api/index.js'\nimport {\n createCompanionSkill,\n setCompanionSkillStatus,\n bindCompanionAgentSession,\n getCompanionDetail,\n listCompanionProfiles,\n listCompanionRelationships,\n listCompanionWorkspaces,\n listGroupMessages,\n createCompanionWorkspace,\n addCompanionToWorkspace,\n postGroupMessage,\n renameCompanion,\n listCompanionRuntimeBindings,\n getCompanionWorkspaceDetail,\n getGroupBatchStatus,\n listGroupThreads,\n removeCompanionFromWorkspace,\n openEntertainmentWorkspaceSession,\n setCompanionStatus,\n} from '../api/index.js'\n\nconst colors = {\n ink: '#f2eee7', muted: '#a69f96', line: 'rgba(242,238,231,.12)', panel: 'rgba(31,34,39,.72)', panelStrong: 'rgba(42,45,51,.9)', accent: '#d8a46c', green: '#9dc7a0', red: '#e59a91', blue: '#9fb8d8',\n}\nconst baseButton: React.CSSProperties = { border: `1px solid ${colors.line}`, background: 'transparent', color: colors.ink, borderRadius: 6, padding: '7px 11px', cursor: 'pointer', fontSize: 12 }\nconst primaryButton: React.CSSProperties = { ...baseButton, background: colors.accent, color: '#211b16', borderColor: colors.accent, fontWeight: 700 }\nconst field: React.CSSProperties = { width: '100%', boxSizing: 'border-box', border: `1px solid ${colors.line}`, background: 'rgba(0,0,0,.18)', color: colors.ink, borderRadius: 5, padding: '9px 10px', fontSize: 13 }\nconst card: React.CSSProperties = { background: colors.panel, border: `1px solid ${colors.line}`, borderRadius: 8, padding: 16 }\n\nfunction StatusPill({ children, tone = colors.muted }: { children: string; tone?: string }): ReactElement { return <span style={{ color: tone, fontSize: 11, border: `1px solid ${tone}66`, borderRadius: 999, padding: '3px 7px' }}>{children}</span> }\nfunction Empty({ children }: { children: string }): ReactElement { return <div style={{ color: colors.muted, fontSize: 13, padding: '25px 0', textAlign: 'center' }}>{children}</div> }\n\nexport function CompanionHome({ onOpenProfile }: { onOpenProfile: (id: string) => void }): ReactElement {\n const [profiles, setProfiles] = useState<readonly CompanionProfileView[]>([])\n const [error, setError] = useState<string | null>(null)\n useEffect(() => { listCompanionProfiles().then(all => setProfiles(all.filter(profile => profile.status !== 'retired'))).catch(e => setError(e instanceof Error ? e.message : String(e))) }, [])\n return <div>\n <div style={{ marginBottom: 22 }}><div style={{ color: colors.accent, fontSize: 12, letterSpacing: 1.5, textTransform: 'uppercase' }}>Long-term companions</div><h2 style={{ margin: '6px 0', fontSize: 25 }}>我的长期伙伴</h2><p style={{ color: colors.muted, margin: 0, fontSize: 13 }}>角色卡是起点。这里保存那些经过共同经历、记忆和确认后,可以继续回来的角色。</p></div>\n {error && <div style={{ color: colors.red, marginBottom: 12 }}>{error}</div>}\n {profiles.length === 0 ? <Empty>还没有长期伙伴。先在“角色与聊天”中选择一张角色卡升格。</Empty> : <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(260px, 1fr))', gap: 12 }}>{profiles.map(profile => <div key={profile.id} style={card}>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'start', gap: 8 }}><div><div style={{ fontSize: 19, fontWeight: 700 }}>{profile.displayName || profile.identitySummary || '未命名伙伴'}</div><div style={{ color: colors.muted, fontSize: 12, marginTop: 4 }}>角色卡 {profile.characterRevision ? `v${profile.characterRevision}` : ''}</div></div><StatusPill tone={profile.status === 'active' ? colors.green : colors.muted}>{profile.status === 'active' ? '活跃' : profile.status}</StatusPill></div>\n <p style={{ color: colors.muted, fontSize: 13, lineHeight: 1.55, minHeight: 42 }}>{profile.personalitySummary || '性格还在形成中,完成几次聊天后可以进行确认。'}</p>\n <div style={{ display: 'flex', gap: 7, flexWrap: 'wrap' }}><button type=\"button\" style={primaryButton} onClick={() => onOpenProfile(profile.id)}>打开伙伴档案</button></div>\n </div>)}</div>}\n </div>\n}\n\nexport function CompanionProfileView({ profileId, onBack, onContinue }: { profileId: string; onBack: () => void; onContinue: (sessionId: string) => void }): ReactElement {\n const [detail, setDetail] = useState<CompanionDetailView | null>(null)\n const [relationships, setRelationships] = useState<readonly { fromNodeId: string; toNodeId: string; type: string; value: number }[]>([])\n const [allProfiles, setAllProfiles] = useState<readonly CompanionProfileView[]>([])\n const [error, setError] = useState<string | null>(null)\n const [showSkillForm, setShowSkillForm] = useState(false)\n const [skillName, setSkillName] = useState('')\n const [skillDescription, setSkillDescription] = useState('')\n const [skillInstructions, setSkillInstructions] = useState('')\n const [renaming, setRenaming] = useState(false)\n const [nameDraft, setNameDraft] = useState('')\n const [runtimeBindings, setRuntimeBindings] = useState<readonly { id: string; runtimeType: 'dsh-child' | 'langgraph-thread' | 'generation'; runtimeId: string; purpose: 'companion' | 'group-delivery' | 'chat-generation'; status: 'requested' | 'active' | 'suspended' | 'released' | 'orphaned' | 'reclaimed'; createdAt: string }[]>([])\n const [conversationNotice, setConversationNotice] = useState<string | null>(null)\n const refresh = useCallback(() => { void Promise.all([getCompanionDetail(profileId), listCompanionRelationships(profileId)]).then(([next, rels]) => { setDetail(next); setRelationships(rels); setError(null) }).catch(e => setError(e instanceof Error ? e.message : String(e))) }, [profileId])\n useEffect(refresh, [refresh])\n useEffect(() => { void Promise.all([listCompanionProfiles(), listCompanionRuntimeBindings()]).then(([profiles, bindings]) => { setAllProfiles(profiles); setRuntimeBindings(bindings.filter(binding => binding.companionProfileId === profileId) as typeof runtimeBindings) }).catch(() => {}) }, [profileId])\n if (error) return <div style={{ color: colors.red }}>{error}</div>\n if (!detail) return <Empty>正在读取伙伴档案…</Empty>\n const profile = detail.profile\n const summonName = profile.displayName || profile.identitySummary || profile.id\n const chatWithAgent = async () => { try { const bound = await bindCompanionAgentSession(profileId); setConversationNotice(bound.restored ? '已恢复伙伴 Agent 会话。' : '已创建伙伴 Agent 会话。'); onContinue(bound.sessionId) } catch (caught) { setError(caught instanceof Error ? caught.message : String(caught)) } }\n const retire = async () => { if (!window.confirm(`解散“${summonName}”?这不会删除聊天记录、记忆或审计历史,之后可以从新的聊天文件重新升格。`)) return; try { await setCompanionStatus(profileId, 'retired'); setConversationNotice('伙伴已解散。原聊天与记忆仍然保留。'); refresh() } catch (caught) { setError(caught instanceof Error ? caught.message : String(caught)) } }\n return <div>\n <button type=\"button\" style={{ ...baseButton, marginBottom: 18 }} onClick={onBack}>← 返回伙伴列表</button>\n <div style={{ ...card, background: 'linear-gradient(135deg, rgba(122,91,64,.38), rgba(31,34,39,.85))', marginBottom: 12 }}><div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'start' }}><div><div style={{ color: colors.accent, fontSize: 12, letterSpacing: 1 }}>COMPANION PROFILE</div>{renaming ? <div style={{display:'flex',gap:7,margin:'7px 0'}}><input autoFocus style={{...field,maxWidth:280}} value={nameDraft} onChange={e=>setNameDraft(e.target.value)} onKeyDown={e=>{if(e.key==='Enter'&&nameDraft.trim())void renameCompanion(profileId,nameDraft).then(()=>{setRenaming(false);refresh()}).catch(error=>setError(error instanceof Error?error.message:String(error)))}} /><button type=\"button\" style={primaryButton} disabled={!nameDraft.trim()} onClick={event=>{event.preventDefault();event.stopPropagation();void renameCompanion(profileId,nameDraft).then(()=>{setRenaming(false);refresh()}).catch(error=>setError(error instanceof Error?error.message:String(error)))}}>保存</button><button type=\"button\" style={baseButton} onClick={()=>setRenaming(false)}>取消</button></div> : <div style={{display:'flex',alignItems:'center',gap:8}}><h2 style={{ margin: '7px 0 3px', fontSize: 28 }}>{profile.displayName || profile.identitySummary || '长期伙伴'}</h2><button type=\"button\" style={{...baseButton,padding:'4px 7px'}} title=\"修改伙伴名称\" onClick={()=>{setNameDraft(summonName);setRenaming(true)}}>改名</button></div>}<div style={{ color: colors.muted, fontSize: 13 }}>{profile.status === 'active' ? '可以在 DSH 会话中以角色身份陪你聊天,也可以加入娱乐空间。' : '当前不会创建新的运行实例。'}</div></div><StatusPill tone={profile.status === 'active' ? colors.green : colors.muted}>{profile.status}</StatusPill></div>{profile.status === 'active' && <div style={{ marginTop: 15, display:'grid', gap:8 }}><button type=\"button\" style={primaryButton} onClick={event=>{event.preventDefault();event.stopPropagation();void chatWithAgent()}}>和升格的 Agent 聊天</button>{conversationNotice&&<div style={{color:colors.green,fontSize:12}}>{conversationNotice}</div>}<div style={{ color: colors.muted, fontSize: 12 }}>或在任意个人 Agent 会话中输入<div style={{ ...field, marginTop: 6, color: colors.ink, userSelect: 'all' }}>/companion-summon "{summonName.replaceAll('\"', '\\\"')}" 请陪我聊聊天</div></div></div>}</div>\n <div style={{ ...card, marginBottom: 12, display: 'flex', justifyContent: 'space-between', alignItems: 'center', gap: 12 }}><div style={{ color: colors.muted, fontSize: 12 }}>解散只结束伙伴身份,不会删除原聊天、记忆或关系历史。</div><button type=\"button\" style={{ ...baseButton, color: colors.red }} onClick={event=>{event.preventDefault();event.stopPropagation();void retire()}}>{profile.status === 'retired' ? '伙伴已解散' : '解散伙伴'}</button></div>\n\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(250px, 1fr))', gap: 12 }}>\n <section style={card}><h3 style={{ marginTop: 0 }}>她的性格</h3><p style={{ color: colors.muted, lineHeight: 1.55 }}>{profile.personalitySummary || '尚未确认长期性格。'}</p>{(profile.personalityTraits ?? []).map(t => <div key={t.id} style={{ borderTop: `1px solid ${colors.line}`, padding: '9px 0', fontSize: 13 }}><b>{t.name}</b><span style={{ float: 'right', color: colors.accent }}>{Math.round(t.strength * 100)}%</span><div style={{ color: colors.muted, marginTop: 4 }}>{t.description}</div></div>)}</section>\n <section style={card}><h3 style={{ marginTop: 0 }}>身份与背景</h3><p style={{ color: colors.muted, lineHeight: 1.55 }}>{profile.identitySummary || '升格时没有总结到身份与背景;可以重新升格,或在伙伴档案中补充。'}</p></section>\n <section style={card}><h3 style={{ marginTop: 0 }}>你们的关系</h3><p style={{ color: colors.muted, lineHeight: 1.55 }}>{profile.userRelationshipSummary || '升格时没有总结到你们的关系;可以重新升格,或在伙伴档案中补充。'}</p></section>\n <section style={card}><h3 style={{ marginTop: 0 }}>共同经历</h3><div style={{ fontSize: 28, color: colors.accent }}>{detail.memories.filter(m => m.category === 'shared-experience').length}</div><div style={{ color: colors.muted, fontSize: 12 }}>条共同经历事件</div>{detail.memories.filter(m => m.category === 'shared-experience').length === 0 ? <Empty>还没有共同经历事件。升格时会从聊天中归纳,之后也可以用 /companion-remember 继续沉淀。</Empty> : detail.memories.filter(m => m.category === 'shared-experience').map(m => <div key={m.id} style={{ borderTop: `1px solid ${colors.line}`, padding: '9px 0', fontSize: 13 }}>{m.fact}</div>)}</section>\n <section style={card}><h3 style={{ marginTop: 0 }}>她认识谁</h3>{relationships.length === 0 ? <Empty>尚未认识其他伙伴</Empty> : relationships.map((r, i) => <div key={i} style={{ borderTop: `1px solid ${colors.line}`, padding: '9px 0', fontSize: 13 }}><b>{r.type}</b><span style={{ float: 'right', color: colors.accent }}>{r.value}</span><div style={{ color: colors.muted, marginTop: 4 }}>{allProfiles.find(p=>`companion:${p.id}`===r.fromNodeId)?.displayName || allProfiles.find(p=>`companion:${p.id}`===r.fromNodeId)?.identitySummary || '当前伙伴'} → {allProfiles.find(p=>`companion:${p.id}`===r.toNodeId)?.displayName || allProfiles.find(p=>`companion:${p.id}`===r.toNodeId)?.identitySummary || '另一位伙伴'}</div></div>)}</section>\n <section style={card}><h3 style={{ marginTop: 0 }}>运行状态</h3><p style={{ color: colors.muted, fontSize: 12, lineHeight: 1.5 }}>伙伴聊天和召唤都会使用当前 DSH 会话的模型;Tavern 不保存模型或 API Key。</p><div style={{borderTop:`1px solid ${colors.line}`,marginTop:12,paddingTop:10}}>{runtimeBindings.length===0?<div style={{color:colors.muted,fontSize:12}}>暂无运行中的伙伴。她会以角色身份回应,不会把内部运行过程带入聊天。</div>:<div style={{display:'grid',gap:5}}>{runtimeBindings.slice(0,4).map(binding=><div key={binding.id} style={{fontSize:12,display:'flex',justifyContent:'space-between',gap:8}}><span style={{color:binding.runtimeType==='dsh-child'?colors.blue:colors.muted}}>{binding.runtimeType==='dsh-child'?'DSH 子代理':binding.purpose}</span><StatusPill tone={binding.status==='active'?colors.green:binding.status==='orphaned'?colors.red:colors.muted}>{binding.status}</StatusPill></div>)}</div>}</div></section>\n </div>\n <section style={{ ...card, marginTop: 12 }}><div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}><div><h3 style={{ margin: 0 }}>她的 Skills</h3><div style={{ color: colors.muted, fontSize: 12, marginTop: 4 }}>Skill 决定她如何工作。</div></div><button type=\"button\" style={baseButton} onClick={() => setShowSkillForm(x => !x)}>+ 新建 Skill</button></div>\n {showSkillForm && <div style={{ marginTop: 14, padding: 14, background: 'rgba(0,0,0,.16)', borderRadius: 6, display: 'grid', gap: 8 }}><input style={field} placeholder=\"Skill 名称,例如:项目架构顾问\" value={skillName} onChange={e => setSkillName(e.target.value)} /><input style={field} placeholder=\"一句话说明\" value={skillDescription} onChange={e => setSkillDescription(e.target.value)} /><textarea style={{ ...field, minHeight: 80 }} placeholder=\"工作步骤和行为边界\" value={skillInstructions} onChange={e => setSkillInstructions(e.target.value)} /><div><button type=\"button\" style={primaryButton} disabled={!skillName || !skillInstructions} onClick={() => void createCompanionSkill(profileId, { name: skillName, description: skillDescription, instructions: skillInstructions, workflowId: 'analysis' }).then(() => { setShowSkillForm(false); setSkillName(''); setSkillDescription(''); setSkillInstructions(''); refresh() }).catch(e => setError(e instanceof Error ? e.message : String(e)))}>保存 Skill</button></div></div>}\n {detail.skills.length === 0 ? <Empty>还没有 Skill。为她添加一种更擅长帮助你的工作方式。</Empty> : detail.skills.map(skill => <div key={skill.id} style={{ borderTop: `1px solid ${colors.line}`, padding: '11px 0', display: 'flex', justifyContent: 'space-between', gap: 12 }}><div><b>{skill.name}</b><span style={{ color: colors.muted, fontSize: 11, marginLeft: 8 }}>v{skill.version}</span><div style={{ color: colors.muted, fontSize: 12, marginTop: 4 }}>{skill.description}</div></div><button type=\"button\" style={baseButton} onClick={() => void setCompanionSkillStatus(skill.id, skill.status === 'disabled').then(refresh)}>{skill.status === 'active' ? '停用' : '启用'}</button></div>)}\n </section>\n </div>\n}\n\nexport function EntertainmentSpace({ onBack, onOpenSession }: { onBack: () => void; onOpenSession?: (sessionId: string) => void }): ReactElement {\n const [workspaces, setWorkspaces] = useState<readonly WorkspaceView[]>([])\n const [profiles, setProfiles] = useState<readonly CompanionProfileView[]>([])\n const [workspaceId, setWorkspaceId] = useState('')\n const [selectedIds, setSelectedIds] = useState<ReadonlySet<string>>(new Set())\n const [persistedMemberIds, setPersistedMemberIds] = useState<ReadonlySet<string>>(new Set())\n const [mentionIds, setMentionIds] = useState<ReadonlySet<string>>(new Set())\n const [scenes, setScenes] = useState<readonly { id: string; title?: string; status: 'active' | 'archived' }[]>([])\n const [threads, setThreads] = useState<readonly { id: string; workspaceId: string; sceneId: string; status: 'active' | 'closed' }[]>([])\n const [newWorkspaceName, setNewWorkspaceName] = useState('')\n const [threadId, setThreadId] = useState('')\n const [sceneId, setSceneId] = useState('')\n const [messages, setMessages] = useState<readonly GroupMessageView[]>([])\n const [input, setInput] = useState('')\n const [pendingBatchId, setPendingBatchId] = useState('')\n const [batchStatus, setBatchStatus] = useState<GroupBatchState | null>(null)\n const [deliveries, setDeliveries] = useState<readonly GroupDeliveryView[]>([])\n const [error, setError] = useState<string | null>(null)\n const [busy, setBusy] = useState(false)\n const [workspaceNotice, setWorkspaceNotice] = useState<string | null>(null)\n const loadSpaces = useCallback(async () => { setWorkspaceNotice(null); try { const [ws, ps] = await Promise.all([listCompanionWorkspaces(), listCompanionProfiles()]); setWorkspaces(ws); setProfiles(ps); if (ws.length === 1 && workspaceId === '') setWorkspaceId(ws[0]!.id) } catch (e) { setWorkspaceNotice(e instanceof Error ? e.message : String(e)) } }, [workspaceId])\n useEffect(() => { void loadSpaces() }, [loadSpaces])\n useEffect(() => { if (!workspaceId) { setScenes([]); setThreads([]); setSelectedIds(new Set()); return } Promise.all([getCompanionWorkspaceDetail(workspaceId), listGroupThreads(workspaceId)]).then(([detail, history]) => { setScenes(detail.scenes); setThreads(history); setSelectedIds(new Set(detail.members.map(member => member.entityId))); setPersistedMemberIds(new Set(detail.members.map(member => member.entityId))); setSceneId(detail.scenes.find(scene => scene.status === 'active')?.id ?? '') }).catch(e => setError(e instanceof Error ? e.message : String(e))) }, [workspaceId])\n const selectedProfiles = useMemo(() => profiles.filter(profile => selectedIds.has(profile.id)), [profiles, selectedIds])\n const toggle = (setter: typeof setSelectedIds, id: string) => setter(current => { const next = new Set(current); if (next.has(id)) next.delete(id); else next.add(id); return next })\n const createSpace = async () => { if (!newWorkspaceName.trim()) return; setBusy(true); try { const created = await createCompanionWorkspace(newWorkspaceName.trim()); setWorkspaces(current => [...current, created]); setWorkspaceId(created.id); setNewWorkspaceName('') } catch (e) { setError(e instanceof Error ? e.message : String(e)) } finally { setBusy(false) } }\n const start = async () => { if (!workspaceId || !sceneId || !selectedProfiles.length) return; setBusy(true); try { for (const profile of profiles) { if (selectedIds.has(profile.id)) await addCompanionToWorkspace(workspaceId, profile.id, sceneId); else if (persistedMemberIds.has(profile.id)) await removeCompanionFromWorkspace(workspaceId, profile.id) } const opened = await openEntertainmentWorkspaceSession(workspaceId); setError('群聊会话已创建,正在打开 DSH 原生会话。'); onOpenSession?.(opened.sessionId) } catch (e) { setError(e instanceof Error ? e.message : String(e)) } finally { setBusy(false) } }\n const resume = async (_id: string, _scene: string) => { if (!workspaceId) return; setBusy(true); try { const opened = await openEntertainmentWorkspaceSession(workspaceId); setError('正在打开新的 DSH 原生聚会会话。'); onOpenSession?.(opened.sessionId) } catch (e) { setError(e instanceof Error ? e.message : String(e)) } finally { setBusy(false) } }\n const send = async () => { if (!threadId || !input.trim()) return; setBusy(true); try { const posted = await postGroupMessage(threadId, input, [...mentionIds]); setMessages(current => [...current, posted.message]); setPendingBatchId(posted.batch.id); setBatchStatus('queued'); setDeliveries(posted.deliveries); setInput(''); setMentionIds(new Set()); setError(null) } catch (e) { setError(e instanceof Error ? e.message : String(e)) } finally { setBusy(false) } }\n const refreshBatch = useCallback(async () => { if (!pendingBatchId || !threadId) return; const [nextMessages, status] = await Promise.all([listGroupMessages(threadId), getGroupBatchStatus(pendingBatchId)]); setMessages(nextMessages); setBatchStatus(status.batch.status); setDeliveries(status.deliveries); setError(null) }, [pendingBatchId, threadId])\n useEffect(() => { if (!pendingBatchId || !threadId || (batchStatus && ['completed', 'partial', 'failed'].includes(batchStatus))) return; const poll = () => { if (!document.hidden) void refreshBatch().catch(e => setError(e instanceof Error ? e.message : String(e))) }; const timer=window.setInterval(poll, 3000); poll(); return () => window.clearInterval(timer) }, [pendingBatchId, threadId, batchStatus, refreshBatch])\n return <div>\n <button type=\"button\" style={{ ...baseButton, marginBottom: 18 }} onClick={threadId ? () => { setThreadId(''); setMessages([]); setPendingBatchId('') } : onBack}>← {threadId ? '返回空间' : '返回工作台'}</button>\n <div style={{ marginBottom: 20 }}><div style={{ color: colors.accent, fontSize: 12 }}>ENTERTAINMENT SPACE</div><h2 style={{ margin: '6px 0' }}>娱乐空间</h2><p style={{ color: colors.muted, margin: 0, fontSize: 13 }}>让长期伙伴在同一个场景里相遇,或继续之前的聚会。</p></div>\n {!threadId ? <div style={{ ...card, maxWidth: 760, display: 'grid', gap: 12 }}>\n <div style={{display:'flex',justifyContent:'space-between',alignItems:'center',gap:8}}><label style={{ flex: 1, fontSize: 12, color: colors.muted }}>选择已有工作区<select style={{ ...field, marginTop: 5 }} value={workspaceId} onChange={e => setWorkspaceId(e.target.value)}><option value=\"\">请选择工作区</option>{workspaces.map(workspace => <option key={workspace.id} value={workspace.id}>{workspace.name}{workspace.status === 'active' ? '' : '(' + workspace.status + ')'}</option>)}</select></label><button type=\"button\" style={{...baseButton,marginTop:18}} disabled={busy} onClick={event=>{event.preventDefault();event.stopPropagation();void loadSpaces()}}>刷新</button></div>{workspaceNotice && <div style={{color:colors.red,fontSize:12}}>读取工作区失败:{workspaceNotice}</div>}{workspaces.length === 0 && !workspaceNotice && <div style={{ color: colors.muted, fontSize: 12 }}>没有读取到工作区。可在下方创建一个新工作区;如果已有工作区未出现,请点击刷新。</div>}\n <div style={{display:'flex',gap:7}}><input style={field} placeholder=\"新建工作区名称\" value={newWorkspaceName} onChange={e=>setNewWorkspaceName(e.target.value)} /><button type=\"button\" style={baseButton} disabled={busy||!newWorkspaceName.trim()} onClick={()=>void createSpace()}>创建工作区</button></div>\n {workspaceId && <><label style={{ fontSize: 12, color: colors.muted }}>场景<select style={{ ...field, marginTop: 5 }} value={sceneId} onChange={e=>setSceneId(e.target.value)}>{scenes.filter(scene=>scene.status==='active').map(scene=><option key={scene.id} value={scene.id}>{scene.title || '未命名场景'}</option>)}</select></label><div><div style={{color:colors.muted,fontSize:12,marginBottom:7}}>空间成员</div><div style={{display:'grid',gridTemplateColumns:'repeat(auto-fit,minmax(180px,1fr))',gap:6}}>{profiles.filter(p=>p.status==='active').length===0?<div style={{color:colors.muted,fontSize:12}}>还没有可加入的活跃伙伴。请先从角色与聊天中升格伙伴。</div>:profiles.filter(p=>p.status==='active').map(p=><label key={p.id} style={{display:'flex',gap:7,alignItems:'center',padding:7,border:'1px solid '+(selectedIds.has(p.id)?colors.accent:colors.line),borderRadius:6}}><input type=\"checkbox\" checked={selectedIds.has(p.id)} onChange={()=>toggle(setSelectedIds,p.id)} />{p.displayName || p.identitySummary || p.id}</label>)}</div></div><button type=\"button\" style={primaryButton} disabled={!sceneId||!selectedProfiles.length||busy} onClick={()=>void start()}>开始新聚会</button>{threads.length>0&&<div><div style={{color:colors.muted,fontSize:12,marginBottom:7}}>之前的聚会</div>{threads.map(thread=><button type=\"button\" key={thread.id} style={{...baseButton,width:'100%',textAlign:'left',marginBottom:6}} onClick={()=>void resume(thread.id,thread.sceneId)}>继续 {scenes.find(scene=>scene.id===thread.sceneId)?.title || '聚会'}<span style={{float:'right',color:colors.muted}}>{thread.status}</span></button>)}</div>}</>}\n </div> : <div style={{ ...card, maxWidth: 840 }}>\n <div style={{display:'flex',justifyContent:'space-between',gap:12,color:colors.muted,fontSize:12,marginBottom:12}}><span>{scenes.find(scene=>scene.id===sceneId)?.title || '娱乐空间'}</span><span>{selectedProfiles.map(p=>p.displayName||p.identitySummary||p.id).join(' · ')}</span></div>\n <div style={{minHeight:260,maxHeight:430,overflow:'auto'}}>{messages.length===0?<Empty>聚会刚刚开始,等待你的第一句话。</Empty>:messages.map(message=><div key={message.id} style={{padding:'11px 0',borderTop:`1px solid ${colors.line}`}}><div style={{color:message.senderKind==='user'?colors.accent:colors.blue,fontSize:12,marginBottom:4}}>{message.senderKind==='user'?'你':message.senderName??profiles.find(profile=>profile.id===message.senderId)?.displayName??message.senderId}</div><div style={{whiteSpace:'pre-wrap',lineHeight:1.55}}>{message.content}</div></div>)}</div>\n {pendingBatchId&&<div style={{padding:10,borderRadius:6,background:'rgba(216,164,108,.1)',fontSize:12,marginTop:10}}><div style={{display:'flex',justifyContent:'space-between',gap:8,alignItems:'center'}}><b>{batchStatus==='completed'?'本轮已完成':batchStatus==='partial'?'本轮部分完成':batchStatus==='failed'?'本轮执行失败':batchStatus==='running'?'伙伴正在回应':'本轮等待执行'}</b>{batchStatus&&<StatusPill tone={batchStatus==='completed'?colors.green:batchStatus==='failed'?colors.red:colors.accent}>{batchStatus}</StatusPill>}</div><div style={{display:'grid',gap:5,marginTop:8}}>{deliveries.map(delivery=><div key={delivery.id} style={{color:delivery.status==='failed'?colors.red:delivery.status==='completed'?colors.green:colors.blue}}>{delivery.companionName || profiles.find(profile=>profile.id===delivery.companionProfileId)?.displayName || profiles.find(profile=>profile.id===delivery.companionProfileId)?.identitySummary || '未命名伙伴'} · {delivery.status}{delivery.error&&<div style={{color:colors.red,marginTop:2,overflowWrap:'anywhere'}}>{delivery.error}</div>}</div>)}</div>{batchStatus!=='completed'&&<><div style={{marginTop:8}}>{batchStatus==='partial'||batchStatus==='failed'?'在当前 DSH 会话再次运行以重试失败项:':'请在当前 DSH 会话运行:'}</div><div style={{...field,marginTop:6,color:colors.ink,userSelect:'all',overflowWrap:'anywhere'}}>/space-run {pendingBatchId}</div></>}<button type=\"button\" style={{...baseButton,marginTop:8}} onClick={()=>void refreshBatch().catch(e=>setError(e instanceof Error?e.message:String(e)))}>刷新状态</button></div>}\n <div style={{display:'flex',gap:6,flexWrap:'wrap',marginTop:12}}>{selectedProfiles.map(profile=><button type=\"button\" key={profile.id} style={{...baseButton,borderColor:mentionIds.has(profile.id)?colors.accent:colors.line}} onClick={()=>toggle(setMentionIds,profile.id)}>@{profile.displayName||profile.identitySummary||profile.id}</button>)}</div>\n <div style={{display:'flex',gap:8,marginTop:8}}><input style={field} value={input} placeholder={mentionIds.size?'只投递给点名伙伴':'未点名时自动选择至多两位伙伴'} onChange={e=>setInput(e.target.value)} onKeyDown={e=>{if(e.key==='Enter')void send()}} /><button type=\"button\" style={primaryButton} disabled={busy||!input.trim()} onClick={()=>void send()}>{busy?'处理中…':'发送'}</button></div>\n </div>}\n {error&&<div style={{color:colors.red,marginTop:12}}>{error}</div>}\n </div>\n}\n","import { useMemo, useState } from 'react'\nimport type { CSSProperties, ReactElement } from 'react'\nimport { listChatMessages, previewCompanionPromotion } from '../api/index.js'\nimport type { CharacterChoice, ChatConversationView, PromoteCompanionInput, PromotionCandidateView } from '../api/index.js'\n\nconst ink='#f2eee7', muted='#a69f96', line='rgba(242,238,231,.14)', accent='#d8a46c'\nconst panel: CSSProperties={background:'rgba(31,34,39,.9)',border:`1px solid ${line}`,borderRadius:10,padding:18}\nconst button: CSSProperties={border:`1px solid ${line}`,background:'transparent',color:ink,borderRadius:7,padding:'8px 12px',cursor:'pointer',fontSize:13}\nconst primary: CSSProperties={...button,background:accent,borderColor:accent,color:'#211b16',fontWeight:700}\nconst field: CSSProperties={width:'100%',boxSizing:'border-box',padding:'9px 10px',borderRadius:6,border:`1px solid ${line}`,background:'rgba(0,0,0,.2)',color:ink}\n\nfunction CandidateEvidence({ candidate, selectedMemories, selectedPersonality, selectedHistory, onToggleMemory, onTogglePersonality, onToggleHistory, onShowEvidence }: { candidate: PromotionCandidateView; selectedMemories: ReadonlySet<number>; selectedPersonality: ReadonlySet<number>; selectedHistory: ReadonlySet<number>; onToggleMemory: (index: number) => void; onTogglePersonality: (index: number) => void; onToggleHistory: (index: number) => void; onShowEvidence: (ids: readonly string[]) => void }): ReactElement {\n return <div style={{display:'grid',gap:9,marginBottom:14,fontSize:12}}>\n <div><b>共同经历事件({candidate.sharedHistory.events.length})</b>{candidate.sharedHistory.events.length === 0 ? <div style={{color:muted}}>模型没有从这次聊天中归纳出共同经历事件。</div> : candidate.sharedHistory.events.map((event,index)=><div key={index} style={{padding:'7px 0',borderTop:`1px solid ${line}`}}><input type=\"checkbox\" checked={selectedHistory.has(index)} onChange={()=>onToggleHistory(index)} /> {event.content}<span style={{color:muted}}> · 证据 {event.evidenceMessageIds.length} 条</span> <button type=\"button\" style={{...button,padding:'2px 6px',fontSize:11}} onClick={()=>onShowEvidence(event.evidenceMessageIds)}>查看原文</button></div>)}</div>\n <div><b>建议保留的记忆({candidate.memories.length})</b>{candidate.memories.map((memory,index)=><div key={index} style={{padding:'7px 0',borderTop:`1px solid ${line}`}}><input type=\"checkbox\" checked={selectedMemories.has(index)} onChange={()=>onToggleMemory(index)} /> {memory.content}<span style={{color:muted}}> · {memory.category} · 证据 {memory.evidenceMessageIds.length} 条</span> <button type=\"button\" style={{...button,padding:'2px 6px',fontSize:11}} onClick={()=>onShowEvidence(memory.evidenceMessageIds)}>查看原文</button></div>)}</div>\n <div><b>归纳出的性格({candidate.personality.length})</b>{candidate.personality.map((trait,index)=><div key={index} style={{padding:'7px 0',borderTop:`1px solid ${line}`}}><input type=\"checkbox\" checked={selectedPersonality.has(index)} onChange={()=>onTogglePersonality(index)} /> {trait.name}:{trait.description}<span style={{color:muted}}> · 置信度 {Math.round(trait.confidence*100)}% · 证据 {trait.evidenceMessageIds.length} 条</span> <button type=\"button\" style={{...button,padding:'2px 6px',fontSize:11}} onClick={()=>onShowEvidence(trait.evidenceMessageIds)}>查看原文</button></div>)}</div>\n </div>\n}\n\nexport function PromotionWizard({ character, conversations, busy, onCancel, onConfirm }: { character: CharacterChoice; conversations: readonly ChatConversationView[]; busy: boolean; onCancel: () => void; onConfirm: (input: PromoteCompanionInput) => void }): ReactElement {\n const files=useMemo(()=>conversations.filter(item=>item.characterId===character.id&&item.status==='active'),[character.id,conversations])\n const [step,setStep]=useState(0), [conversationId,setConversationId]=useState(files[0]?.id??'')\n const [candidate,setCandidate]=useState<PromotionCandidateView | null>(null), [generating,setGenerating]=useState(false), [error,setError]=useState<string | null>(null)\n const [selectedMemories,setSelectedMemories]=useState<ReadonlySet<number>>(new Set()), [selectedPersonality,setSelectedPersonality]=useState<ReadonlySet<number>>(new Set()), [selectedHistory,setSelectedHistory]=useState<ReadonlySet<number>>(new Set())\n const [evidence,setEvidence]=useState<readonly {id:string;role:'user'|'assistant'|'system';content:string}[]>([]), [evidenceBusy,setEvidenceBusy]=useState(false)\n const [name,setName]=useState(character.name), [identity,setIdentity]=useState(`源自角色卡「${character.name}」的长期伙伴。`)\n const [relationship,setRelationship]=useState(''), [history,setHistory]=useState(''), [goals,setGoals]=useState(''), [boundaries,setBoundaries]=useState('不假装记得未确认的事情;涉及外部操作时先征得同意。')\n const selected=files.find(file=>file.id===conversationId)\n const generate=async()=>{if(!conversationId)return;setGenerating(true);setError(null);try{const value=await previewCompanionPromotion(character.id,conversationId);setCandidate(value);setSelectedMemories(new Set(value.memories.map((item,index)=>item.recommendation==='keep'?index:-1).filter(index=>index>=0)));setSelectedPersonality(new Set(value.personality.map((item,index)=>item.recommendation==='keep'?index:-1).filter(index=>index>=0)));setSelectedHistory(new Set(value.sharedHistory.events.map((_,index)=>index)));setName(value.identity.suggestedDisplayName);setIdentity(value.identity.identitySummary);setRelationship(value.relationship.summary);setHistory(value.sharedHistory.summary || value.sharedHistory.events.map(event => event.content).join(';'));setGoals(value.goals.join('\\n'));setBoundaries(value.boundaries.join('\\n')||boundaries);setStep(1)}catch(caught){setError(caught instanceof Error?caught.message:String(caught))}finally{setGenerating(false)}}\n const showEvidence=async(ids:readonly string[])=>{setEvidenceBusy(true);try{const messages=await listChatMessages(conversationId);setEvidence(messages.filter(message=>ids.includes(message.id)))}catch(caught){setError(caught instanceof Error?caught.message:String(caught))}finally{setEvidenceBusy(false)}}\n const toggle=(current:ReadonlySet<number>,index:number,setter:(value:ReadonlySet<number>)=>void)=>{const next=new Set(current);if(next.has(index))next.delete(index);else next.add(index);setter(next)}\n const toggleHistory=(index:number)=>toggle(selectedHistory,index,setSelectedHistory)\n const confirm=()=>onConfirm({characterId:character.id,displayName:name.trim(),identitySummary:identity,userRelationshipSummary:relationship,sharedHistorySummary:history,...(candidate===null?{}:{communicationPreferences:[...candidate.roleplay.speakingStyle,...candidate.roleplay.preferredPatterns.map(item=>`偏好:${item}`),...candidate.roleplay.avoidPatterns.map(item=>`避免:${item}`)].join(';')}),goals:goals.split('\\n').map(x=>x.trim()).filter(Boolean),boundaries:boundaries.split('\\n').map(x=>x.trim()).filter(Boolean),sourceConversationId:conversationId,confirmedMemories:(candidate?.memories??[]).filter((_,index)=>selectedMemories.has(index)).map(item=>({content:item.content,category:item.category,confidence:item.confidence,evidenceMessageIds:item.evidenceMessageIds})),confirmedSharedHistory:(candidate?.sharedHistory.events??[]).filter((_,index)=>selectedHistory.has(index)).map(item=>({content:item.content,evidenceMessageIds:item.evidenceMessageIds})),confirmedPersonality:(candidate?.personality??[]).filter((_,index)=>selectedPersonality.has(index)).map(item=>({name:item.name,description:item.description,strength:item.strength,confidence:item.confidence,evidenceMessageIds:item.evidenceMessageIds}))})\n return <div style={{maxWidth:760}}><button type=\"button\" style={{...button,marginBottom:15}} onClick={onCancel}>← 返回角色</button>\n <div style={{marginBottom:16}}><div style={{color:accent,fontSize:12,letterSpacing:1.3}}>PROMOTE A COMPANION</div><h2 style={{margin:'5px 0'}}>让 {character.name} 成为长期伙伴</h2><p style={{color:muted,margin:0,lineHeight:1.55}}>角色卡提供基础设定;模型只会根据你选择的聊天文件归纳候选。确认前,任何结论都不会写入长期档案。</p></div>\n <div style={{display:'flex',gap:10,marginBottom:14,color:muted,fontSize:12}}><span style={{color:step===0?accent:ink}}>1. 聊天依据</span><span style={{color:step===1?accent:step>1?ink:muted}}>2. 候选档案</span><span style={{color:step===2?accent:muted}}>3. 确认升格</span></div>\n {error&&<div style={{color:'#e59a91',marginBottom:10}}>{error}</div>}\n <section style={panel}>{step===0&&<><h3 style={{marginTop:0}}>选择一份聊天历史</h3><p style={{color:muted,fontSize:13,lineHeight:1.55}}>生成时使用当前 DSH 已配置的模型和凭据,不会要求填写 API Key。每条候选都会附带来源消息。</p>{files.length===0?<div style={{color:'#e59a91'}}>还没有可用于升格的聊天文件。</div>:<div style={{display:'grid',gap:8}}>{files.map(file=><label key={file.id} style={{border:`1px solid ${conversationId===file.id?accent:line}`,borderRadius:7,padding:11,cursor:'pointer'}}><input type=\"radio\" checked={conversationId===file.id} onChange={()=>setConversationId(file.id)} /> <b>{file.title??`聊天 · ${new Date(file.createdAt).toLocaleDateString()}`}</b><span style={{color:muted,fontSize:12}}> · 最后更新 {new Date(file.updatedAt).toLocaleString()}</span></label>)}</div>}</>}\n {step===1&&<><h3 style={{marginTop:0}}>审阅模型生成的候选档案</h3><div style={{padding:'9px 11px',borderRadius:6,background:'rgba(216,164,108,.1)',color:'#e9c79e',fontSize:12,marginBottom:13}}>聊天依据:{selected?.title??'未选择'} · 模型:{candidate?.source.provider} / {candidate?.source.model}。请检查候选内容;最终仍以你编辑后的值为准。</div>{candidate&&<CandidateEvidence candidate={candidate} selectedMemories={selectedMemories} selectedPersonality={selectedPersonality} selectedHistory={selectedHistory} onToggleMemory={index=>toggle(selectedMemories,index,setSelectedMemories)} onTogglePersonality={index=>toggle(selectedPersonality,index,setSelectedPersonality)} onToggleHistory={toggleHistory} onShowEvidence={ids=>void showEvidence(ids)}/>}{(evidenceBusy||evidence.length>0)&&<div style={{marginBottom:12,padding:11,borderRadius:7,background:'rgba(255,255,255,.04)'}}><div style={{display:'flex',justifyContent:'space-between',fontSize:12,marginBottom:7}}><b>来源消息</b><button type=\"button\" style={{...button,padding:'2px 6px'}} onClick={()=>setEvidence([])}>关闭</button></div>{evidenceBusy?'正在读取原文…':evidence.map(message=><div key={message.id} style={{borderTop:`1px solid ${line}`,padding:'7px 0',fontSize:12,whiteSpace:'pre-wrap'}}><b>{message.role==='user'?'你':message.role==='assistant'?'角色':'系统'}:</b>{message.content}</div>)}</div>}<label>伙伴名称<input style={{...field,marginTop:5}} value={name} onChange={e=>setName(e.target.value)} /></label><label style={{display:'block',marginTop:10}}>身份简介<textarea style={{...field,marginTop:5,minHeight:60}} value={identity} onChange={e=>setIdentity(e.target.value)} /></label><label style={{display:'block',marginTop:10}}>你们的关系<textarea style={{...field,marginTop:5,minHeight:58}} value={relationship} onChange={e=>setRelationship(e.target.value)} /></label><label style={{display:'block',marginTop:10}}>共同经历摘要<textarea style={{...field,marginTop:5,minHeight:58}} value={history} onChange={e=>setHistory(e.target.value)} /></label></>}\n {step===2&&<><h3 style={{marginTop:0}}>确认边界与初始策略</h3><p style={{color:muted,fontSize:13}}>伙伴将跟随当前 DSH 会话模型;长期身份、记忆与行为边界由档案保存。</p><div style={{padding:'10px 12px',borderRadius:7,background:'rgba(255,255,255,.05)',fontSize:12,marginBottom:12}}><div style={{marginBottom:6}}><b>身份简介:</b>{identity}</div><div style={{marginBottom:6}}><b>你们的关系:</b>{relationship || '(未填写)'}</div><div style={{marginBottom:6}}><b>共同经历摘要:</b>{history || '(未填写)'}</div><div style={{marginBottom:6}}><b>共同经历事件:</b>{candidate?.sharedHistory.events.filter((_,index)=>selectedHistory.has(index)).map(item=>item.content).join(';') || '(未选择)'}</div><div style={{marginBottom:6}}><b>已确认性格:</b>{candidate?.personality.filter((_,index)=>selectedPersonality.has(index)).map(item=>`${item.name}:${item.description}`).join(';') || '(未选择)'}</div><div><b>将写入记忆:</b>{candidate?.memories.filter((_,index)=>selectedMemories.has(index)).length ?? 0} 条</div></div><label>长期目标<textarea style={{...field,marginTop:5,minHeight:58}} value={goals} onChange={e=>setGoals(e.target.value)} /></label><label style={{display:'block',marginTop:10}}>边界<textarea style={{...field,marginTop:5,minHeight:58}} value={boundaries} onChange={e=>setBoundaries(e.target.value)} /></label></>}\n <div style={{display:'flex',justifyContent:'space-between',marginTop:18}}><button type=\"button\" style={button} disabled={step===0||busy||generating} onClick={()=>setStep(value=>value-1)}>上一步</button>{step===0?<button type=\"button\" style={primary} disabled={!conversationId||generating} onClick={()=>void generate()}>{generating?'正在总结聊天历史…':'生成候选档案'}</button>:step===1?<button type=\"button\" style={primary} disabled={!name.trim()} onClick={()=>setStep(2)}>确认这些内容</button>:<button type=\"button\" style={primary} disabled={busy||!name.trim()} onClick={confirm}>{busy?'正在升格…':'确认成为长期伙伴'}</button>}</div>\n </section></div>\n}\n","/** Tavern 设置页:角色卡与聊天文件管理;聊天体验保持 DSH 原生。 */\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport type { CSSProperties, ReactElement } from 'react'\nimport type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { CandidateConflictView, CandidateEvidenceMessage, CandidateView, CharacterChoice, ChatConversationView, PromoteCompanionInput } from '../api/index.js'\nimport {\n bindChatConversation,\n exportChatFile,\n getChatGreetings,\n importCharacterCard,\n importChatFile,\n listCharacters,\n listChatConversations,\n openChatConversation,\n trashCharacter,\n listTrashedCharacters,\n restoreCharacter,\n renameChatConversation,\n trashChatConversation,\n extractMemoryCandidates,\n getMemoryCandidateEvidence,\n listMemoryCandidates,\n markMemoryCandidateSensitive,\n reviewMemoryCandidate,\n supersedeMemoryCandidate,\n CandidateConflictError,\n listCompanionProfiles,\n promoteCompanion,\n getCompanionDetail,\n setCompanionSkillStatus,\n listCompanionRelationships,\n reviewPersonalityCandidate,\n} from '../api/index.js'\nimport { CompanionHome, CompanionProfileView, EntertainmentSpace } from './CompanionWorkspace.js'\nimport { PromotionWizard } from './PromotionWizard.js'\n\n\ntype DashboardProps = PropsRuntime<'settings.section'>\nexport interface DashboardActions { openSession: (sessionId: string) => void; createSession: (sessionId: string) => void }\nconst button = (active = false): CSSProperties => ({ padding: '4px 10px', borderRadius: 7, cursor: 'pointer', fontSize: 12, border: '1px solid rgba(255,255,255,.16)', background: active ? 'rgba(120,160,255,.25)' : 'transparent', color: 'inherit' })\nconst row: CSSProperties = { padding: '7px 0', borderBottom: '1px solid rgba(255,255,255,.08)' }\n\nfunction CandidateReviewPanel(): ReactElement {\n const [items, setItems] = useState<readonly CandidateView[]>([])\n const [evidence, setEvidence] = useState<Readonly<Record<string, readonly CandidateEvidenceMessage[]>>>({})\n const [expandedEvidence, setExpandedEvidence] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [busy, setBusy] = useState<string | null>(null)\n const [conflict, setConflict] = useState<{ candidateId: string; content: string; conflicts: readonly CandidateConflictView[] } | null>(null)\n const refresh = useCallback(() => {\n setError(null)\n void Promise.all([listMemoryCandidates('pending'), listMemoryCandidates('evidence-invalid')])\n .then(([pending, invalid]) => setItems([...pending, ...invalid]))\n .catch(caught => setError(caught instanceof Error ? caught.message : String(caught)))\n }, [])\n useEffect(refresh, [refresh])\n const toggleEvidence = useCallback(async (candidateId: string) => {\n if (expandedEvidence === candidateId) { setExpandedEvidence(null); return }\n setExpandedEvidence(candidateId)\n if (evidence[candidateId] !== undefined) return\n setBusy(candidateId)\n try {\n const messages = await getMemoryCandidateEvidence(candidateId)\n setEvidence(current => ({ ...current, [candidateId]: messages }))\n } catch (caught) { setError(caught instanceof Error ? caught.message : String(caught)) }\n finally { setBusy(null) }\n }, [evidence, expandedEvidence])\n const review = useCallback(async (candidate: CandidateView, accepted: boolean, supersedeMemoryId?: string) => {\n let content: string | undefined\n if (accepted) { const edited = window.prompt('确认或修改这条长期记忆:', candidate.proposedContent); if (edited === null) return; content = edited }\n if (accepted && candidate.sensitivity === 'high' && !window.confirm('此候选标记为高敏感信息。确认写入长期记忆吗?')) return\n setBusy(candidate.id)\n try {\n await reviewMemoryCandidate(candidate.id, accepted, content, supersedeMemoryId)\n setConflict(null)\n refresh()\n } catch (caught) {\n if (caught instanceof CandidateConflictError) {\n setConflict({ candidateId: candidate.id, content: content ?? candidate.proposedContent, conflicts: caught.conflicts })\n } else {\n setError(caught instanceof Error ? caught.message : String(caught))\n }\n } finally { setBusy(null) }\n }, [refresh])\n const markSensitive = useCallback(async (candidate: CandidateView) => {\n setBusy(candidate.id)\n try {\n await markMemoryCandidateSensitive(candidate.id, candidate.sensitivity === 'high' ? 'low' : 'high')\n refresh()\n } catch (caught) { setError(caught instanceof Error ? caught.message : String(caught)) }\n finally { setBusy(null) }\n }, [refresh])\n const supersede = useCallback(async (candidate: CandidateView) => {\n const newContent = window.prompt('输入更正后的记忆内容:', candidate.proposedContent)\n if (newContent === null || newContent.trim() === '') return\n setBusy(candidate.id)\n try { await supersedeMemoryCandidate(candidate.id, newContent); refresh() }\n catch (caught) { setError(caught instanceof Error ? caught.message : String(caught)) }\n finally { setBusy(null) }\n }, [refresh])\n return <div style={{ marginTop: 18, borderTop: '1px solid rgba(255,255,255,.1)', paddingTop: 10 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 7 }}><strong style={{ fontSize: 13 }}>🧠 待审阅记忆</strong><button type=\"button\" style={button()} disabled={busy !== null} onClick={refresh}>刷新候选</button></div><div style={{ opacity: .6, fontSize: 11, margin: '4px 0 7px' }}>模型只能提出候选;接受后才写入长期记忆。候选附带聊天消息证据并由 Host 校验归属。</div>\n {error !== null && <div style={{ color: '#ff8a8a', fontSize: 12 }}>{error}</div>}\n {items.map(candidate => {\n const messages = evidence[candidate.id]\n const isExpanded = expandedEvidence === candidate.id\n return <div key={candidate.id} style={{ ...row, padding: '8px 0' }}><div><strong style={{ fontSize: 12 }}>{candidate.proposedContent}</strong><span style={{ opacity: .55, fontSize: 11, marginLeft: 7 }}>{candidate.kind} · 置信 {Math.round(candidate.confidence * 100)}% · {candidate.sensitivity} · {candidate.status}</span></div>{candidate.status === 'evidence-invalid' && <div style={{ color: '#ffca75', fontSize: 11, marginTop: 3 }}>⚠ 来源消息已编辑、删除或不在当前聊天分支,不能再接受。可查看原文后重新提取。</div>}{candidate.rationale !== undefined && <div style={{ opacity: .6, fontSize: 11, margin: '3px 0' }}>原因:{candidate.rationale}</div>}<button type=\"button\" style={{ ...button(), marginTop: 4 }} disabled={busy !== null} onClick={() => void toggleEvidence(candidate.id)}>{isExpanded ? '收起证据' : `查看消息证据(${candidate.sourceMessageIds.length})`}</button>{isExpanded && <div style={{ marginTop: 6, padding: '6px 8px', borderRadius: 6, background: 'rgba(255,255,255,.04)' }}>{messages === undefined ? <div style={{ opacity: .55, fontSize: 11 }}>正在加载证据原文…</div> : messages.map(message => <div key={message.id} style={{ marginBottom: 6, whiteSpace: 'pre-wrap', overflowWrap: 'anywhere', fontSize: 12 }}><strong style={{ opacity: .7 }}>{message.role === 'user' ? '用户' : message.role === 'assistant' ? '角色' : '系统'}:</strong>{message.content}</div>)}</div>}{candidate.status === 'pending' && <div style={{ display: 'flex', gap: 5, marginTop: 5 }}><button type=\"button\" style={button()} disabled={busy !== null} onClick={() => void review(candidate, true)}>接受 / 修改</button><button type=\"button\" style={{ ...button(), color: '#ffadad' }} disabled={busy !== null} onClick={() => void review(candidate, false)}>拒绝</button><button type=\"button\" style={button()} disabled={busy !== null} onClick={() => void markSensitive(candidate)}>{candidate.sensitivity === 'high' ? '取消高敏感' : '标记高敏感'}</button><button type=\"button\" style={button()} disabled={busy !== null} onClick={() => void supersede(candidate)}>更正</button></div>}{conflict?.candidateId === candidate.id && <div style={{ marginTop: 6, padding: '6px 8px', borderRadius: 6, background: 'rgba(255,180,120,.08)' }}><div style={{ color: '#ffca75', fontSize: 12, marginBottom: 4 }}>检测到与已有记忆冲突,请选择要替换的旧记忆:</div>{conflict.conflicts.map(memory => <div key={memory.id} style={{ display: 'flex', gap: 6, alignItems: 'center', marginBottom: 4 }}><span style={{ flex: 1, fontSize: 12, opacity: .8 }}>{memory.fact}</span><button type=\"button\" style={button()} disabled={busy !== null} onClick={() => void review(candidate, true, memory.id)}>替换并接受</button></div>)}</div>}</div>\n })}\n {items.length === 0 && <div style={{ opacity: .55, fontSize: 12 }}>没有待审阅候选。每次正常聊天完成后会尝试后台提取;也可在聊天文件菜单中手动重跑。</div>}\n </div>\n}\n\nfunction CompanionProfilePanel({ profileId, onClose }: { profileId: string; onClose: () => void }): ReactElement {\n const [detail, setDetail] = useState<import('../api.js').CompanionDetailView | null>(null)\n const [relationships, setRelationships] = useState<readonly { fromNodeId: string; toNodeId: string; type: string; value: number }[]>([])\n const [error, setError] = useState<string | null>(null)\n const refresh = useCallback(() => { void Promise.all([getCompanionDetail(profileId), listCompanionRelationships(profileId)]).then(([d, r]) => { setDetail(d); setRelationships(r); setError(null) }).catch(e => setError(e instanceof Error ? e.message : String(e))) }, [profileId])\n useEffect(refresh, [refresh])\n if (error) return <div><button type=\"button\" style={button()} onClick={onClose}>← 返回角色</button><div style={{ color: '#ff8a8a', marginTop: 8 }}>{error}</div></div>\n if (!detail) return <div>正在加载伙伴档案…</div>\n const p = detail.profile\n return <div><div style={{ display:'flex', gap:7, alignItems:'center' }}><button type=\"button\" style={button()} onClick={onClose}>← 返回角色</button><strong>伙伴档案 · {p.status}</strong></div>\n <section style={{ ...row, marginTop:10 }}><strong>她是谁 / 性格</strong><div style={{ marginTop:4 }}>{p.personalitySummary ?? '待用户确认:尚未确认长期性格。'}</div>{(p.personalityTraits ?? []).map(t => <div key={t.id} style={{ fontSize:12, opacity:.8, marginTop:4 }}>{t.name} · 强度 {Math.round(t.strength*100)}% · 置信 {Math.round(t.confidence*100)}% · {t.source}<br />{t.description}</div>)}</section>\n <section style={row}><strong>待确认性格</strong>{detail.personalityCandidates.filter(candidate => candidate.status === 'pending').length === 0 ? <div style={{opacity:.6}}>没有待确认的性格候选</div> : detail.personalityCandidates.filter(candidate => candidate.status === 'pending').map(candidate => <div key={candidate.id} style={{marginTop:5}}><b>{candidate.traitName}</b> · 置信 {Math.round(candidate.confidence * 100)}%<div style={{fontSize:12,opacity:.7}}>{candidate.description}</div><button type=\"button\" style={button()} onClick={() => void reviewPersonalityCandidate(candidate.id, true).then(refresh)}>确认</button><button type=\"button\" style={{...button(),color:'#ffadad'}} onClick={() => void reviewPersonalityCandidate(candidate.id, false).then(refresh)}>拒绝</button></div>)}</section>\n <section style={row}><strong>已沉淀记忆</strong>{detail.memories.length === 0 ? <div style={{ opacity:.6 }}>暂无已确认记忆</div> : detail.memories.map(m => <div key={m.id} style={{ fontSize:12, marginTop:4 }}>{m.fact} <span style={{opacity:.5}}>· {m.category}</span></div>)}</section>\n <section style={row}><strong>Skills</strong>{detail.skills.length === 0 ? <div style={{opacity:.6}}>暂无 Skill</div> : detail.skills.map(s => <div key={s.id} style={{marginTop:5}}><b>{s.name}</b> · v{s.version} · {s.status}<div style={{fontSize:12,opacity:.7}}>{s.description}</div><button type=\"button\" style={button()} onClick={() => void setCompanionSkillStatus(s.id,s.status==='disabled').then(refresh)}> {s.status==='active'?'禁用':'启用'} </button></div>)}</section>\n\n\n <section style={row}><strong>工作区</strong>{detail.workspaces.length === 0 ? <div style={{opacity:.6}}>尚未加入工作区</div> : detail.workspaces.map(w => <div key={w.workspace.id}>{w.workspace.name} · Scene:{w.sceneIds.join(', ') || '无'}</div>)}</section>\n <section style={row}><strong>她认识谁</strong>{relationships.length === 0 ? <div style={{opacity:.6}}>尚未认识任何伙伴</div> : relationships.map((r,i) => <div key={i}>{r.fromNodeId} → {r.toNodeId} · {r.type} {r.value}</div>)}</section>\n </div>\n}\n\nfunction ChatTab(props: DashboardActions & { refreshToken: number }): ReactElement {\n const [characters, setCharacters] = useState<readonly CharacterChoice[]>([])\n const [conversations, setConversations] = useState<readonly ChatConversationView[]>([])\n const [expanded, setExpanded] = useState<string | null>(null)\n const [greetingsFor, setGreetingsFor] = useState<string | null>(null)\n const [greetings, setGreetings] = useState<readonly string[]>([])\n const [error, setError] = useState<string | null>(null)\n const [busy, setBusy] = useState(false)\n const [trashed, setTrashed] = useState<readonly CharacterChoice[]>([])\n const [profileId, setProfileId] = useState<string | null>(null)\n const [promotionCharacter, setPromotionCharacter] = useState<CharacterChoice | null>(null)\n const [companions, setCompanions] = useState<readonly { id: string; characterId: string; status: string; personalitySummary?: string }[]>([])\n const cardInput = useRef<HTMLInputElement>(null)\n const chatInput = useRef<HTMLInputElement>(null)\n const importCharacterId = useRef<string | null>(null)\n\n const refresh = useCallback(() => {\n Promise.all([listCharacters(), listChatConversations(), listCompanionProfiles()]).then(([nextCharacters, nextConversations, nextCompanions]) => {\n setCharacters(nextCharacters); setConversations(nextConversations); setCompanions(nextCompanions); setError(null)\n }).catch(caught => setError(caught instanceof Error ? caught.message : String(caught)))\n }, [])\n useEffect(refresh, [refresh, props.refreshToken])\n useEffect(() => { listTrashedCharacters().then(setTrashed).catch(() => {}) }, [props.refreshToken, characters.length])\n\n const open = useCallback(async (conversationId: string) => {\n setBusy(true)\n try { const opened = await openChatConversation(conversationId); props.openSession(opened.sessionId); refresh() }\n catch (caught) { setError(caught instanceof Error ? caught.message : String(caught)) }\n finally { setBusy(false) }\n }, [props, refresh])\n const beginNew = useCallback(async (characterId: string, greetingIndex?: number) => {\n setBusy(true)\n try { const bound = await bindChatConversation(characterId, greetingIndex === undefined ? undefined : { greetingIndex }); setGreetingsFor(null); props.createSession(bound.sessionId); refresh() }\n catch (caught) { setError(caught instanceof Error ? caught.message : String(caught)) }\n finally { setBusy(false) }\n }, [props, refresh])\n const chooseNew = useCallback(async (characterId: string) => {\n try { setGreetingsFor(characterId); setGreetings(await getChatGreetings(characterId)) }\n catch (caught) { setError(caught instanceof Error ? caught.message : String(caught)) }\n }, [])\n const uploadCard = useCallback(async (file: File) => {\n setBusy(true)\n try { const result = await importCharacterCard(file); setError(`✅ ${result.deduplicated ? '角色卡已存在' : '已导入角色卡'}:${result.name}`); refresh() }\n catch (caught) { setError(caught instanceof Error ? caught.message : String(caught)) }\n finally { setBusy(false); if (cardInput.current) cardInput.current.value = '' }\n }, [refresh])\n const importFile = useCallback(async (file: File) => {\n const characterId = importCharacterId.current\n if (characterId === null) return\n setBusy(true)\n try { await importChatFile(characterId, await file.text(), file.name.replace(/\\.[^.]+$/, '')); refresh() }\n catch (caught) { setError(caught instanceof Error ? caught.message : String(caught)) }\n finally { setBusy(false); importCharacterId.current = null; if (chatInput.current) chatInput.current.value = '' }\n }, [refresh])\n const promote = useCallback(async (input: PromoteCompanionInput) => {\n setBusy(true)\n try { const profile = await promoteCompanion(input); setPromotionCharacter(null); setError(`✅ ${profile.displayName ?? input.displayName ?? '伙伴'} 已成为长期伙伴`); refresh() }\n catch (caught) { setError(caught instanceof Error ? caught.message : String(caught)) }\n finally { setBusy(false) }\n }, [refresh])\n const trash = useCallback(async (character: CharacterChoice) => {\n if (!window.confirm(`将“${character.name}”及其全部聊天文件移入 Tavern 回收站。聊天记录不会立即删除,可以随后恢复。确定继续吗?`)) return\n setBusy(true)\n try { await trashCharacter(character.id); setExpanded(null); refresh() }\n catch (caught) { setError(caught instanceof Error ? caught.message : String(caught)) }\n finally { setBusy(false) }\n }, [refresh])\n const restore = useCallback(async (characterId: string) => {\n setBusy(true)\n try { await restoreCharacter(characterId); await Promise.all([refresh(), listTrashedCharacters().then(setTrashed)] as const) }\n catch (caught) { setError(caught instanceof Error ? caught.message : String(caught)) }\n finally { setBusy(false) }\n }, [refresh])\n const rename = useCallback(async (file: ChatConversationView) => {\n const next = window.prompt('聊天文件名称(留空可恢复日期名称)', file.title ?? '')\n if (next === null) return\n setBusy(true)\n try { await renameChatConversation(file.id, next); refresh() }\n catch (caught) { setError(caught instanceof Error ? caught.message : String(caught)) }\n finally { setBusy(false) }\n }, [refresh])\n const extractCandidates = useCallback(async (conversationId: string) => {\n setBusy(true)\n try { await extractMemoryCandidates(conversationId); setError('✅ 已请求提取候选,稍后可在“待审阅记忆”查看') }\n catch (caught) { setError(caught instanceof Error ? caught.message : String(caught)) }\n finally { setBusy(false) }\n }, [])\n const trashFile = useCallback(async (file: ChatConversationView) => {\n if (!window.confirm(`将聊天文件“${file.title ?? '未命名聊天'}”移入 Tavern 回收站?消息历史会保留,可恢复。`)) return\n setBusy(true)\n try { await trashChatConversation(file.id); refresh() }\n catch (caught) { setError(caught instanceof Error ? caught.message : String(caught)) }\n finally { setBusy(false) }\n }, [refresh])\n const download = useCallback(async (conversationId: string, name: string) => {\n try {\n const blob = new Blob([await exportChatFile(conversationId)], { type: 'application/x-ndjson;charset=utf-8' })\n const url = URL.createObjectURL(blob); const anchor = document.createElement('a')\n anchor.href = url; anchor.download = `${name}-chat.jsonl`; anchor.click(); URL.revokeObjectURL(url)\n } catch (caught) { setError(caught instanceof Error ? caught.message : String(caught)) }\n }, [])\n\n if (promotionCharacter !== null) return <PromotionWizard character={promotionCharacter} conversations={conversations} busy={busy} onCancel={() => setPromotionCharacter(null)} onConfirm={input => void promote(input)} />\n if (profileId !== null) return <CompanionProfilePanel profileId={profileId} onClose={() => setProfileId(null)} />\n\n return <div>\n <p style={{ opacity: .7, marginTop: 0, fontSize: 12 }}>角色卡与聊天文件只在这里管理。打开聊天后,后续输入、归档和会话操作全部使用 DSH 原生界面。</p>\n <div style={{ marginBottom: 10 }}><button type=\"button\" style={button()} disabled={busy} onClick={() => cardInput.current?.click()}>📥 导入角色卡</button>\n <input ref={cardInput} type=\"file\" accept=\".json,.png,.charx\" style={{ display: 'none' }} onChange={event => { const file = event.target.files?.[0]; if (file) void uploadCard(file) }} /></div>\n {error && <div style={{ color: error.startsWith('✅') ? '#8fda9b' : '#ff8a8a', fontSize: 12, marginBottom: 8 }}>{error}</div>}\n {characters.map(character => {\n const files = conversations.filter(item => item.characterId === character.id && item.status === 'active')\n const isOpen = expanded === character.id\n return <div key={character.id} style={{ ...row, padding: '9px 0' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 7 }}>\n <button type=\"button\" style={{ ...button(isOpen), flex: 1, textAlign: 'left' }} onClick={() => setExpanded(isOpen ? null : character.id)}>🎭 {character.name}<span style={{ opacity: .55, marginLeft: 8 }}>{files.length} 个聊天文件</span></button>\n <button type=\"button\" style={button()} disabled={busy} onClick={() => void chooseNew(character.id)}>➕ 新建聊天</button>\n {companions.some(profile => profile.characterId === character.id && profile.status === 'active') ? <button type=\"button\" style={button()} onClick={() => setProfileId(companions.find(profile => profile.characterId === character.id && profile.status === 'active')!.id)}>伙伴档案</button> : <button type=\"button\" style={button()} disabled={busy} onClick={() => setPromotionCharacter(character)}>✨ 升格为长期伙伴</button>}\n <button type=\"button\" style={button()} disabled={busy} onClick={() => { importCharacterId.current = character.id; chatInput.current?.click() }}>📥 导入聊天</button>\n <button type=\"button\" style={{ ...button(), color: '#ffadad' }} disabled={busy} onClick={() => void trash(character)}>删除角色</button>\n </div>\n {greetingsFor === character.id && <div style={{ padding: '7px 0 2px 14px', display: 'flex', gap: 5, flexWrap: 'wrap' }}><span style={{ opacity: .65, fontSize: 11, alignSelf: 'center' }}>选择开场白:</span>{greetings.map((value, index) => <button key={index} type=\"button\" title={value} style={button()} onClick={() => void beginNew(character.id, index)}>{value.slice(0, 18)}{value.length > 18 ? '…' : ''}</button>)}<button type=\"button\" style={button()} onClick={() => void beginNew(character.id)}>不带开场白</button></div>}\n {isOpen && <div style={{ padding: '7px 0 0 14px' }}>{files.map(file => <div key={file.id} style={{ ...row, display: 'flex', alignItems: 'center', gap: 6 }}><div style={{ flex: 1 }}><strong style={{ fontSize: 13 }}>{file.title ?? `聊天 · ${new Date(file.createdAt).toLocaleDateString()}`}</strong><div style={{ opacity: .55, fontSize: 11 }}>{new Date(file.updatedAt).toLocaleString()}</div></div><button type=\"button\" style={button()} disabled={busy} onClick={() => void open(file.id)}>打开</button><button type=\"button\" style={button()} disabled={busy} onClick={() => void rename(file)}>改名</button><button type=\"button\" style={button()} onClick={() => void download(file.id, character.name)}>导出</button><button type=\"button\" style={button()} disabled={busy} onClick={() => void extractCandidates(file.id)}>提取记忆</button><button type=\"button\" style={{ ...button(), color: '#ffadad' }} disabled={busy} onClick={() => void trashFile(file)}>删除</button></div>)}{files.length === 0 && <div style={{ opacity: .55, fontSize: 12 }}>暂无聊天文件。新建或导入一份聊天开始。</div>}</div>}\n </div>\n })}\n {characters.length === 0 && <div style={{ opacity: .55, fontSize: 12 }}>暂无角色卡,请使用上方“导入角色卡”选择文件。</div>}\n {trashed.length > 0 && <div style={{ marginTop: 16, borderTop: '1px solid rgba(255,255,255,.1)', paddingTop: 9 }}><strong style={{ fontSize: 13 }}>🗑 Tavern 回收站</strong><div style={{ opacity: .6, fontSize: 11, margin: '4px 0' }}>恢复角色会同时恢复其聊天文件;不会自动重新打开原生会话。</div>{trashed.map(character => <div key={character.id} style={{ ...row, display: 'flex', alignItems: 'center', gap: 8 }}><span style={{ flex: 1, opacity: .75 }}>🎭 {character.name}</span><button type=\"button\" style={button()} disabled={busy} onClick={() => void restore(character.id)}>恢复</button></div>)}</div>}\n <CandidateReviewPanel />\n <input ref={chatInput} type=\"file\" accept=\".jsonl,.json,.txt\" style={{ display: 'none' }} onChange={event => { const file = event.target.files?.[0]; if (file) void importFile(file) }} />\n </div>\n}\n\nexport function TavernDashboard(props: DashboardProps & Partial<DashboardActions>): ReactElement {\n const actions: DashboardActions = {\n openSession: props.openSession ?? (() => {}),\n createSession: props.createSession ?? (() => {}),\n }\n const [view, setView] = useState<'chat' | 'companions' | 'spaces'>('chat')\n const [profileId, setProfileId] = useState<string | null>(null)\n const [refreshToken, setRefreshToken] = useState(0)\n const navigate = (next: typeof view) => { setProfileId(null); setView(next); setRefreshToken(value => value + 1) }\n const title = view === 'chat' ? '角色与聊天' : view === 'companions' ? '我的伙伴' : '娱乐空间'\n return <div style={{ color: '#f2eee7', maxWidth: 1020, padding: '8px 2px 28px' }}>\n <header style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'end', gap: 16, marginBottom: 16 }}>\n <div><div style={{ fontSize: 11, letterSpacing: 2, color: '#d8a46c', textTransform: 'uppercase' }}>DSH · TAVERN</div><h1 style={{ margin: '5px 0 0', fontSize: 26 }}>{title}</h1></div>\n <div style={{ color: 'rgba(242,238,231,.55)', fontSize: 12 }}>角色扮演 · 长期伙伴 · 子代理</div>\n </header>\n <nav style={{ display: 'flex', gap: 6, borderBottom: '1px solid rgba(242,238,231,.12)', paddingBottom: 10, marginBottom: 20, overflowX: 'auto' }}>\n {([['chat', '角色与聊天'], ['companions', '我的伙伴'], ['spaces', '娱乐空间']] as const).map(([id, label]) => <button key={id} type=\"button\" onClick={() => navigate(id)} style={{ border: '0', borderBottom: view === id ? '2px solid #d8a46c' : '2px solid transparent', background: 'transparent', color: view === id ? '#f2eee7' : 'rgba(242,238,231,.55)', padding: '8px 10px', cursor: 'pointer', whiteSpace: 'nowrap', fontSize: 13 }}>{label}</button>)}\n </nav>\n {view === 'chat' && <ChatTab {...actions} refreshToken={refreshToken} />}\n {view === 'companions' && (profileId === null ? <CompanionHome onOpenProfile={setProfileId} /> : <CompanionProfileView profileId={profileId} onBack={() => setProfileId(null)} onContinue={actions.openSession} />)}\n {view === 'spaces' && <EntertainmentSpace onBack={() => navigate('companions')} onOpenSession={actions.openSession} />}\n </div>\n}\n","/** DSH-Tavern client:设置页管理角色卡与聊天文件,DSH 原生界面负责聊天。 */\n\nimport type { Context } from '@deepseek-ai/cordis'\nimport type { SessionId } from '@deepseek-ai/dsh-client-runtime/client'\nimport type {} from '@deepseek-ai/dsh-client-runtime/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport { TavernDashboard } from './components/TavernDashboard.js'\n\nexport const inject = ['slots', 'sessions', 'workspaces']\n\n/** 等待 Host 创建的原生 session 出现在客户端列表后再打开。 */\nasync function openSessionWhenListed(ctx: Context, sessionId: string): Promise<void> {\n const id = sessionId as unknown as SessionId\n for (let attempt = 0; attempt < 50; attempt += 1) {\n if (ctx.sessions.list.getSnapshot().ids.includes(id)) {\n ctx.sessions.open(id)\n return\n }\n await new Promise(resolve => setTimeout(resolve, 100))\n }\n ctx.sessions.open(id)\n}\n\ntype SectionProps = PropsRuntime<'settings.section'>\n\nexport function apply(ctx: Context): void {\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'tavern-dashboard',\n order: 200,\n label: 'Tavern',\n }, (props: SectionProps) => (\n <TavernDashboard\n {...props}\n openSession={sessionId => { void openSessionWhenListed(ctx, sessionId) }}\n createSession={async sessionId => { await openSessionWhenListed(ctx, sessionId) }}\n />\n )))\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AuditService —— 审计追溯(阶段 5.4,诚信底座)。
|
|
3
|
+
*
|
|
4
|
+
* 职责:为每个非查询状态变更追加一条不可变审计日志(id 唯一,只追加不
|
|
5
|
+
* 修改),支持按 entityId 查历史时间线、按 sourceEventId 查全链路。
|
|
6
|
+
*
|
|
7
|
+
* 约束:
|
|
8
|
+
* - 所有非查询操作必须记录(创建/更新/更正/遗忘/归档);
|
|
9
|
+
* - before/after 只存关键字段快照(不序列化整个对象,避免膨胀);
|
|
10
|
+
* - source 必须明确:不能为空,不能是 unknown。
|
|
11
|
+
*/
|
|
12
|
+
import type { KvTable } from '@deepseek-ai/dsh-storage-domain';
|
|
13
|
+
import type { AuditLog, AuditLogAction, AuditLogEntityType, AuditLogSource } from '../domain/schemas.js';
|
|
14
|
+
export interface AuditLogParams {
|
|
15
|
+
readonly entityType: AuditLogEntityType;
|
|
16
|
+
readonly entityId: string;
|
|
17
|
+
readonly action: AuditLogAction;
|
|
18
|
+
/** 变更前的关键状态快照(可选)。 */
|
|
19
|
+
readonly before?: unknown;
|
|
20
|
+
/** 变更后的关键状态快照(可选)。 */
|
|
21
|
+
readonly after?: unknown;
|
|
22
|
+
readonly source: AuditLogSource;
|
|
23
|
+
readonly sourceEventId?: string;
|
|
24
|
+
readonly actorId?: string;
|
|
25
|
+
readonly sceneId?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare class AuditService {
|
|
28
|
+
#private;
|
|
29
|
+
constructor(logTable: KvTable<string, AuditLog>);
|
|
30
|
+
/** 追加一条审计日志(id 唯一,不可变;只追加不修改)。 */
|
|
31
|
+
log(params: AuditLogParams): Promise<void>;
|
|
32
|
+
/** 某个实体的全部审计记录(时间线,createdAt 升序)。 */
|
|
33
|
+
getHistory(entityId: string): Promise<AuditLog[]>;
|
|
34
|
+
/** 某个事件(delivery / tool call)关联的全链路审计记录。 */
|
|
35
|
+
getByEvent(sourceEventId: string): Promise<AuditLog[]>;
|
|
36
|
+
/**
|
|
37
|
+
* 全部审计记录(UI 数据面;可选 sceneId / entityId 过滤,createdAt 倒序)。
|
|
38
|
+
*/
|
|
39
|
+
list(sceneId?: string, entityId?: string): Promise<AuditLog[]>;
|
|
40
|
+
/** 全部审计记录数(测试/审计用)。 */
|
|
41
|
+
size(): number;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=audit-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-service.d.ts","sourceRoot":"","sources":["../../src/core/audit-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,KAAK,EACV,QAAQ,EACR,cAAc,EACd,kBAAkB,EAClB,cAAc,EACf,MAAM,sBAAsB,CAAA;AAE7B,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAA;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;IAC/B,sBAAsB;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,sBAAsB;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,qBAAa,YAAY;;gBAGX,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC;IAI/C,kCAAkC;IAC5B,GAAG,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBhD,qCAAqC;IAC/B,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IASvD,4CAA4C;IACtC,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAS5D;;OAEG;IACG,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAWpE,uBAAuB;IACvB,IAAI,IAAI,MAAM;CAGf"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AuditService —— 审计追溯(阶段 5.4,诚信底座)。
|
|
3
|
+
*
|
|
4
|
+
* 职责:为每个非查询状态变更追加一条不可变审计日志(id 唯一,只追加不
|
|
5
|
+
* 修改),支持按 entityId 查历史时间线、按 sourceEventId 查全链路。
|
|
6
|
+
*
|
|
7
|
+
* 约束:
|
|
8
|
+
* - 所有非查询操作必须记录(创建/更新/更正/遗忘/归档);
|
|
9
|
+
* - before/after 只存关键字段快照(不序列化整个对象,避免膨胀);
|
|
10
|
+
* - source 必须明确:不能为空,不能是 unknown。
|
|
11
|
+
*/
|
|
12
|
+
import { randomUUID } from 'node:crypto';
|
|
13
|
+
export class AuditService {
|
|
14
|
+
#logs;
|
|
15
|
+
constructor(logTable) {
|
|
16
|
+
this.#logs = logTable;
|
|
17
|
+
}
|
|
18
|
+
/** 追加一条审计日志(id 唯一,不可变;只追加不修改)。 */
|
|
19
|
+
async log(params) {
|
|
20
|
+
const entry = {
|
|
21
|
+
id: randomUUID(),
|
|
22
|
+
entityType: params.entityType,
|
|
23
|
+
entityId: params.entityId,
|
|
24
|
+
action: params.action,
|
|
25
|
+
...(params.before === undefined ? {} : { before: params.before }),
|
|
26
|
+
...(params.after === undefined ? {} : { after: params.after }),
|
|
27
|
+
source: params.source,
|
|
28
|
+
...(params.sourceEventId === undefined ? {} : { sourceEventId: params.sourceEventId }),
|
|
29
|
+
...(params.actorId === undefined ? {} : { actorId: params.actorId }),
|
|
30
|
+
...(params.sceneId === undefined ? {} : { sceneId: params.sceneId }),
|
|
31
|
+
createdAt: new Date().toISOString(),
|
|
32
|
+
};
|
|
33
|
+
await this.#logs.put(entry.id, entry);
|
|
34
|
+
}
|
|
35
|
+
/** 某个实体的全部审计记录(时间线,createdAt 升序)。 */
|
|
36
|
+
async getHistory(entityId) {
|
|
37
|
+
const result = [];
|
|
38
|
+
for (const [, log] of this.#logs.entries()) {
|
|
39
|
+
if (log.entityId === entityId)
|
|
40
|
+
result.push(log);
|
|
41
|
+
}
|
|
42
|
+
result.sort((a, b) => (a.createdAt < b.createdAt ? -1 : a.createdAt > b.createdAt ? 1 : 0));
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
/** 某个事件(delivery / tool call)关联的全链路审计记录。 */
|
|
46
|
+
async getByEvent(sourceEventId) {
|
|
47
|
+
const result = [];
|
|
48
|
+
for (const [, log] of this.#logs.entries()) {
|
|
49
|
+
if (log.sourceEventId === sourceEventId)
|
|
50
|
+
result.push(log);
|
|
51
|
+
}
|
|
52
|
+
result.sort((a, b) => (a.createdAt < b.createdAt ? -1 : a.createdAt > b.createdAt ? 1 : 0));
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 全部审计记录(UI 数据面;可选 sceneId / entityId 过滤,createdAt 倒序)。
|
|
57
|
+
*/
|
|
58
|
+
async list(sceneId, entityId) {
|
|
59
|
+
const result = [];
|
|
60
|
+
for (const [, log] of this.#logs.entries()) {
|
|
61
|
+
if (sceneId !== undefined && log.sceneId !== sceneId)
|
|
62
|
+
continue;
|
|
63
|
+
if (entityId !== undefined && log.entityId !== entityId)
|
|
64
|
+
continue;
|
|
65
|
+
result.push(log);
|
|
66
|
+
}
|
|
67
|
+
result.sort((a, b) => (a.createdAt > b.createdAt ? -1 : a.createdAt < b.createdAt ? 1 : 0));
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
/** 全部审计记录数(测试/审计用)。 */
|
|
71
|
+
size() {
|
|
72
|
+
return this.#logs.size;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=audit-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-service.js","sourceRoot":"","sources":["../../src/core/audit-service.ts"],"names":[],"mappings":"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"}
|