mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-05 07:27:15 +08:00
feat(events): expose typed payload snapshots
This commit is contained in:
+17
-3
@@ -13,8 +13,8 @@
|
||||
"runtime_to_db": [],
|
||||
"workflow_to_db": []
|
||||
},
|
||||
"edge_count": 6689,
|
||||
"edge_sha256": "764be9020b4657c344453dc801ba270c925a2b26c94c0fb43c5a9f89953a4e07",
|
||||
"edge_count": 6702,
|
||||
"edge_sha256": "a6d5e5b0ccca6f84fe5d8aa5acb0402e7253958913da8d9624a23bd80ceab748",
|
||||
"edges": [
|
||||
"app -> app.runtime",
|
||||
"app -> app.runtime.compat",
|
||||
@@ -5734,6 +5734,11 @@
|
||||
"app.runtime.event.registry -> app.runtime.log",
|
||||
"app.runtime.event.registry -> app.schemas",
|
||||
"app.runtime.event.registry -> app.schemas.types",
|
||||
"app.runtime.event.snapshot -> app.runtime",
|
||||
"app.runtime.event.snapshot -> app.runtime.event",
|
||||
"app.runtime.event.snapshot -> app.runtime.event.contracts",
|
||||
"app.runtime.event.snapshot -> app.schemas",
|
||||
"app.runtime.event.snapshot -> app.schemas.types",
|
||||
"app.runtime.events -> app.foundation",
|
||||
"app.runtime.events -> app.foundation.singleton",
|
||||
"app.runtime.events -> app.runtime",
|
||||
@@ -5745,6 +5750,7 @@
|
||||
"app.runtime.events -> app.runtime.event.dispatch",
|
||||
"app.runtime.events -> app.runtime.event.errors",
|
||||
"app.runtime.events -> app.runtime.event.registry",
|
||||
"app.runtime.events -> app.runtime.event.snapshot",
|
||||
"app.runtime.events -> app.runtime.log",
|
||||
"app.runtime.events -> app.runtime.observability",
|
||||
"app.runtime.events -> app.runtime.rate",
|
||||
@@ -5987,8 +5993,11 @@
|
||||
"app.schemas.dashboard -> app.schemas.common",
|
||||
"app.schemas.event -> app.schemas",
|
||||
"app.schemas.event -> app.schemas.common",
|
||||
"app.schemas.event -> app.schemas.context",
|
||||
"app.schemas.event -> app.schemas.file",
|
||||
"app.schemas.event -> app.schemas.media",
|
||||
"app.schemas.event -> app.schemas.music",
|
||||
"app.schemas.event -> app.schemas.subscribe",
|
||||
"app.schemas.event -> app.schemas.transfer",
|
||||
"app.schemas.event -> app.schemas.types",
|
||||
"app.schemas.file -> app.schemas",
|
||||
@@ -6093,7 +6102,11 @@
|
||||
"app.sdk.database -> app.application.backup",
|
||||
"app.sdk.database -> app.application.database",
|
||||
"app.sdk.events -> app.runtime",
|
||||
"app.sdk.events -> app.runtime.event",
|
||||
"app.sdk.events -> app.runtime.event.snapshot",
|
||||
"app.sdk.events -> app.runtime.events",
|
||||
"app.sdk.events -> app.schemas",
|
||||
"app.sdk.events -> app.schemas.event",
|
||||
"app.sdk.logging -> app.runtime",
|
||||
"app.sdk.logging -> app.runtime.log",
|
||||
"app.sdk.media -> app.domain",
|
||||
@@ -6706,7 +6719,7 @@
|
||||
"app.workflow.actions.transfer_file -> app.workflow",
|
||||
"app.workflow.actions.transfer_file -> app.workflow.actions"
|
||||
],
|
||||
"module_count": 823,
|
||||
"module_count": 824,
|
||||
"modules": [
|
||||
"app",
|
||||
"app.adapters",
|
||||
@@ -7382,6 +7395,7 @@
|
||||
"app.runtime.event.dispatch",
|
||||
"app.runtime.event.errors",
|
||||
"app.runtime.event.registry",
|
||||
"app.runtime.event.snapshot",
|
||||
"app.runtime.events",
|
||||
"app.runtime.execution",
|
||||
"app.runtime.extensions",
|
||||
|
||||
+366
-11
@@ -1163,539 +1163,804 @@
|
||||
"ChainEventType.AgentLLMProvider": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "stop_chain",
|
||||
"input_contract": "AgentLLMProviderEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "chain",
|
||||
"ordering": "priority_serial",
|
||||
"output_contract": null,
|
||||
"payload_contract": "AgentLLMProviderEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [
|
||||
"api_key"
|
||||
],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"ChainEventType.AuthIntercept": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "stop_chain",
|
||||
"input_contract": "AuthInterceptCredentials",
|
||||
"legacy_reason": null,
|
||||
"mode": "chain",
|
||||
"ordering": "priority_serial",
|
||||
"output_contract": null,
|
||||
"payload_contract": "AuthInterceptCredentials",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [
|
||||
"token"
|
||||
],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"ChainEventType.AuthVerification": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "stop_chain",
|
||||
"input_contract": "AuthCredentials",
|
||||
"legacy_reason": null,
|
||||
"mode": "chain",
|
||||
"ordering": "priority_serial",
|
||||
"output_contract": null,
|
||||
"payload_contract": "AuthCredentials",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [
|
||||
"password",
|
||||
"token",
|
||||
"mfa_code"
|
||||
],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"ChainEventType.CommandRegister": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "stop_chain",
|
||||
"input_contract": "CommandRegisterEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "chain",
|
||||
"ordering": "priority_serial",
|
||||
"output_contract": null,
|
||||
"payload_contract": "CommandRegisterEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"ChainEventType.DiscoverSource": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "stop_chain",
|
||||
"input_contract": "DiscoverSourceEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "chain",
|
||||
"ordering": "priority_serial",
|
||||
"output_contract": null,
|
||||
"payload_contract": "DiscoverSourceEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"ChainEventType.MediaRecognize": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "stop_chain",
|
||||
"input_contract": "MediaRecognizeEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "chain",
|
||||
"ordering": "priority_serial",
|
||||
"output_contract": null,
|
||||
"payload_contract": "MediaRecognizeEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"ChainEventType.MediaRecognizeConvert": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "stop_chain",
|
||||
"input_contract": "MediaRecognizeConvertEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "chain",
|
||||
"ordering": "priority_serial",
|
||||
"output_contract": null,
|
||||
"payload_contract": "MediaRecognizeConvertEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"ChainEventType.MusicMediaRecognize": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "stop_chain",
|
||||
"input_contract": "MusicMediaRecognizeEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "chain",
|
||||
"ordering": "priority_serial",
|
||||
"output_contract": null,
|
||||
"payload_contract": "MusicMediaRecognizeEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"ChainEventType.MusicNameRecognize": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "stop_chain",
|
||||
"input_contract": "MusicNameRecognizeEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "chain",
|
||||
"ordering": "priority_serial",
|
||||
"output_contract": null,
|
||||
"payload_contract": "MusicNameRecognizeEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"ChainEventType.NameRecognize": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "stop_chain",
|
||||
"input_contract": "NameRecognizeEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "chain",
|
||||
"ordering": "priority_serial",
|
||||
"output_contract": null,
|
||||
"payload_contract": "NameRecognizeEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"ChainEventType.PluginDataReset": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "stop_chain",
|
||||
"input_contract": "PluginDataResetEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "chain",
|
||||
"ordering": "priority_serial",
|
||||
"output_contract": null,
|
||||
"payload_contract": "PluginDataResetEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"ChainEventType.RecommendSource": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "stop_chain",
|
||||
"input_contract": "RecommendSourceEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "chain",
|
||||
"ordering": "priority_serial",
|
||||
"output_contract": null,
|
||||
"payload_contract": "RecommendSourceEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"ChainEventType.ResourceDownload": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "stop_chain",
|
||||
"input_contract": "ResourceDownloadInputContractData",
|
||||
"legacy_reason": null,
|
||||
"mode": "chain",
|
||||
"ordering": "priority_serial",
|
||||
"payload_contract": "ResourceDownloadEventData",
|
||||
"output_contract": "ResourceDownloadOutputContractData",
|
||||
"payload_contract": "ResourceDownloadContractData",
|
||||
"payload_mode": "snapshot",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"ChainEventType.ResourceSelection": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "stop_chain",
|
||||
"input_contract": "ResourceSelectionInputContractData",
|
||||
"legacy_reason": null,
|
||||
"mode": "chain",
|
||||
"ordering": "priority_serial",
|
||||
"payload_contract": "ResourceSelectionEventData",
|
||||
"output_contract": "ResourceSelectionOutputContractData",
|
||||
"payload_contract": "ResourceSelectionContractData",
|
||||
"payload_mode": "snapshot",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"ChainEventType.StorageOperSelection": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "stop_chain",
|
||||
"input_contract": "StorageOperSelectionEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "chain",
|
||||
"ordering": "priority_serial",
|
||||
"output_contract": null,
|
||||
"payload_contract": "StorageOperSelectionEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"ChainEventType.SubscribeCompletionCheck": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "stop_chain",
|
||||
"input_contract": "SubscribeCompletionCheckInputContractData",
|
||||
"legacy_reason": null,
|
||||
"mode": "chain",
|
||||
"ordering": "priority_serial",
|
||||
"payload_contract": "SubscribeCompletionCheckEventData",
|
||||
"output_contract": "SubscribeCompletionCheckOutputContractData",
|
||||
"payload_contract": "SubscribeCompletionCheckContractData",
|
||||
"payload_mode": "snapshot",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"ChainEventType.SubscribeEpisodesRefresh": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "stop_chain",
|
||||
"input_contract": "SubscribeEpisodesRefreshEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "chain",
|
||||
"ordering": "priority_serial",
|
||||
"output_contract": null,
|
||||
"payload_contract": "SubscribeEpisodesRefreshEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"ChainEventType.TransferIntercept": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "stop_chain",
|
||||
"input_contract": "TransferInterceptEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "chain",
|
||||
"ordering": "priority_serial",
|
||||
"output_contract": null,
|
||||
"payload_contract": "TransferInterceptEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"ChainEventType.TransferOverwriteCheck": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "stop_chain",
|
||||
"input_contract": "TransferOverwriteCheckEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "chain",
|
||||
"ordering": "priority_serial",
|
||||
"output_contract": null,
|
||||
"payload_contract": "TransferOverwriteCheckEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"ChainEventType.TransferRename": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "stop_chain",
|
||||
"input_contract": "TransferRenameEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "chain",
|
||||
"ordering": "priority_serial",
|
||||
"output_contract": null,
|
||||
"payload_contract": "TransferRenameEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"ChainEventType.TransferRenameBuild": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "stop_chain",
|
||||
"input_contract": "TransferRenameBuildEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "chain",
|
||||
"ordering": "priority_serial",
|
||||
"output_contract": null,
|
||||
"payload_contract": "TransferRenameBuildEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"ChainEventType.WorkflowExecution": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "stop_chain",
|
||||
"input_contract": "ActionContext",
|
||||
"legacy_reason": null,
|
||||
"mode": "chain",
|
||||
"ordering": "priority_serial",
|
||||
"output_contract": null,
|
||||
"payload_contract": "ActionContext",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.AgentTokensUsage": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "AgentTokensUsageEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"output_contract": null,
|
||||
"payload_contract": "AgentTokensUsageEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.AudioTransferComplete": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "TransferResultContractData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"payload_contract": "TransferResultEventData",
|
||||
"output_contract": null,
|
||||
"payload_contract": "TransferResultContractData",
|
||||
"payload_mode": "snapshot",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.AudioTransferFailed": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "TransferResultContractData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"payload_contract": "TransferResultEventData",
|
||||
"output_contract": null,
|
||||
"payload_contract": "TransferResultContractData",
|
||||
"payload_mode": "snapshot",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.CommandExcute": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "CommandExecuteEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"output_contract": null,
|
||||
"payload_contract": "CommandExecuteEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.ConfigChanged": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "ConfigChangeEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"output_contract": null,
|
||||
"payload_contract": "ConfigChangeEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "host_only"
|
||||
},
|
||||
"EventType.DownloadAdded": {
|
||||
"delivery": "durable_required",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "DownloadAddedContractData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"payload_contract": "DownloadAddedEventData",
|
||||
"output_contract": null,
|
||||
"payload_contract": "DownloadAddedContractData",
|
||||
"payload_mode": "snapshot",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.DownloadDeleted": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "DownloadDeletedEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"output_contract": null,
|
||||
"payload_contract": "DownloadDeletedEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.DownloadFileDeleted": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "DownloadFileDeletedEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"output_contract": null,
|
||||
"payload_contract": "DownloadFileDeletedEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.HistoryDeleted": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "HistoryDeletedEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"output_contract": null,
|
||||
"payload_contract": "HistoryDeletedEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.MessageAction": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "MessageActionEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"output_contract": null,
|
||||
"payload_contract": "MessageActionEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.MetadataScrape": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "MetadataScrapeContractData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"payload_contract": "MetadataScrapeEventData",
|
||||
"output_contract": null,
|
||||
"payload_contract": "MetadataScrapeContractData",
|
||||
"payload_mode": "snapshot",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.ModuleReload": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "EmptyEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"output_contract": null,
|
||||
"payload_contract": "EmptyEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "host_only"
|
||||
},
|
||||
"EventType.NoticeMessage": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "NoticeMessageEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"output_contract": null,
|
||||
"payload_contract": "NoticeMessageEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.PluginAction": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "PluginActionEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"output_contract": null,
|
||||
"payload_contract": "PluginActionEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "target_plugin"
|
||||
},
|
||||
"EventType.PluginReload": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "PluginReloadEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"output_contract": null,
|
||||
"payload_contract": "PluginReloadEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.PluginTriggered": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "PluginTriggeredEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"output_contract": null,
|
||||
"payload_contract": "PluginTriggeredEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "target_plugin"
|
||||
},
|
||||
"EventType.SiteDeleted": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "SiteEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"output_contract": null,
|
||||
"payload_contract": "SiteEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.SiteRefreshed": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "SiteEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"output_contract": null,
|
||||
"payload_contract": "SiteEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.SiteUpdated": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "SiteEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"output_contract": null,
|
||||
"payload_contract": "SiteEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.SubscribeAdded": {
|
||||
"delivery": "durable_required",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "SubscribeAddedEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"output_contract": null,
|
||||
"payload_contract": "SubscribeAddedEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.SubscribeComplete": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "SubscribeCompleteEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"output_contract": null,
|
||||
"payload_contract": "SubscribeCompleteEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.SubscribeDeleted": {
|
||||
"delivery": "durable_required",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "SubscribeDeletedEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"output_contract": null,
|
||||
"payload_contract": "SubscribeDeletedEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.SubscribeModified": {
|
||||
"delivery": "durable_required",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "SubscribeModifiedEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"output_contract": null,
|
||||
"payload_contract": "SubscribeModifiedEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.SubtitleTransferComplete": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "TransferResultContractData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"payload_contract": "TransferResultEventData",
|
||||
"output_contract": null,
|
||||
"payload_contract": "TransferResultContractData",
|
||||
"payload_mode": "snapshot",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.SubtitleTransferFailed": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "TransferResultContractData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"payload_contract": "TransferResultEventData",
|
||||
"output_contract": null,
|
||||
"payload_contract": "TransferResultContractData",
|
||||
"payload_mode": "snapshot",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.SystemError": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "SystemErrorEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"output_contract": null,
|
||||
"payload_contract": "SystemErrorEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "host_only"
|
||||
},
|
||||
"EventType.TransferComplete": {
|
||||
"delivery": "durable_required",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "TransferResultContractData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"payload_contract": "TransferResultEventData",
|
||||
"output_contract": null,
|
||||
"payload_contract": "TransferResultContractData",
|
||||
"payload_mode": "snapshot",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.TransferFailed": {
|
||||
"delivery": "durable_required",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "TransferResultContractData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"payload_contract": "TransferResultEventData",
|
||||
"output_contract": null,
|
||||
"payload_contract": "TransferResultContractData",
|
||||
"payload_mode": "snapshot",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.UserMessage": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "UserMessageEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"output_contract": null,
|
||||
"payload_contract": "UserMessageEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.WebhookMessage": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "WebhookEventInfo",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"output_contract": null,
|
||||
"payload_contract": "WebhookEventInfo",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
},
|
||||
"EventType.WorkflowExecute": {
|
||||
"delivery": "ephemeral",
|
||||
"error_behavior": "notify",
|
||||
"input_contract": "WorkflowExecuteEventData",
|
||||
"legacy_reason": null,
|
||||
"mode": "broadcast",
|
||||
"ordering": "priority_queue",
|
||||
"output_contract": null,
|
||||
"payload_contract": "WorkflowExecuteEventData",
|
||||
"payload_mode": "runtime",
|
||||
"schema_version": 1,
|
||||
"sensitive_fields": [],
|
||||
"validation_mode": "diagnostic",
|
||||
"visibility": "plugin_public"
|
||||
}
|
||||
},
|
||||
@@ -8239,6 +8504,16 @@
|
||||
}
|
||||
],
|
||||
"app.sdk.events": [
|
||||
{
|
||||
"kind": "import",
|
||||
"name": "ContextSnapshot",
|
||||
"target": "app.schemas.event.ContextSnapshot"
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"name": "DownloadAddedContractData",
|
||||
"target": "app.schemas.event.DownloadAddedContractData"
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"name": "Event",
|
||||
@@ -8249,10 +8524,90 @@
|
||||
"name": "EventManager",
|
||||
"target": "app.runtime.events.EventManager"
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"name": "EventPayloadSnapshot",
|
||||
"target": "app.runtime.event.snapshot.EventPayloadSnapshot"
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"name": "FileContextSnapshot",
|
||||
"target": "app.schemas.event.FileContextSnapshot"
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"name": "MediaSnapshot",
|
||||
"target": "app.schemas.event.MediaSnapshot"
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"name": "MetaSnapshot",
|
||||
"target": "app.schemas.event.MetaSnapshot"
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"name": "MetadataScrapeContractData",
|
||||
"target": "app.schemas.event.MetadataScrapeContractData"
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"name": "ResourceDownloadContractData",
|
||||
"target": "app.schemas.event.ResourceDownloadContractData"
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"name": "ResourceDownloadInputContractData",
|
||||
"target": "app.schemas.event.ResourceDownloadInputContractData"
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"name": "ResourceDownloadOutputContractData",
|
||||
"target": "app.schemas.event.ResourceDownloadOutputContractData"
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"name": "ResourceSelectionContractData",
|
||||
"target": "app.schemas.event.ResourceSelectionContractData"
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"name": "ResourceSelectionInputContractData",
|
||||
"target": "app.schemas.event.ResourceSelectionInputContractData"
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"name": "ResourceSelectionOutputContractData",
|
||||
"target": "app.schemas.event.ResourceSelectionOutputContractData"
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"name": "SubscribeCompletionCheckContractData",
|
||||
"target": "app.schemas.event.SubscribeCompletionCheckContractData"
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"name": "SubscribeCompletionCheckInputContractData",
|
||||
"target": "app.schemas.event.SubscribeCompletionCheckInputContractData"
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"name": "SubscribeCompletionCheckOutputContractData",
|
||||
"target": "app.schemas.event.SubscribeCompletionCheckOutputContractData"
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"name": "TransferResultContractData",
|
||||
"target": "app.schemas.event.TransferResultContractData"
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"name": "eventmanager",
|
||||
"target": "app.runtime.events.eventmanager"
|
||||
},
|
||||
{
|
||||
"kind": "import",
|
||||
"name": "snapshot_event_data",
|
||||
"target": "app.runtime.event.snapshot.snapshot_event_data"
|
||||
}
|
||||
],
|
||||
"app.sdk.logging": [
|
||||
|
||||
@@ -8,6 +8,8 @@ from app.application.outbox import (
|
||||
DURABLE_EVENT_TOPICS,
|
||||
validate_durable_event_handlers,
|
||||
)
|
||||
from app.domain.context import Context, MediaInfo
|
||||
from app.domain.metainfo import MetaInfo
|
||||
from app.runtime.event.contracts import (
|
||||
EVENT_CONTRACTS,
|
||||
EventDelivery,
|
||||
@@ -15,9 +17,13 @@ from app.runtime.event.contracts import (
|
||||
validate_event_payload,
|
||||
)
|
||||
from app.runtime.events import Event
|
||||
from app.domain.context import Context, MediaInfo
|
||||
from app.domain.metainfo import MetaInfo
|
||||
from app.schemas.event import ConfigChangeEventData
|
||||
from app.schemas.event import (
|
||||
ConfigChangeEventData,
|
||||
ResourceDownloadInputContractData,
|
||||
ResourceDownloadOutputContractData,
|
||||
ResourceSelectionInputContractData,
|
||||
ResourceSelectionOutputContractData,
|
||||
)
|
||||
from app.schemas.file import FileItem
|
||||
from app.schemas.transfer import TransferInfo
|
||||
from app.schemas.types import ChainEventType, EventType, MediaType
|
||||
@@ -129,6 +135,37 @@ def test_download_and_transfer_typed_contracts_accept_legacy_runtime_objects() -
|
||||
) == ()
|
||||
|
||||
|
||||
def test_music_runtime_objects_are_checked_as_typed_snapshots() -> None:
|
||||
"""音乐运行时对象保留给插件,同时通过快照契约明确 type/music_type。"""
|
||||
from app.domain.context import MusicInfo
|
||||
|
||||
media = MusicInfo(title="Song", artists=["Artist"], album="Album")
|
||||
context = Context(media_info=media)
|
||||
|
||||
assert validate_event_payload(
|
||||
EventType.DownloadAdded,
|
||||
{"hash": "music-hash", "context": context},
|
||||
) == ()
|
||||
assert validate_event_payload(
|
||||
EventType.TransferComplete,
|
||||
{"mediainfo": media},
|
||||
) == ()
|
||||
|
||||
|
||||
def test_snapshot_contract_metadata_declares_mutable_chain_boundaries() -> None:
|
||||
"""核心链式事件公开快照输入输出模型,但仍处于兼容诊断模式。"""
|
||||
selection = get_event_contract(ChainEventType.ResourceSelection)
|
||||
download = get_event_contract(ChainEventType.ResourceDownload)
|
||||
|
||||
assert selection.schema_version == 1
|
||||
assert selection.payload_mode.value == "snapshot"
|
||||
assert selection.input_model is ResourceSelectionInputContractData
|
||||
assert selection.output_model is ResourceSelectionOutputContractData
|
||||
assert download.input_model is ResourceDownloadInputContractData
|
||||
assert download.output_model is ResourceDownloadOutputContractData
|
||||
assert selection.validation_mode.value == "diagnostic"
|
||||
|
||||
|
||||
def test_model_instance_remains_mutable_chain_payload() -> None:
|
||||
"""链式处理器继续接收原 model 实例,确保输出字段可原地接力。"""
|
||||
payload = ConfigChangeEventData(key={"PROXY_HOST"})
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
"""插件 SDK 事件快照访问测试。"""
|
||||
|
||||
from app.domain.context import Context, MediaInfo, MusicInfo
|
||||
from app.runtime.event.snapshot import (
|
||||
EventPayloadSnapshot as RuntimeEventPayloadSnapshot,
|
||||
)
|
||||
from app.runtime.event.snapshot import snapshot_event_data as runtime_snapshot_event_data
|
||||
from app.schemas.event import ResourceSelectionEventData
|
||||
from app.schemas.types import ChainEventType, EventType, MediaType
|
||||
from app.sdk.events import (
|
||||
DownloadAddedContractData,
|
||||
Event,
|
||||
EventPayloadSnapshot,
|
||||
ResourceSelectionInputContractData,
|
||||
ResourceSelectionOutputContractData,
|
||||
snapshot_event_data,
|
||||
)
|
||||
|
||||
|
||||
def test_sdk_exports_canonical_snapshot_interfaces() -> None:
|
||||
"""SDK 只公开 canonical 快照实现,不复制事件解析逻辑。"""
|
||||
assert EventPayloadSnapshot is RuntimeEventPayloadSnapshot
|
||||
assert snapshot_event_data is runtime_snapshot_event_data
|
||||
|
||||
|
||||
def test_event_snapshot_exposes_music_type_without_changing_raw_payload() -> None:
|
||||
"""插件可从快照稳定识别音乐,原 Context 和 MusicInfo 继续按旧 ABI 投递。"""
|
||||
media = MusicInfo(title="Song", artists=["Artist"], album="Album")
|
||||
context = Context(media_info=media)
|
||||
raw = {"hash": "music-hash", "context": context}
|
||||
event = Event(EventType.DownloadAdded, raw)
|
||||
|
||||
snapshot = event.snapshot()
|
||||
|
||||
assert snapshot.known is True
|
||||
assert snapshot.valid is True
|
||||
assert snapshot.raw is raw
|
||||
assert isinstance(snapshot.payload, DownloadAddedContractData)
|
||||
assert snapshot.input is snapshot.payload
|
||||
assert snapshot.output is None
|
||||
assert snapshot.payload.context.media_info.type == MediaType.MUSIC.value
|
||||
assert snapshot.payload.context.media_info.music_type == "recording"
|
||||
assert event.event_data["context"] is context
|
||||
|
||||
snapshot.payload.context.media_info.title = "Snapshot Song"
|
||||
assert media.title == "Song"
|
||||
|
||||
|
||||
def test_chain_snapshot_separates_plugin_input_and_output_models() -> None:
|
||||
"""链式事件同时提供输入和回写快照,且不替换可变运行时事件模型。"""
|
||||
context = Context(
|
||||
media_info=MediaInfo(type=MediaType.MOVIE, title="Movie", year="2026")
|
||||
)
|
||||
raw = ResourceSelectionEventData(
|
||||
contexts=[context],
|
||||
updated=True,
|
||||
updated_contexts=[context],
|
||||
source="plugin",
|
||||
)
|
||||
event = Event(ChainEventType.ResourceSelection, raw)
|
||||
|
||||
snapshot = event.snapshot()
|
||||
|
||||
assert snapshot.raw is raw
|
||||
assert isinstance(snapshot.input, ResourceSelectionInputContractData)
|
||||
assert isinstance(snapshot.output, ResourceSelectionOutputContractData)
|
||||
assert snapshot.input.contexts[0].media_info.type == MediaType.MOVIE.value
|
||||
assert snapshot.output.updated is True
|
||||
assert snapshot.output.updated_contexts[0].media_info.title == "Movie"
|
||||
assert event.event_data is raw
|
||||
|
||||
|
||||
def test_unknown_plugin_event_returns_unregistered_snapshot_without_error() -> None:
|
||||
"""插件自定义字符串事件没有宿主契约时保留原 payload,不制造假模型。"""
|
||||
raw = {"plugin_owned": {"value": 1}}
|
||||
|
||||
snapshot = snapshot_event_data("plugin.custom.event", raw)
|
||||
|
||||
assert snapshot.known is False
|
||||
assert snapshot.valid is False
|
||||
assert snapshot.raw is raw
|
||||
assert snapshot.payload is None
|
||||
assert snapshot.input is None
|
||||
assert snapshot.output is None
|
||||
assert snapshot.errors == ()
|
||||
|
||||
|
||||
def test_invalid_known_event_returns_validation_errors_instead_of_raising() -> None:
|
||||
"""坏 payload 由 SDK 结果携带错误,插件可自行决定降级策略。"""
|
||||
raw = {"context": {"media_info": {"type": "音乐"}}}
|
||||
|
||||
snapshot = snapshot_event_data(EventType.DownloadAdded, raw)
|
||||
|
||||
assert snapshot.known is True
|
||||
assert snapshot.valid is False
|
||||
assert snapshot.raw is raw
|
||||
assert snapshot.payload is None
|
||||
assert snapshot.errors
|
||||
assert "DownloadAddedContractData" in snapshot.errors[0]
|
||||
Reference in New Issue
Block a user