feat(events): expose typed payload snapshots

This commit is contained in:
jxxghp
2026-08-25 22:32:33 +08:00
parent c8146ee395
commit 3ba4027d84
13 changed files with 1023 additions and 54 deletions
+17 -3
View File
@@ -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
View File
@@ -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": [
+40 -3
View File
@@ -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"})
+99
View File
@@ -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]