// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package google.ads.admanager.v1;

import "google/ads/admanager/v1/dai_session_enums.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/timestamp.proto";

option csharp_namespace = "Google.Ads.AdManager.V1";
option go_package = "google.golang.org/genproto/googleapis/ads/admanager/v1;admanager";
option java_multiple_files = true;
option java_outer_classname = "DaiSessionMessagesProto";
option java_package = "com.google.ads.admanager.v1";
option php_namespace = "Google\\Ads\\AdManager\\V1";
option ruby_package = "Google::Ads::AdManager::V1";

// Representation of an individual Dynamic Ad Insertion (DAI) session watching a
// [LiveStream][google.ads.admanager.v1.LiveStream] resource or VOD
// [Content][google.ads.admanager.v1.Content] resource. Use the
// Stream Activity Monitor (SAM) on the Google Ad Manager UI to look up this
// session. For details, see [Locate a DAI session ID or debug
// key](https://support.google.com/admanager/answer/7257678).
message DaiSession {
  option (google.api.resource) = {
    type: "admanager.googleapis.com/DaiSession"
    pattern: "networks/{network_code}/daiSessions/{dai_session}"
    plural: "daiSessions"
    singular: "daiSession"
  };

  // Context data to create the DAI session.
  message CreationContext {
    // The VOD [Content][google.ads.admanager.v1.Content] resource
    // in the stream request that creates the DAI session.
    message VodInfo {
      // Output only. The [name][google.ads.admanager.v1.Content.name] field of
      // the VOD [Content][google.ads.admanager.v1.Content]
      // resource.
      optional string content = 3 [
        (google.api.field_behavior) = OUTPUT_ONLY,
        (google.api.resource_reference) = {
          type: "admanager.googleapis.com/Content"
        }
      ];

      // Output only. The identifier of the content source from which Google Ad
      // Manager ingested the [Content][google.ads.admanager.v1.Content]
      // resource associated with this session. For more information, see
      // [Create a content source for video on
      // demand](https://support.google.com/admanager/answer/7064112).
      optional int64 cms_id = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. The video ID of the
      // [Content][google.ads.admanager.v1.Content] resource
      // that this session is associated with. This value is the same as the
      // [CmsContent.cms_content_id][google.ads.admanager.v1.CmsContent.cms_content_id]
      // field. For details, see [Content ingestion and best
      // practices](https://support.google.com/admanager/answer/6057894).
      optional string vid = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. The cue points detected in the ingested VOD content
      // manifest. Stored in milliseconds starting from the beginning of the
      // content.
      repeated int64 cue_points = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. The VOD
      // [Content.duration][google.ads.admanager.v1.Content.duration]
      // field. Represents the duration of the content without ads.
      google.protobuf.Duration content_duration = 5
          [(google.api.field_behavior) = OUTPUT_ONLY];
    }

    // The [LiveStream][google.ads.admanager.v1.LiveStream] resource
    // in the stream request that creates the DAI session.
    message LinearInfo {
      // Output only. The [name][google.ads.admanager.v1.LiveStream.name] field
      // of the [LiveStream][google.ads.admanager.v1.LiveStream]
      // resource.
      optional string live_stream = 5 [
        (google.api.field_behavior) = OUTPUT_ONLY,
        (google.api.resource_reference) = {
          type: "admanager.googleapis.com/LiveStream"
        }
      ];

      // Output only. The
      // [LiveStream.asset_key][google.ads.admanager.v1.LiveStream.asset_key]
      // field. Google Ad Manager only generates this field for livestreams with
      // the
      // [dynamic_ad_insertion_type][google.ads.admanager.v1.LiveStream.dynamic_ad_insertion_type]
      // field set to
      // [DynamicAdInsertionType.LINEAR][google.ads.admanager.v1.DynamicAdInsertionTypeEnum.DynamicAdInsertionType.LINEAR]
      // value.
      optional string asset_key = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. The
      // [LiveStream.custom_asset_key][google.ads.admanager.v1.LiveStream.custom_asset_key]
      // field. This field is only populated for livestreams with the
      // [dynamic_ad_insertion_type][google.ads.admanager.v1.LiveStream.dynamic_ad_insertion_type]
      // field set to
      // [DynamicAdInsertionType.POD_SERVING_MANIFEST][google.ads.admanager.v1.DynamicAdInsertionTypeEnum.DynamicAdInsertionType.POD_SERVING_MANIFEST]
      // value or
      // [DynamicAdInsertionType.POD_SERVING_REDIRECT][google.ads.admanager.v1.DynamicAdInsertionTypeEnum.DynamicAdInsertionType.POD_SERVING_REDIRECT]
      // value.
      optional string custom_asset_key = 2
          [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. Whether the
      // [LiveStream.prefetch_enabled][google.ads.admanager.v1.LiveStream.prefetch_enabled]
      // field is set to true.
      optional bool prefetch_enabled = 3
          [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. Whether ad pod trimming is enabled for the DAI session.
      optional bool pod_trimming_enabled = 4
          [(google.api.field_behavior) = OUTPUT_ONLY];

      // Optional. The maximum duration allowed to be trimmed from an ad pod
      // before whole ads are dropped. This field is only populated when pod
      // trimming is enabled.
      optional google.protobuf.Duration pod_trim_tolerance = 8
          [(google.api.field_behavior) = OPTIONAL];

      // The
      // [LiveStream.start_time][google.ads.admanager.v1.LiveStream.start_time]
      // field.
      google.protobuf.Timestamp event_start_time = 6;

      // Output only. The
      // [LiveStream.end_time][google.ads.admanager.v1.LiveStream.end_time]
      // field.
      google.protobuf.Timestamp event_end_time = 7
          [(google.api.field_behavior) = OUTPUT_ONLY];
    }

    // Information about the
    // [LiveStream][google.ads.admanager.v1.LiveStream] resource or
    // VOD [Content][google.ads.admanager.v1.Content] resource
    // creating the DAI session.
    oneof content_info {
      // Output only. The [LiveStream][google.ads.admanager.v1.LiveStream]
      // resource in the stream request that creates the DAI session.
      LinearInfo linear_info = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. The [Content][google.ads.admanager.v1.Content] resource in
      // the stream request that creates the DAI session.
      VodInfo vod_info = 3 [(google.api.field_behavior) = OUTPUT_ONLY];
    }

    // Output only. The string the `dai-sam-id` parameter sets in the DAI stream
    // request. For details, see [Locate a DAI session ID or debug
    // key](https://support.google.com/admanager/answer/7257678).
    optional string debug_key = 8 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. The
    // [LiveStream.display_name][google.ads.admanager.v1.LiveStream.display_name]
    // field or
    // [Content.display_name][google.ads.admanager.v1.Content.display_name]
    // field associated with the DAI session.
    optional string content_title = 10
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. The string the `session_title` parameter sets in the DAI
    // stream request. For details, see
    // [CreateStreamOptions](/ad-manager/dynamic-ad-insertion/api/pod-serving/reference/vod#createstreamoptions).
    optional string session_title = 9
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. The HTTP request creating the DAI session. For details, see
    // [Linear
    // API](/ad-manager/dynamic-ad-insertion/api/full-service/reference/live#method_stream),
    // [VOD
    // API](/ad-manager/dynamic-ad-insertion/api/full-service/reference/vod#method_stream),
    // [pod serving live
    // API](/ad-manager/dynamic-ad-insertion/api/pod-serving/reference/live#method_stream)
    // and [pod serving VOD
    // API](/ad-manager/dynamic-ad-insertion/api/pod-serving/reference/vod#method_create_stream).
    HttpRequest stream_create_request = 1
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Whether the stream request is for [Full-service
    // DAI](/ad-manager/dynamic-ad-insertion/full-service)
    // or [Pod
    // serving](/ad-manager/dynamic-ad-insertion/pod-serving).
    optional StitchingTypeEnum.StitchingType stitching_type = 4
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Whether ad tracking URLs are pinged on the client side or
    // server side. If IMA SDK is used to make the stream requests, IMA SDK
    // pings the ad tracking URLs on the client side. For server-side beaconing,
    // see [Integrate with DAI using server-side beaconing
    // (SSB)](https://support.google.com/admanager/answer/7299051).
    optional ReportingTypeEnum.ReportingType reporting_type = 5
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Whether the parameter `dai-istl` on the stream request is
    // set to true. This parameter is only accepted for
    // [LiveStream][google.ads.admanager.v1.LiveStream] resources
    // with the
    // [dynamic_ad_insertion_type][google.ads.admanager.v1.LiveStream.dynamic_ad_insertion_type]
    // field set to
    // [DynamicAdInsertionType.LINEAR][google.ads.admanager.v1.DynamicAdInsertionTypeEnum.DynamicAdInsertionType.LINEAR]
    // value.
    optional bool interstitial_enabled = 6
        [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  // The ad requests, ad response, and nested ads in the DAI session.
  message AdSelection {
    // Top-level ad request.
    message AdRequest {
      // Output only. Ad request ID.
      optional int64 ad_request_key = 1
          [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. The HTTP request of the ad request.
      HttpRequest http_request = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. Ad requests made to follow redirects or unwrap a previous
      // VMAP or VAST wrapper ad response.
      repeated AdRequest child_requests = 3
          [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. The ad request URL.
      optional string ad_tag = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. The effective ad request URL header value on the ad
      // response. This value is only populated for VMAP ad requests when video
      // playlist internal redirects are enabled. For details, see [Internal
      // redirect to Google Campaign Manager
      // 360](https://support.google.com/admanager/answer/9580500).
      optional string effective_ad_request_url = 5
          [(google.api.field_behavior) = OUTPUT_ONLY];
    }

    // Output only. Response type of the parent ad request.
    optional AdResponseTypeEnum.AdResponseType type = 1
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Top-level ad request.
    AdRequest ad_request = 2 [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  // Information about a single decisioned ad pod in this session. This message
  // pertains to the smallest unit of ads to insert in a session, and
  // might be a pod fragment.
  message AdPod {
    // Output only. Type of ad break this ad pod was decisioned for.
    optional BreakTypeEnum.BreakType requested_break_type = 1
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Ad request ID that links to the ad request that resulted in
    // this ad pod.
    optional int64 ad_request_key = 2
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. The creatives in this ad pod. Keyed by a unique ID used to
    // reference this creative from a different submessage.
    map<int64, Creative> creatives = 3
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Indicates the prefetch stage for this ad pod. If prefetch is
    // not enabled this stage is set to the
    // [PrefetchStageType.DISABLED][google.ads.admanager.v1.PrefetchStageTypeEnum.PrefetchStageType.DISABLED]
    // value.
    optional PrefetchStageTypeEnum.PrefetchStageType prefetch_stage = 4
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Publisher-provided or DAI-generated break ID for the [Ad
    // break API](/ad-manager/dynamic-ad-insertion/api/ad-break) or [pod serving
    // API](/ad-manager/dynamic-ad-insertion/pod-serving).
    optional string ad_break_id = 5 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Descriptive label for this ad pod, used to distinguish ad
    // pods from one another in this session. e.g. "midroll-1", "2".
    optional string label = 6 [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  // Information about an ad break in this session. Includes statuses such as ad
  // and slate durations.
  message AdBreak {
    // Represents Video on Demand related break information.
    message VodBreak {
      // Output only. The time difference between the start of this break and
      // the start of the session. Includes the time for any preceding ad
      // breaks.
      google.protobuf.Duration time_offset = 1
          [(google.api.field_behavior) = OUTPUT_ONLY];
    }

    // Represents linear session related break information.
    message LinearBreak {
      // Output only. The timestamp of when the break started.
      google.protobuf.Timestamp break_start_time = 3
          [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. The duration of the placement opportunity associated with
      // the break.
      google.protobuf.Duration expected_break_duration = 4
          [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. The duration of slate that was inserted for this break.
      google.protobuf.Duration slate_duration = 5
          [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. The duration of underlying content that was inserted for
      // this break.
      google.protobuf.Duration underlying_duration = 6
          [(google.api.field_behavior) = OUTPUT_ONLY];
    }

    // Information about a tracking ping issued for a break.
    message TrackingPing {
      // Output only. A unique ID for this tracking event, which is the ID3 tag
      // in client-side reporting.
      optional string original_tracking_event_id = 4
          [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. The HTTP request made to the ad server for this tracking
      // ping.
      HttpRequest request = 2 [(google.api.field_behavior) = OUTPUT_ONLY];
    }

    // Information about this ad break relevant to the session type.
    oneof stream_type_info {
      // Output only. Information on the break for a linear session.
      LinearBreak linear = 7 [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. Information on the break for a VOD session.
      VodBreak vod = 8 [(google.api.field_behavior) = OUTPUT_ONLY];
    }

    // Output only. Ad pod ID that links to one or more decisioned ad pods for
    // this break. Most types of sessions will have a single pod key, but in the
    // case of prefetched pods there will be two pod keys.
    repeated int64 pod_keys = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Publisher-provided or DAI-generated break ID for the [Ad
    // break API](/ad-manager/dynamic-ad-insertion/api/ad-break) or [pod serving
    // API](/ad-manager/dynamic-ad-insertion/pod-serving).
    optional string ad_break_id = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Type of break this represents.
    optional BreakTypeEnum.BreakType break_type = 3
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. The index of this ad break in the session.
    optional int64 break_sequence = 4
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. The duration of ads that were inserted for this break.
    google.protobuf.Duration served_ads_duration = 5
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. The total duration of the break as it was served by DAI. In
    // VOD, this value is the duration of ads inserted in between content. In
    // linear, this value is the duration between cue out and cue in.
    google.protobuf.Duration executed_break_duration = 6
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Tracking pings that were issued for this break. Keyed by a
    // unique ID to reference this tracking ping from a different submessage.
    map<int64, TrackingPing> tracking_pings = 9
        [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  // An HTTP request made by DAI.
  message HttpRequest {
    // Output only. The time when the request was made.
    google.protobuf.Timestamp request_time = 1
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. How long the request took to complete.
    google.protobuf.Duration latency = 2
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. The URL sent in the request.
    optional string url = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. The user agent sent with the request.
    optional string user_agent = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. The HTTP response code.
    optional int32 response_code = 5
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. The full response body.
    optional string response_body = 6
        [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  // Information about a single creative.
  message Creative {
    // Details about a single VAST info.
    message VastInfo {
      // Output only. Value of VAST/Ad/InLine/AdSystem.
      optional string ad_system = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. Version attribute from VAST/Ad/InLine/AdSystem.
      optional string ad_system_version = 2
          [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. Value of VAST/Ad/InLine/AdTitle.
      optional string ad_title = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. Value of VAST/Ad/InLine/Description.
      optional string description = 4
          [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. The `id` attribute from VAST/Ad/InLine/Creatives/Creative.
      optional string creative_id = 5
          [(google.api.field_behavior) = OUTPUT_ONLY];
    }

    // Output only. The type of ID that is used to identify this creative.
    optional CreativeIdTypeEnum.CreativeIdType id_type = 1
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. The value for the given ID type.
    optional string id_value = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. The ad system that provided this creative.
    optional string ad_system = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Duration of the creative.
    google.protobuf.Duration duration = 4
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. The index at which this creative appeared in the ad pod.
    optional int32 pod_sequence = 5 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. The VAST infos that resulted in this creative.
    repeated VastInfo vast_infos = 6
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. Whether this creative was from ad buffet.
    optional bool ad_buffet = 7 [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  // Information about errors or notable discoveries that occurred during a
  // session.
  message Finding {
    // A finding that occurred while decisioning an ad pod.
    message PodFinding {
      // Output only. The finding's type.
      optional PodFindingTypeEnum.PodFindingType type = 1
          [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. ID that links to the relevant ad pod.
      optional int64 pod_key = 2 [(google.api.field_behavior) = OUTPUT_ONLY];
    }

    // A finding that occurred regarding the slate creative, which can be found
    // at the
    // [DaiSession.slate][google.ads.admanager.v1.DaiSession.slate]
    // field.
    message SlateFinding {
      // Output only. The finding's type.
      optional SlateFindingTypeEnum.SlateFindingType type = 1
          [(google.api.field_behavior) = OUTPUT_ONLY];
    }

    // A finding that occurred while serving ads for a session.
    message AdBreakFinding {
      // Output only. The finding's type.
      optional AdBreakFindingTypeEnum.AdBreakFindingType type = 1
          [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. The ID that links to the relevant ad break.
      optional int64 break_key = 2 [(google.api.field_behavior) = OUTPUT_ONLY];
    }

    // A finding that occurred while pinging tracking URLs for a session.
    message TrackingPingFinding {
      // Output only. The finding's type.
      optional TrackingPingFindingTypeEnum.TrackingPingFindingType type = 1
          [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. The ID that links to the relevant tracking ping.
      optional int64 tracking_ping_key = 2
          [(google.api.field_behavior) = OUTPUT_ONLY];
    }

    // A finding that occurred while looking up creative information.
    message CreativeFinding {
      // Output only. The finding's type.
      optional CreativeFindingTypeEnum.CreativeFindingType type = 1
          [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. The ID that links to the relevant creative.
      optional int64 creative_key = 2
          [(google.api.field_behavior) = OUTPUT_ONLY];
    }

    // A finding that occurred while making an ad request.
    message AdRequestFinding {
      // Output only. The finding's type.
      optional AdRequestFindingTypeEnum.AdRequestFindingType type = 1
          [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. The ID that links to the relevant ad selection.
      optional int64 ad_selection_key = 2
          [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. The ID that links to the relevant ad request.
      optional int64 ad_request_key = 3
          [(google.api.field_behavior) = OUTPUT_ONLY];
    }

    // Which session entity this finding is relevant to.
    oneof type {
      // Output only. A finding related to building an ad pod.
      PodFinding pod_finding = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. A finding related to the slate creative.
      SlateFinding slate_finding = 5
          [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. A finding related to an ad break.
      AdBreakFinding ad_break_finding = 6
          [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. A finding related to a tracking ping.
      TrackingPingFinding tracking_finding = 7
          [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. A finding related to a creative.
      CreativeFinding creative_finding = 8
          [(google.api.field_behavior) = OUTPUT_ONLY];

      // Output only. A finding related to an ad request within ad selection.
      AdRequestFinding ad_request_finding = 9
          [(google.api.field_behavior) = OUTPUT_ONLY];
    }

    // Output only. The severity of the finding to the session.
    optional SessionFindingSeverityEnum.SessionFindingSeverity severity = 1
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. A description of the finding.
    optional string description = 2 [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  // Identifier. The resource name of the `DaiSession`.
  string name = 1 [(google.api.field_behavior) = IDENTIFIER];

  // Output only. Context data to create the DAI session.
  CreationContext creation_context = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Slate creative to use in the DAI session for unfilled ad
  // durations.
  Creative slate = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The ad requests, ad responses and nested ads in the DAI
  // session.
  map<int64, AdSelection> ad_selections = 5
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. All decisioned ad pods for this session, disregarding serving
  // status. Keyed by a unique ID to reference an ad pod from a different
  // submessage.
  map<int64, AdPod> ad_pods = 6 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. All DAI ad breaks for this session. Contains information such
  // as ad duration, slate duration, and various ad statuses. Keyed by a unique
  // ID to reference an ad break from a different submessage.
  map<int64, AdBreak> ad_breaks = 7 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Information about errors or notable discoveries that occurred
  // during a session.
  repeated Finding findings = 8 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The duration of the DAI session, calculated as the difference
  // between the timestamp of DAI's latest recorded event and the timestamp of
  // the session create request.
  google.protobuf.Duration session_duration = 9
      [(google.api.field_behavior) = OUTPUT_ONLY];
}
