diff --git a/cli/beamable.common/Runtime/BeamCli/Contracts/BundlesService/BundleTagInfo.cs b/cli/beamable.common/Runtime/BeamCli/Contracts/BundlesService/BundleTagInfo.cs
index 5ed678a943..449cb91e16 100644
--- a/cli/beamable.common/Runtime/BeamCli/Contracts/BundlesService/BundleTagInfo.cs
+++ b/cli/beamable.common/Runtime/BeamCli/Contracts/BundlesService/BundleTagInfo.cs
@@ -3,18 +3,13 @@
namespace Beamable.Common.BeamCli.Contracts
{
///
- /// Contract projection of the autogenerated BundleTag API model. The generated model
- /// uses Optional-wrapped fields and only exists in the CLI assembly, so command outputs expose
- /// this type instead, allowing it to be copied into other SDKs.
+ /// Contract projection of a bundle's tags. The API returns them as a tag-to-checksum map
+ /// whose types only exist in the CLI assembly, so command outputs expose this type instead,
+ /// allowing it to be copied into other SDKs.
///
[CliContractType, Serializable]
public class BundleTagInfo
{
- ///
- /// The fully qualified bundle name the tag belongs to.
- ///
- public string bundleName;
-
///
/// The content checksum (sha256:...) the tag currently points at.
///
@@ -24,10 +19,5 @@ public class BundleTagInfo
/// The tag name (e.g. "latest").
///
public string tag;
-
- ///
- /// Unix timestamp (milliseconds) of when the tag was last moved.
- ///
- public long updatedAt;
}
}
diff --git a/cli/beamable.common/Runtime/OpenApi/BeamBeamobundle.gs.cs b/cli/beamable.common/Runtime/OpenApi/BeamBeamobundle.gs.cs
index 0af84c2d1c..1ef1a94506 100644
--- a/cli/beamable.common/Runtime/OpenApi/BeamBeamobundle.gs.cs
+++ b/cli/beamable.common/Runtime/OpenApi/BeamBeamobundle.gs.cs
@@ -29,15 +29,18 @@ public partial interface IBeamBeamobundleApi
/// A promise containing the
Promise GetBundles(string bundleName, string ns, [System.Runtime.InteropServices.DefaultParameterValueAttribute(true)] [System.Runtime.InteropServices.OptionalAttribute()] bool includeAuthHeader);
///
- /// Publish history for a bundle (all checksums, newest first).
+ /// Release timeline for a bundle, newest first. fromVersion is an
+ ///exclusive cursor - pass the last version you received to page backwards.
///
- /// GET call to `/api/beamo/bundles/{ns}/{bundleName}/history` endpoint.
+ /// GET call to `/api/beamo/bundles/{ns}/{bundleName}/releases` endpoint.
///
///
+ ///
+ ///
///
/// By default, every request will include an authorization header so that the request acts on behalf of the current user. When the includeAuthHeader argument is false, the request will not include the authorization header for the current user.
- /// A promise containing the
- Promise GetBundlesHistory(string bundleName, string ns, [System.Runtime.InteropServices.DefaultParameterValueAttribute(true)] [System.Runtime.InteropServices.OptionalAttribute()] bool includeAuthHeader);
+ /// A promise containing the
+ Promise GetBundlesReleases(string bundleName, string ns, [System.Runtime.InteropServices.DefaultParameterValueAttribute(null)] [System.Runtime.InteropServices.OptionalAttribute()] Beamable.Common.Content.Optional fromVersion, [System.Runtime.InteropServices.DefaultParameterValueAttribute(null)] [System.Runtime.InteropServices.OptionalAttribute()] Beamable.Common.Content.Optional limit, [System.Runtime.InteropServices.DefaultParameterValueAttribute(true)] [System.Runtime.InteropServices.OptionalAttribute()] bool includeAuthHeader);
///
/// Fetch a specific bundle version by content checksum.
///
@@ -84,17 +87,16 @@ public partial interface IBeamBeamobundleApi
/// A promise containing the
Promise PostBundlesChecksumsYank(string bundleName, string checksum, string ns, [System.Runtime.InteropServices.DefaultParameterValueAttribute(true)] [System.Runtime.InteropServices.OptionalAttribute()] bool includeAuthHeader);
///
- /// Widen the ACL on a bundle checksum. Admin-gated.
+ /// Widen a bundle's ACL. Admin-gated.
///
- /// PUT call to `/api/beamo/bundles/{ns}/{bundleName}/checksums/{checksum}/acl` endpoint.
+ /// PUT call to `/api/beamo/bundles/{ns}/{bundleName}/acl` endpoint.
///
///
- ///
///
/// The instance to use for the request
/// By default, every request will include an authorization header so that the request acts on behalf of the current user. When the includeAuthHeader argument is false, the request will not include the authorization header for the current user.
- /// A promise containing the
- Promise PutBundlesChecksumsAcl(string bundleName, string checksum, string ns, UpdateBundleAclRequest gsReq, [System.Runtime.InteropServices.DefaultParameterValueAttribute(true)] [System.Runtime.InteropServices.OptionalAttribute()] bool includeAuthHeader);
+ /// A promise containing the
+ Promise PutBundlesAcl(string bundleName, string ns, UpdateBundleAclRequest gsReq, [System.Runtime.InteropServices.DefaultParameterValueAttribute(true)] [System.Runtime.InteropServices.OptionalAttribute()] bool includeAuthHeader);
}
public partial class BeamBeamobundleApi : IBeamBeamobundleApi
{
@@ -129,21 +131,41 @@ public virtual Promise GetBundles(string bundleName, string n
return _requester.Request(Method.GET, gsUrl, default(object), includeAuthHeader, this.Serialize);
}
///
- /// Publish history for a bundle (all checksums, newest first).
+ /// Release timeline for a bundle, newest first. fromVersion is an
+ ///exclusive cursor - pass the last version you received to page backwards.
///
- /// GET call to `/api/beamo/bundles/{ns}/{bundleName}/history` endpoint.
+ /// GET call to `/api/beamo/bundles/{ns}/{bundleName}/releases` endpoint.
///
///
+ ///
+ ///
///
/// By default, every request will include an authorization header so that the request acts on behalf of the current user. When the includeAuthHeader argument is false, the request will not include the authorization header for the current user.
- /// A promise containing the
- public virtual Promise GetBundlesHistory(string bundleName, string ns, [System.Runtime.InteropServices.DefaultParameterValueAttribute(true)] [System.Runtime.InteropServices.OptionalAttribute()] bool includeAuthHeader)
+ /// A promise containing the
+ public virtual Promise GetBundlesReleases(string bundleName, string ns, [System.Runtime.InteropServices.DefaultParameterValueAttribute(null)] [System.Runtime.InteropServices.OptionalAttribute()] Beamable.Common.Content.Optional fromVersion, [System.Runtime.InteropServices.DefaultParameterValueAttribute(null)] [System.Runtime.InteropServices.OptionalAttribute()] Beamable.Common.Content.Optional limit, [System.Runtime.InteropServices.DefaultParameterValueAttribute(true)] [System.Runtime.InteropServices.OptionalAttribute()] bool includeAuthHeader)
{
- string gsUrl = "/api/beamo/bundles/{ns}/{bundleName}/history";
+ string gsUrl = "/api/beamo/bundles/{ns}/{bundleName}/releases";
gsUrl = gsUrl.Replace("{ns}", _requester.EscapeURL(ns.ToString()));
gsUrl = gsUrl.Replace("{bundleName}", _requester.EscapeURL(bundleName.ToString()));
+ string gsQuery = "?";
+ System.Collections.Generic.List gsQueries = new System.Collections.Generic.List();
+ if (((limit != default(OptionalInt))
+ && limit.HasValue))
+ {
+ gsQueries.Add(string.Concat("limit=", limit.Value.ToString()));
+ }
+ if (((fromVersion != default(OptionalLong))
+ && fromVersion.HasValue))
+ {
+ gsQueries.Add(string.Concat("fromVersion=", fromVersion.Value.ToString()));
+ }
+ if ((gsQueries.Count > 0))
+ {
+ gsQuery = string.Concat(gsQuery, string.Join("&", gsQueries));
+ gsUrl = string.Concat(gsUrl, gsQuery);
+ }
// make the request and return the result
- return _requester.Request(Method.GET, gsUrl, default(object), includeAuthHeader, this.Serialize);
+ return _requester.Request(Method.GET, gsUrl, default(object), includeAuthHeader, this.Serialize);
}
///
/// Fetch a specific bundle version by content checksum.
@@ -222,24 +244,22 @@ public virtual Promise PostBundlesChecksumsYank(string bundl
return _requester.Request(Method.POST, gsUrl, default(object), includeAuthHeader, this.Serialize);
}
///
- /// Widen the ACL on a bundle checksum. Admin-gated.
+ /// Widen a bundle's ACL. Admin-gated.
///
- /// PUT call to `/api/beamo/bundles/{ns}/{bundleName}/checksums/{checksum}/acl` endpoint.
+ /// PUT call to `/api/beamo/bundles/{ns}/{bundleName}/acl` endpoint.
///
///
- ///
///
/// The instance to use for the request
/// By default, every request will include an authorization header so that the request acts on behalf of the current user. When the includeAuthHeader argument is false, the request will not include the authorization header for the current user.
- /// A promise containing the
- public virtual Promise PutBundlesChecksumsAcl(string bundleName, string checksum, string ns, UpdateBundleAclRequest gsReq, [System.Runtime.InteropServices.DefaultParameterValueAttribute(true)] [System.Runtime.InteropServices.OptionalAttribute()] bool includeAuthHeader)
+ /// A promise containing the
+ public virtual Promise PutBundlesAcl(string bundleName, string ns, UpdateBundleAclRequest gsReq, [System.Runtime.InteropServices.DefaultParameterValueAttribute(true)] [System.Runtime.InteropServices.OptionalAttribute()] bool includeAuthHeader)
{
- string gsUrl = "/api/beamo/bundles/{ns}/{bundleName}/checksums/{checksum}/acl";
+ string gsUrl = "/api/beamo/bundles/{ns}/{bundleName}/acl";
gsUrl = gsUrl.Replace("{ns}", _requester.EscapeURL(ns.ToString()));
gsUrl = gsUrl.Replace("{bundleName}", _requester.EscapeURL(bundleName.ToString()));
- gsUrl = gsUrl.Replace("{checksum}", _requester.EscapeURL(checksum.ToString()));
// make the request and return the result
- return _requester.Request(Method.PUT, gsUrl, Beamable.Serialization.JsonSerializable.ToJson(gsReq), includeAuthHeader, this.Serialize);
+ return _requester.Request(Method.PUT, gsUrl, Beamable.Serialization.JsonSerializable.ToJson(gsReq), includeAuthHeader, this.Serialize);
}
}
}
diff --git a/cli/beamable.common/Runtime/OpenApi/Models.gs.cs b/cli/beamable.common/Runtime/OpenApi/Models.gs.cs
index 972932bb85..853c7a96eb 100644
--- a/cli/beamable.common/Runtime/OpenApi/Models.gs.cs
+++ b/cli/beamable.common/Runtime/OpenApi/Models.gs.cs
@@ -3492,11 +3492,11 @@ public static BeamoV2PathRuleOperationType FromEnumString(string str)
[System.SerializableAttribute()]
public partial class ListBundlesResponse : Beamable.Serialization.JsonSerializable.ISerializable
{
- public OptionalArrayOfBundle bundles = new OptionalArrayOfBundle();
+ public OptionalArrayOfBundleSummary bundles = new OptionalArrayOfBundleSummary();
public virtual void Serialize(Beamable.Serialization.JsonSerializable.IStreamSerializer s)
{
if ((s.HasKey("bundles")
- || ((bundles != default(OptionalArrayOfBundle))
+ || ((bundles != default(OptionalArrayOfBundleSummary))
&& bundles.HasValue)))
{
s.SerializeArray("bundles", ref bundles.Value);
@@ -3508,7 +3508,8 @@ public virtual void Serialize(Beamable.Serialization.JsonSerializable.IStreamSer
public partial class GetBundleResponse : Beamable.Serialization.JsonSerializable.ISerializable
{
public OptionalBundle bundle = new OptionalBundle();
- public OptionalArrayOfBundleTag tags = new OptionalArrayOfBundleTag();
+ public OptionalMapOfString tags = new OptionalMapOfString();
+ public OptionalLong version = new OptionalLong();
public virtual void Serialize(Beamable.Serialization.JsonSerializable.IStreamSerializer s)
{
if ((s.HasKey("bundle")
@@ -3519,10 +3520,40 @@ public virtual void Serialize(Beamable.Serialization.JsonSerializable.IStreamSer
bundle.HasValue = true;
}
if ((s.HasKey("tags")
- || ((tags != default(OptionalArrayOfBundleTag))
+ || ((tags != default(OptionalMapOfString))
&& tags.HasValue)))
{
- s.SerializeArray("tags", ref tags.Value);
+ s.SerializeDictionary("tags", ref tags.Value);
+ tags.HasValue = true;
+ }
+ if ((s.HasKey("version")
+ || ((version != default(OptionalLong))
+ && version.HasValue)))
+ {
+ s.Serialize("version", ref version.Value);
+ version.HasValue = true;
+ }
+ }
+ }
+ [System.SerializableAttribute()]
+ public partial class ListBundleReleasesResponse : Beamable.Serialization.JsonSerializable.ISerializable
+ {
+ public OptionalArrayOfBundleRelease releases = new OptionalArrayOfBundleRelease();
+ public OptionalMapOfString tags = new OptionalMapOfString();
+ public virtual void Serialize(Beamable.Serialization.JsonSerializable.IStreamSerializer s)
+ {
+ if ((s.HasKey("releases")
+ || ((releases != default(OptionalArrayOfBundleRelease))
+ && releases.HasValue)))
+ {
+ s.SerializeArray("releases", ref releases.Value);
+ releases.HasValue = true;
+ }
+ if ((s.HasKey("tags")
+ || ((tags != default(OptionalMapOfString))
+ && tags.HasValue)))
+ {
+ s.SerializeDictionary("tags", ref tags.Value);
tags.HasValue = true;
}
}
@@ -3577,7 +3608,7 @@ public virtual void Serialize(Beamable.Serialization.JsonSerializable.IStreamSer
[System.SerializableAttribute()]
public partial class PublishBundleRequest : Beamable.Serialization.JsonSerializable.ISerializable
{
- public OptionalMapOfBundlePeerDep peerDependencies = new OptionalMapOfBundlePeerDep();
+ public OptionalMapOfBundleDepRange bundleDependencies = new OptionalMapOfBundleDepRange();
public OptionalArrayOfPortalExtensionReference portalExtensionReferences = new OptionalArrayOfPortalExtensionReference();
public OptionalArrayOfSchemaReference schemaReferences = new OptionalArrayOfSchemaReference();
public OptionalArrayOfServiceReference serviceReferences = new OptionalArrayOfServiceReference();
@@ -3585,12 +3616,12 @@ public partial class PublishBundleRequest : Beamable.Serialization.JsonSerializa
public OptionalString tag = new OptionalString();
public virtual void Serialize(Beamable.Serialization.JsonSerializable.IStreamSerializer s)
{
- if ((s.HasKey("peerDependencies")
- || ((peerDependencies != default(OptionalMapOfBundlePeerDep))
- && peerDependencies.HasValue)))
+ if ((s.HasKey("bundleDependencies")
+ || ((bundleDependencies != default(OptionalMapOfBundleDepRange))
+ && bundleDependencies.HasValue)))
{
- s.SerializeDictionary("peerDependencies", ref peerDependencies.Value);
- peerDependencies.HasValue = true;
+ s.SerializeDictionary("bundleDependencies", ref bundleDependencies.Value);
+ bundleDependencies.HasValue = true;
}
if ((s.HasKey("portalExtensionReferences")
|| ((portalExtensionReferences != default(OptionalArrayOfPortalExtensionReference))
@@ -3635,6 +3666,7 @@ public partial class PublishBundleResponse : Beamable.Serialization.JsonSerializ
public OptionalString checksum = new OptionalString();
public OptionalBool isNew = new OptionalBool();
public OptionalString name = new OptionalString();
+ public OptionalLong version = new OptionalLong();
public virtual void Serialize(Beamable.Serialization.JsonSerializable.IStreamSerializer s)
{
if ((s.HasKey("checksum")
@@ -3658,6 +3690,13 @@ public virtual void Serialize(Beamable.Serialization.JsonSerializable.IStreamSer
s.Serialize("name", ref name.Value);
name.HasValue = true;
}
+ if ((s.HasKey("version")
+ || ((version != default(OptionalLong))
+ && version.HasValue)))
+ {
+ s.Serialize("version", ref version.Value);
+ version.HasValue = true;
+ }
}
}
[System.SerializableAttribute()]
@@ -3721,7 +3760,7 @@ public virtual void Serialize(Beamable.Serialization.JsonSerializable.IStreamSer
}
}
[System.SerializableAttribute()]
- public partial class ApiBeamoBundlesChecksumsAclPutBeamoBundleResponse : Beamable.Serialization.JsonSerializable.ISerializable
+ public partial class ApiBeamoBundlesAclPutBeamoBundleResponse : Beamable.Serialization.JsonSerializable.ISerializable
{
public virtual void Serialize(Beamable.Serialization.JsonSerializable.IStreamSerializer s)
{
@@ -3730,10 +3769,9 @@ public virtual void Serialize(Beamable.Serialization.JsonSerializable.IStreamSer
[System.SerializableAttribute()]
public partial class Bundle : Beamable.Serialization.JsonSerializable.ISerializable
{
- public OptionalString acl = new OptionalString();
+ public OptionalArrayOfBundleDep bundleDependencies = new OptionalArrayOfBundleDep();
public OptionalString checksum = new OptionalString();
public OptionalString name = new OptionalString();
- public OptionalMapOfBundlePeerDep peerDependencies = new OptionalMapOfBundlePeerDep();
public OptionalArrayOfPortalExtensionReference portalExtensionReferences = new OptionalArrayOfPortalExtensionReference();
public OptionalLong publishedAt = new OptionalLong();
public OptionalString publisherFullScope = new OptionalString();
@@ -3743,12 +3781,12 @@ public partial class Bundle : Beamable.Serialization.JsonSerializable.ISerializa
public OptionalBool yanked = new OptionalBool();
public virtual void Serialize(Beamable.Serialization.JsonSerializable.IStreamSerializer s)
{
- if ((s.HasKey("acl")
- || ((acl != default(OptionalString))
- && acl.HasValue)))
+ if ((s.HasKey("bundleDependencies")
+ || ((bundleDependencies != default(OptionalArrayOfBundleDep))
+ && bundleDependencies.HasValue)))
{
- s.Serialize("acl", ref acl.Value);
- acl.HasValue = true;
+ s.SerializeArray("bundleDependencies", ref bundleDependencies.Value);
+ bundleDependencies.HasValue = true;
}
if ((s.HasKey("checksum")
|| ((checksum != default(OptionalString))
@@ -3764,13 +3802,6 @@ public virtual void Serialize(Beamable.Serialization.JsonSerializable.IStreamSer
s.Serialize("name", ref name.Value);
name.HasValue = true;
}
- if ((s.HasKey("peerDependencies")
- || ((peerDependencies != default(OptionalMapOfBundlePeerDep))
- && peerDependencies.HasValue)))
- {
- s.SerializeDictionary("peerDependencies", ref peerDependencies.Value);
- peerDependencies.HasValue = true;
- }
if ((s.HasKey("portalExtensionReferences")
|| ((portalExtensionReferences != default(OptionalArrayOfPortalExtensionReference))
&& portalExtensionReferences.HasValue)))
@@ -3823,12 +3854,75 @@ public virtual void Serialize(Beamable.Serialization.JsonSerializable.IStreamSer
}
}
[System.SerializableAttribute()]
- public partial class BundleTag : Beamable.Serialization.JsonSerializable.ISerializable
+ public partial class BundleSummary : Beamable.Serialization.JsonSerializable.ISerializable
+ {
+ public OptionalString acl = new OptionalString();
+ public OptionalString latestChecksum = new OptionalString();
+ public OptionalLong latestVersion = new OptionalLong();
+ public OptionalString name = new OptionalString();
+ public OptionalString ownerCid = new OptionalString();
+ public OptionalArrayOfBundleSummaryTag tags = new OptionalArrayOfBundleSummaryTag();
+ public OptionalLong updatedAt = new OptionalLong();
+ public virtual void Serialize(Beamable.Serialization.JsonSerializable.IStreamSerializer s)
+ {
+ if ((s.HasKey("acl")
+ || ((acl != default(OptionalString))
+ && acl.HasValue)))
+ {
+ s.Serialize("acl", ref acl.Value);
+ acl.HasValue = true;
+ }
+ if ((s.HasKey("latestChecksum")
+ || ((latestChecksum != default(OptionalString))
+ && latestChecksum.HasValue)))
+ {
+ s.Serialize("latestChecksum", ref latestChecksum.Value);
+ latestChecksum.HasValue = true;
+ }
+ if ((s.HasKey("latestVersion")
+ || ((latestVersion != default(OptionalLong))
+ && latestVersion.HasValue)))
+ {
+ s.Serialize("latestVersion", ref latestVersion.Value);
+ latestVersion.HasValue = true;
+ }
+ if ((s.HasKey("name")
+ || ((name != default(OptionalString))
+ && name.HasValue)))
+ {
+ s.Serialize("name", ref name.Value);
+ name.HasValue = true;
+ }
+ if ((s.HasKey("ownerCid")
+ || ((ownerCid != default(OptionalString))
+ && ownerCid.HasValue)))
+ {
+ s.Serialize("ownerCid", ref ownerCid.Value);
+ ownerCid.HasValue = true;
+ }
+ if ((s.HasKey("tags")
+ || ((tags != default(OptionalArrayOfBundleSummaryTag))
+ && tags.HasValue)))
+ {
+ s.SerializeArray("tags", ref tags.Value);
+ tags.HasValue = true;
+ }
+ if ((s.HasKey("updatedAt")
+ || ((updatedAt != default(OptionalLong))
+ && updatedAt.HasValue)))
+ {
+ s.Serialize("updatedAt", ref updatedAt.Value);
+ updatedAt.HasValue = true;
+ }
+ }
+ }
+ [System.SerializableAttribute()]
+ public partial class BundleRelease : Beamable.Serialization.JsonSerializable.ISerializable
{
public OptionalString bundleName = new OptionalString();
public OptionalString checksum = new OptionalString();
- public OptionalString tag = new OptionalString();
- public OptionalLong updatedAt = new OptionalLong();
+ public OptionalDateTime publishedAt = new OptionalDateTime();
+ public OptionalLong version = new OptionalLong();
public virtual void Serialize(Beamable.Serialization.JsonSerializable.IStreamSerializer s)
{
if ((s.HasKey("bundleName")
@@ -3845,19 +3939,19 @@ public virtual void Serialize(Beamable.Serialization.JsonSerializable.IStreamSer
s.Serialize("checksum", ref checksum.Value);
checksum.HasValue = true;
}
- if ((s.HasKey("tag")
- || ((tag != default(OptionalString))
- && tag.HasValue)))
+ if ((s.HasKey("publishedAt")
+ || ((publishedAt != default(OptionalDateTime))
+ && publishedAt.HasValue)))
{
- s.Serialize("tag", ref tag.Value);
- tag.HasValue = true;
+ s.Serialize("publishedAt", ref publishedAt.Value, "yyyy-MM-ddTHH:mm:ssZ", "yyyy-MM-ddTHH:mm:ss.fZ", "yyyy-MM-ddTHH:mm:ss.ffZ", "yyyy-MM-ddTHH:mm:ss.fffZ", "yyyy-MM-ddTHH:mm:ss.ffffZ", "yyyy-MM-ddTHH:mm:ss.fffffZ", "yyyy-MM-ddTHH:mm:ss.ffffffZ", "yyyy-MM-ddTHH:mm:ss.fffffffzzz", "yyyy-MM-ddTHH:mm:ss.ffffffffzzz", "yyyy-MM-ddTHH:mm:ss.fffffffffzzz");
+ publishedAt.HasValue = true;
}
- if ((s.HasKey("updatedAt")
- || ((updatedAt != default(OptionalLong))
- && updatedAt.HasValue)))
+ if ((s.HasKey("version")
+ || ((version != default(OptionalLong))
+ && version.HasValue)))
{
- s.Serialize("updatedAt", ref updatedAt.Value);
- updatedAt.HasValue = true;
+ s.Serialize("version", ref version.Value);
+ version.HasValue = true;
}
}
}
@@ -4138,17 +4232,64 @@ public virtual void Serialize(Beamable.Serialization.JsonSerializable.IStreamSer
}
}
[System.SerializableAttribute()]
- public partial class BundlePeerDep : Beamable.Serialization.JsonSerializable.ISerializable
+ public partial class BundleDepRange : Beamable.Serialization.JsonSerializable.ISerializable
{
- public OptionalString type = new OptionalString();
+ public OptionalLong max = new OptionalLong();
+ public OptionalLong min = new OptionalLong();
public virtual void Serialize(Beamable.Serialization.JsonSerializable.IStreamSerializer s)
{
- if ((s.HasKey("type")
- || ((type != default(OptionalString))
- && type.HasValue)))
+ if ((s.HasKey("max")
+ || ((max != default(OptionalLong))
+ && max.HasValue)))
{
- s.Serialize("type", ref type.Value);
- type.HasValue = true;
+ s.Serialize("max", ref max.Value);
+ max.HasValue = true;
+ }
+ if ((s.HasKey("min")
+ || ((min != default(OptionalLong))
+ && min.HasValue)))
+ {
+ s.Serialize("min", ref min.Value);
+ min.HasValue = true;
+ }
+ }
+ }
+ [System.SerializableAttribute()]
+ public partial class BundleDep : Beamable.Serialization.JsonSerializable.ISerializable
+ {
+ public OptionalString checksum = new OptionalString();
+ public OptionalLong max = new OptionalLong();
+ public OptionalLong min = new OptionalLong();
+ public OptionalString name = new OptionalString();
+ public virtual void Serialize(Beamable.Serialization.JsonSerializable.IStreamSerializer s)
+ {
+ if ((s.HasKey("checksum")
+ || ((checksum != default(OptionalString))
+ && checksum.HasValue)))
+ {
+ s.Serialize("checksum", ref checksum.Value);
+ checksum.HasValue = true;
+ }
+ if ((s.HasKey("max")
+ || ((max != default(OptionalLong))
+ && max.HasValue)))
+ {
+ s.Serialize("max", ref max.Value);
+ max.HasValue = true;
+ }
+ if ((s.HasKey("min")
+ || ((min != default(OptionalLong))
+ && min.HasValue)))
+ {
+ s.Serialize("min", ref min.Value);
+ min.HasValue = true;
+ }
+ if ((s.HasKey("name")
+ || ((name != default(OptionalString))
+ && name.HasValue)))
+ {
+ s.Serialize("name", ref name.Value);
+ name.HasValue = true;
}
}
}
@@ -4185,6 +4326,29 @@ public static LogProvider FromEnumString(string str)
}
}
[System.SerializableAttribute()]
+ public partial class BundleSummaryTag : Beamable.Serialization.JsonSerializable.ISerializable
+ {
+ public OptionalString checksum = new OptionalString();
+ public OptionalString tag = new OptionalString();
+ public virtual void Serialize(Beamable.Serialization.JsonSerializable.IStreamSerializer s)
+ {
+ if ((s.HasKey("checksum")
+ || ((checksum != default(OptionalString))
+ && checksum.HasValue)))
+ {
+ s.Serialize("checksum", ref checksum.Value);
+ checksum.HasValue = true;
+ }
+ if ((s.HasKey("tag")
+ || ((tag != default(OptionalString))
+ && tag.HasValue)))
+ {
+ s.Serialize("tag", ref tag.Value);
+ tag.HasValue = true;
+ }
+ }
+ }
+ [System.SerializableAttribute()]
public partial class ServiceDependencyReference : Beamable.Serialization.JsonSerializable.ISerializable
{
public OptionalString id = new OptionalString();
@@ -25458,24 +25622,24 @@ public OptionalBundle(Bundle value)
}
}
[System.SerializableAttribute()]
- public class OptionalArrayOfBundle : Beamable.Common.Content.OptionalArray
+ public class OptionalArrayOfBundleSummary : Beamable.Common.Content.OptionalArray
{
- public OptionalArrayOfBundle()
+ public OptionalArrayOfBundleSummary()
{
}
- public OptionalArrayOfBundle(Bundle[] value)
+ public OptionalArrayOfBundleSummary(BundleSummary[] value)
{
HasValue = true;
Value = value;
}
}
[System.SerializableAttribute()]
- public class OptionalArrayOfBundleTag : Beamable.Common.Content.OptionalArray
+ public class OptionalArrayOfBundleRelease : Beamable.Common.Content.OptionalArray
{
- public OptionalArrayOfBundleTag()
+ public OptionalArrayOfBundleRelease()
{
}
- public OptionalArrayOfBundleTag(BundleTag[] value)
+ public OptionalArrayOfBundleRelease(BundleRelease[] value)
{
HasValue = true;
Value = value;
@@ -25530,14 +25694,26 @@ public OptionalArrayOfSchemaReference(SchemaReference[] value)
}
}
[System.SerializableAttribute()]
- public class OptionalMapOfBundlePeerDep : Beamable.Common.Content.Optional
+ public class OptionalMapOfBundleDepRange : Beamable.Common.Content.Optional
{
}
[System.SerializableAttribute()]
- public class MapOfBundlePeerDep : Beamable.Common.Content.SerializableDictionaryStringToSomething
+ public class MapOfBundleDepRange : Beamable.Common.Content.SerializableDictionaryStringToSomething
{
}
[System.SerializableAttribute()]
+ public class OptionalArrayOfBundleDep : Beamable.Common.Content.OptionalArray
+ {
+ public OptionalArrayOfBundleDep()
+ {
+ }
+ public OptionalArrayOfBundleDep(BundleDep[] value)
+ {
+ HasValue = true;
+ Value = value;
+ }
+ }
+ [System.SerializableAttribute()]
public class OptionalLogProvider : Beamable.Common.Content.Optional
{
public OptionalLogProvider()
@@ -25550,6 +25726,18 @@ public OptionalLogProvider(LogProvider value)
}
}
[System.SerializableAttribute()]
+ public class OptionalArrayOfBundleSummaryTag : Beamable.Common.Content.OptionalArray
+ {
+ public OptionalArrayOfBundleSummaryTag()
+ {
+ }
+ public OptionalArrayOfBundleSummaryTag(BundleSummaryTag[] value)
+ {
+ HasValue = true;
+ Value = value;
+ }
+ }
+ [System.SerializableAttribute()]
public class OptionalArrayOfServiceDependencyReference : Beamable.Common.Content.OptionalArray
{
public OptionalArrayOfServiceDependencyReference()
diff --git a/cli/cli/App.cs b/cli/cli/App.cs
index 023c44918e..8058a082a5 100644
--- a/cli/cli/App.cs
+++ b/cli/cli/App.cs
@@ -807,7 +807,7 @@ public virtual void Configure(
Commands.AddSubCommandWithHandler();
Commands.AddSubCommandWithHandler();
Commands.AddSubCommandWithHandler();
- Commands.AddSubCommandWithHandler();
+ Commands.AddSubCommandWithHandler();
Commands.AddSubCommandWithHandler();
Commands.AddSubCommandWithHandler();
Commands.AddSubCommandWithHandler();
diff --git a/cli/cli/Commands/BundleCommands/BundleAclCommand.cs b/cli/cli/Commands/BundleCommands/BundleAclCommand.cs
index 09d49d9ce7..4c6d6e0114 100644
--- a/cli/cli/Commands/BundleCommands/BundleAclCommand.cs
+++ b/cli/cli/Commands/BundleCommands/BundleAclCommand.cs
@@ -3,63 +3,52 @@
using Beamable.Server;
using cli.Services.Bundles;
using System.CommandLine;
-using System.Linq;
namespace cli.BundleCommands;
public class BundleAclCommandArgs : CommandArgs
{
- public string bundleRef;
+ public string bundleName;
public string scope;
}
public class BundleAclCommandOutput
{
public string name;
- public string checksum;
public string scope;
}
///
-/// Widen a bundle checksum's ACL. Admin-gated server-side.
-/// NOTE: the generated client (BeamBeamobundle.gs.cs) issues an HTTP GET with a request body
-/// to the /acl endpoint. If the backend expects PATCH this will fail at runtime — verify
-/// against the host/OpenAPI source before relying on it (likely a generator/spec mismatch to fix).
+/// Widen a bundle's ACL. Admin-gated server-side. Visibility belongs to the bundle name, so this
+/// covers every version ever published under it, including content published while it was private.
///
public class BundleAclCommand : AtomicCommand, ISkipManifest
{
- public BundleAclCommand() : base("acl", "Widen the ACL scope on a bundle checksum")
+ public BundleAclCommand() : base("acl", "Widen the ACL scope on a bundle")
{
}
public override void Configure()
{
- AddArgument(new Argument("bundle-ref", "The bundle reference: , @, or @sha256: (a name or tag resolves to its checksum; a bare name means @latest). Optionally namespaced as @/"),
- (args, i) => args.bundleRef = i);
- AddOption(new Option("--scope", "Visibility tier to widen to (each tier is a superset of the previous, not a list of realms): 'realm' = only this realm; 'org' = every realm in your customer; 'public' = every realm in every customer. A literal . / / * is also accepted"),
+ AddArgument(new Argument("bundle-name", "The bundle to widen, optionally namespaced as @/. Visibility applies to the whole name, so no tag or checksum is accepted"),
+ (args, i) => args.bundleName = i);
+ AddOption(new Option("--scope", "Visibility tier to widen to (each tier is a superset of the previous, not a list of realms): 'realm' = only this realm; 'org' = every realm in your customer; 'public' = every realm in every customer. '*' is also accepted as an alias for 'public'"),
(args, i) => args.scope = i);
}
public override async Task GetResult(BundleAclCommandArgs args)
{
var api = args.Provider.GetService();
- var (explicitNs, name, selector) = BundleRef.Split(args.bundleRef);
+ var (explicitNs, name, selector) = BundleRef.Split(args.bundleName);
+ if (!string.IsNullOrEmpty(selector))
+ throw new CliException($"Reference=[{args.bundleName}] must be a bundle name without a tag or checksum: an ACL applies to every version published under the name.");
+
var ns = await BundleNamespace.Resolve(args, explicitNs);
+ var scope = BundleAclScope.Resolve(args.scope, args.AppContext);
- var checksum = selector;
- if (string.IsNullOrEmpty(selector) || !selector.StartsWith("sha256:"))
- {
- // a bare name or a tag selector — resolve the tag to its checksum via the tag map.
- var tag = string.IsNullOrEmpty(selector) ? "latest" : selector;
- var response = await api.GetBundles(name, ns);
- var match = response.tags.ToTagInfos().FirstOrDefault(t => t.tag == tag);
- if (match == null)
- throw new CliException($"Bundle [{name}] has no tag [{tag}]. Use @sha256: for an exact checksum.");
- checksum = match.checksum;
- }
+ await api.PutBundlesAcl(name, ns, new UpdateBundleAclRequest { scope = scope });
+ Log.Information($"Bundle=[{BundleNamespace.Qualify(ns, name)}] is now visible to scope=[{scope}]. This applies to every version ever published under the name.");
- var scope = BundleAclScope.Resolve(args.scope, args.AppContext);
- await api.PutBundlesChecksumsAcl(name, checksum, ns, new UpdateBundleAclRequest { scope = scope });
- return new BundleAclCommandOutput { name = BundleNamespace.Qualify(ns, name), checksum = checksum, scope = scope };
+ return new BundleAclCommandOutput { name = BundleNamespace.Qualify(ns, name), scope = scope };
}
}
diff --git a/cli/cli/Commands/BundleCommands/BundleHistoryCommand.cs b/cli/cli/Commands/BundleCommands/BundleHistoryCommand.cs
deleted file mode 100644
index 46e6ba63ff..0000000000
--- a/cli/cli/Commands/BundleCommands/BundleHistoryCommand.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-using Beamable.Api.Autogenerated.Beamobundle;
-using Beamable.Api.Autogenerated.Models;
-using Beamable.Server;
-using cli.Services.Bundles;
-using Spectre.Console;
-using System;
-using System.CommandLine;
-using System.Linq;
-
-namespace cli.BundleCommands;
-
-public class BundleHistoryCommandArgs : CommandArgs
-{
- public string bundleName;
-}
-
-public class BundleHistoryCommandOutput
-{
- public BundleInfo[] history;
-}
-
-public class BundleHistoryCommand : AtomicCommand, ISkipManifest
-{
- public BundleHistoryCommand() : base("history", "Show the publish history for a bundle")
- {
- }
-
- public override void Configure()
- {
- AddArgument(new Argument("bundle-name", "The bundle name, optionally namespaced as @/"),
- (args, i) => args.bundleName = i);
- }
-
- public override async Task GetResult(BundleHistoryCommandArgs args)
- {
- var api = args.Provider.GetService();
- var (explicitNs, name) = BundleNamespace.SplitName(args.bundleName);
- BundleWorkspace.ValidateName(name);
- var ns = await BundleNamespace.Resolve(args, explicitNs);
- var response = await api.GetBundlesHistory(name, ns);
- return new BundleHistoryCommandOutput
- {
- history = (response.bundles ?? Array.Empty()).Select(BundleInfo.FromBundle).ToArray()
- };
- }
-
- protected override void LogResult(object result)
- {
- if (result is not BundleHistoryCommandOutput output)
- {
- base.LogResult(result);
- return;
- }
-
- var table = new Table();
- table.AddColumn("Published At");
- table.AddColumn("Checksum");
- table.AddColumn("ACL");
- table.AddColumn("Yanked");
-
- foreach (var bundle in output.history)
- {
- table.AddRow(
- Markup.Escape(BundleInfo.FormatPublishedAt(bundle.publishedAt)),
- Markup.Escape(bundle.checksum),
- Markup.Escape(bundle.acl),
- bundle.yanked ? "yes" : "no");
- }
-
- AnsiConsole.Write(table);
- }
-}
diff --git a/cli/cli/Commands/BundleCommands/BundleInfo.cs b/cli/cli/Commands/BundleCommands/BundleInfo.cs
index 8d7667195a..b74cd9e637 100644
--- a/cli/cli/Commands/BundleCommands/BundleInfo.cs
+++ b/cli/cli/Commands/BundleCommands/BundleInfo.cs
@@ -3,6 +3,7 @@
using System.Globalization;
using System.Linq;
using Beamable.Api.Autogenerated.Models;
+using cli.Services.Bundles;
namespace cli.BundleCommands;
@@ -25,7 +26,6 @@ public class BundleInfo
///
public string checksum = "";
- public string acl = "";
public bool yanked;
public long publishedAt;
@@ -35,24 +35,29 @@ public class BundleInfo
public string[] serviceNames = Array.Empty();
public string[] storageIds = Array.Empty();
public string[] portalExtensionNames = Array.Empty();
- public Dictionary peerDependencies = new Dictionary();
+
+ ///
+ /// Bundle name to the release range it is pinned to, rendered as "1+" for an open range or
+ /// "1-5" for a closed one.
+ ///
+ public Dictionary bundleDependencies = new Dictionary();
public static BundleInfo FromBundle(Bundle bundle)
{
if (bundle == null) return null;
- var peers = new Dictionary();
- var peerMap = bundle.peerDependencies.GetOrElse(new MapOfBundlePeerDep());
- foreach (var kvp in peerMap)
+ var deps = new Dictionary();
+ foreach (var dep in bundle.bundleDependencies.GetOrElse(Array.Empty()))
{
- peers[kvp.Key] = kvp.Value?.type.GetOrElse("");
+ if (dep == null) continue;
+ deps[dep.name.GetOrElse("")] = BundleDependencyConfig.FormatRange(
+ dep.min.GetOrElse(0), dep.max.HasValue ? dep.max.Value : null);
}
return new BundleInfo
{
name = bundle.name.GetOrElse(""),
checksum = bundle.checksum.GetOrElse(""),
- acl = bundle.acl.GetOrElse(""),
yanked = bundle.yanked.GetOrElse(false),
publishedAt = bundle.publishedAt.GetOrElse(0),
serviceNames = bundle.serviceReferences.GetOrElse(Array.Empty())
@@ -61,7 +66,7 @@ public static BundleInfo FromBundle(Bundle bundle)
.Select(s => s.id.GetOrElse("")).ToArray(),
portalExtensionNames = bundle.portalExtensionReferences.GetOrElse(Array.Empty())
.Select(p => (string)p.name).ToArray(),
- peerDependencies = peers,
+ bundleDependencies = deps,
};
}
diff --git a/cli/cli/Commands/BundleCommands/BundleReleaseInfo.cs b/cli/cli/Commands/BundleCommands/BundleReleaseInfo.cs
new file mode 100644
index 0000000000..7e729bc7ba
--- /dev/null
+++ b/cli/cli/Commands/BundleCommands/BundleReleaseInfo.cs
@@ -0,0 +1,37 @@
+using System;
+using Beamable.Api.Autogenerated.Models;
+
+namespace cli.BundleCommands;
+
+///
+/// CLI-owned projection of one entry in a bundle's release log. A release records a change of the
+/// name's current content, so a revert republishes an earlier checksum and the same checksum can
+/// appear at several versions — the version, not the checksum, identifies a release.
+///
+[Serializable]
+public class BundleReleaseInfo
+{
+ public long version;
+ public string checksum = "";
+
+ ///
+ /// Unix timestamp (seconds). The API sends a timestamp here rather than the epoch seconds
+ /// carries; it is converted so both render the same way.
+ ///
+ public long publishedAt;
+
+ public static BundleReleaseInfo FromRelease(BundleRelease release)
+ {
+ if (release == null) return null;
+
+ var published = release.publishedAt.GetOrElse(default(DateTime));
+ return new BundleReleaseInfo
+ {
+ version = release.version.GetOrElse(0),
+ checksum = release.checksum.GetOrElse(""),
+ publishedAt = published == default
+ ? 0
+ : new DateTimeOffset(published.ToUniversalTime(), TimeSpan.Zero).ToUnixTimeSeconds(),
+ };
+ }
+}
diff --git a/cli/cli/Commands/BundleCommands/BundleReleasesCommand.cs b/cli/cli/Commands/BundleCommands/BundleReleasesCommand.cs
new file mode 100644
index 0000000000..9dd2a6921f
--- /dev/null
+++ b/cli/cli/Commands/BundleCommands/BundleReleasesCommand.cs
@@ -0,0 +1,116 @@
+using Beamable.Api.Autogenerated.Beamobundle;
+using Beamable.Api.Autogenerated.Models;
+using Beamable.Common.BeamCli.Contracts;
+using Beamable.Server;
+using cli.Services.Bundles;
+using Spectre.Console;
+using System;
+using System.Collections.Generic;
+using System.CommandLine;
+using System.Linq;
+
+namespace cli.BundleCommands;
+
+public class BundleReleasesCommandArgs : CommandArgs
+{
+ public string bundleName;
+ public int limit;
+}
+
+public class BundleReleasesCommandOutput
+{
+ /// The bundle's releases, newest first.
+ public BundleReleaseInfo[] releases = Array.Empty();
+
+ /// The bundle's tags, including @latest. A tag points at a checksum, not a version.
+ public BundleTagInfo[] tags = Array.Empty();
+}
+
+///
+/// Show a bundle's release log. The endpoint is paged on an exclusive version cursor, so this
+/// walks it to the end rather than showing a first page as if it were the whole log.
+///
+public class BundleReleasesCommand
+ : AtomicCommand, ISkipManifest
+{
+ /// The endpoint's own maximum page size.
+ private const int PageSize = 200;
+
+ public BundleReleasesCommand() : base("releases", "Show the release log for a bundle")
+ {
+ }
+
+ public override void Configure()
+ {
+ AddArgument(new Argument("bundle-name", "The bundle name, optionally namespaced as @/"),
+ (args, i) => args.bundleName = i);
+ AddOption(new Option("--limit", () => 0, "Stop after this many releases, newest first. 0 (the default) walks the whole log"),
+ (args, i) => args.limit = i);
+ }
+
+ public override async Task GetResult(BundleReleasesCommandArgs args)
+ {
+ var api = args.Provider.GetService();
+ var (explicitNs, name) = BundleNamespace.SplitName(args.bundleName);
+ BundleWorkspace.ValidateName(name);
+ var ns = await BundleNamespace.Resolve(args, explicitNs);
+
+ var releases = new List();
+ var tags = Array.Empty();
+ long? fromVersion = null;
+
+ while (true)
+ {
+ var response = await api.GetBundlesReleases(name, ns, fromVersion, PageSize);
+ tags = response.tags.ToTagInfos();
+
+ var page = (response.releases ?? Array.Empty())
+ .Select(BundleReleaseInfo.FromRelease)
+ .ToArray();
+ releases.AddRange(page);
+
+ var reachedLimit = args.limit > 0 && releases.Count >= args.limit;
+ if (page.Length < PageSize || reachedLimit)
+ break;
+
+ fromVersion = page[^1].version;
+ }
+
+ if (args.limit > 0 && releases.Count > args.limit)
+ releases = releases.Take(args.limit).ToList();
+
+ return new BundleReleasesCommandOutput { releases = releases.ToArray(), tags = tags };
+ }
+
+ protected override void LogResult(object result)
+ {
+ if (result is not BundleReleasesCommandOutput output)
+ {
+ base.LogResult(result);
+ return;
+ }
+
+ // A tag points at a checksum, and a revert puts several versions on one checksum, so every
+ // version holding a tagged checksum shows the tag.
+ var tagsByChecksum = output.tags
+ .GroupBy(t => t.checksum)
+ .ToDictionary(g => g.Key, g => string.Join(", ", g.Select(t => t.tag)));
+
+ var table = new Table();
+ table.AddColumn("Version");
+ table.AddColumn("Published At");
+ table.AddColumn("Checksum");
+ table.AddColumn("Tags");
+
+ foreach (var release in output.releases)
+ {
+ table.AddRow(
+ Markup.Escape(release.version.ToString()),
+ Markup.Escape(BundleInfo.FormatPublishedAt(release.publishedAt)),
+ Markup.Escape(release.checksum),
+ Markup.Escape(tagsByChecksum.TryGetValue(release.checksum, out var t) ? t : "-"));
+ }
+
+ AnsiConsole.Write(table);
+ }
+}
diff --git a/cli/cli/Commands/BundleCommands/BundleSummaryInfo.cs b/cli/cli/Commands/BundleCommands/BundleSummaryInfo.cs
new file mode 100644
index 0000000000..a97442139d
--- /dev/null
+++ b/cli/cli/Commands/BundleCommands/BundleSummaryInfo.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Linq;
+using Beamable.Api.Autogenerated.Models;
+using Beamable.Common.BeamCli.Contracts;
+
+namespace cli.BundleCommands;
+
+///
+/// CLI-owned projection of a catalog for command output. A summary is
+/// everything that belongs to the bundle name rather than to one published version, so it
+/// carries the ACL and @latest but none of the component references — fetch a bundle by name or
+/// checksum for those.
+///
+[Serializable]
+public class BundleSummaryInfo
+{
+ public string name = "";
+
+ /// Visibility of the whole name: <cid>.<pid> for a realm, <cid> for an org, * for public.
+ public string acl = "";
+
+ /// Customer id that first published the name, and the only one that may widen it.
+ public string ownerCid = "";
+
+ public string latestChecksum = "";
+
+ /// Release version @latest currently points at.
+ public long latestVersion;
+
+ /// User tags only; @latest is .
+ public BundleTagInfo[] tags = Array.Empty();
+
+ /// Unix timestamp (seconds) of the last publish or tag move.
+ public long updatedAt;
+
+ public static BundleSummaryInfo FromSummary(BundleSummary summary)
+ {
+ if (summary == null) return null;
+
+ return new BundleSummaryInfo
+ {
+ name = summary.name.GetOrElse(""),
+ acl = summary.acl.GetOrElse(""),
+ ownerCid = summary.ownerCid.GetOrElse(""),
+ latestChecksum = summary.latestChecksum.GetOrElse(""),
+ latestVersion = summary.latestVersion.GetOrElse(0),
+ tags = summary.tags.ToTagInfos(),
+ updatedAt = summary.updatedAt.GetOrElse(0),
+ };
+ }
+
+ public string FormatTags() => tags.Length == 0 ? "-" : string.Join(", ", tags.Select(t => t.tag));
+}
diff --git a/cli/cli/Commands/BundleCommands/BundleTagInfoExtensions.cs b/cli/cli/Commands/BundleCommands/BundleTagInfoExtensions.cs
index 5a01c0f66b..f8406d90a3 100644
--- a/cli/cli/Commands/BundleCommands/BundleTagInfoExtensions.cs
+++ b/cli/cli/Commands/BundleCommands/BundleTagInfoExtensions.cs
@@ -2,31 +2,37 @@
using System.Linq;
using Beamable.Api.Autogenerated.Models;
using Beamable.Common.BeamCli.Contracts;
+using Beamable.Common.Content;
namespace cli.BundleCommands;
///
-/// Maps the generated API model onto the
-/// contract. The mapping lives in the CLI because the contract assembly copies (Unity/Unreal)
-/// don't ship the autogenerated API models.
+/// Maps a bundle's tags onto the contract. The mapping lives in the
+/// CLI because the contract assembly copies (Unity/Unreal) don't ship the autogenerated API
+/// models. The single-bundle endpoints return a tag-to-checksum map, the catalog list returns an
+/// array of user tags, so both shapes map here.
///
public static class BundleTagInfoExtensions
{
- public static BundleTagInfo ToTagInfo(this BundleTag tag)
+ public static BundleTagInfo[] ToTagInfos(this OptionalMapOfString tags)
{
- if (tag == null) return null;
- return new BundleTagInfo
- {
- bundleName = tag.bundleName.GetOrElse(""),
- checksum = tag.checksum.GetOrElse(""),
- tag = tag.tag.GetOrElse(""),
- updatedAt = tag.updatedAt.GetOrElse(0),
- };
+ var map = tags?.GetOrElse(new MapOfString()) ?? new MapOfString();
+ return map
+ .OrderBy(kvp => kvp.Key, StringComparer.Ordinal)
+ .Select(kvp => new BundleTagInfo { tag = kvp.Key, checksum = kvp.Value })
+ .ToArray();
}
- public static BundleTagInfo[] ToTagInfos(this OptionalArrayOfBundleTag tags)
+ public static BundleTagInfo[] ToTagInfos(this OptionalArrayOfBundleSummaryTag tags)
{
- var array = tags?.GetOrElse(Array.Empty()) ?? Array.Empty();
- return array.Select(t => t.ToTagInfo()).ToArray();
+ var array = tags?.GetOrElse(Array.Empty()) ?? Array.Empty();
+ return array
+ .Select(t => new BundleTagInfo
+ {
+ tag = t.tag.GetOrElse(""),
+ checksum = t.checksum.GetOrElse(""),
+ })
+ .OrderBy(t => t.tag, StringComparer.Ordinal)
+ .ToArray();
}
}
diff --git a/cli/cli/Commands/BundleCommands/GetBundleCommand.cs b/cli/cli/Commands/BundleCommands/GetBundleCommand.cs
index f56742ebf4..5e525d6cb9 100644
--- a/cli/cli/Commands/BundleCommands/GetBundleCommand.cs
+++ b/cli/cli/Commands/BundleCommands/GetBundleCommand.cs
@@ -17,6 +17,9 @@ public class GetBundleCommandOutput
{
public BundleInfo bundle;
public BundleTagInfo[] tags;
+
+ /// The release version this content was published as.
+ public long version;
}
public class GetBundleCommand : AtomicCommand, ISkipManifest
@@ -69,6 +72,9 @@ public override async Task GetResult(GetBundleCommandArg
}
}
- return new GetBundleCommandOutput { bundle = info, tags = response.tags.ToTagInfos() };
+ return new GetBundleCommandOutput
+ {
+ bundle = info, tags = response.tags.ToTagInfos(), version = response.version.GetOrElse(0)
+ };
}
}
diff --git a/cli/cli/Commands/BundleCommands/ListBundlesCommand.cs b/cli/cli/Commands/BundleCommands/ListBundlesCommand.cs
index f85a57053b..cf8fb67016 100644
--- a/cli/cli/Commands/BundleCommands/ListBundlesCommand.cs
+++ b/cli/cli/Commands/BundleCommands/ListBundlesCommand.cs
@@ -18,11 +18,12 @@ public class ListBundlesCommandArgs : CommandArgs
public class ListBundlesCommandOutput
{
/// Published bundles in the catalog that are visible to the current realm.
- public BundleInfo[] published = Array.Empty();
+ public BundleSummaryInfo[] published = Array.Empty();
///
- /// Bundles authored in this workspace (may not be published to the catalog yet). Same shape as
- /// ; catalog-only fields (checksum, acl, yanked, publishedAt) are empty.
+ /// Bundles authored in this workspace (may not be published to the catalog yet). A different
+ /// shape from : the catalog list is per-name, so it has no component
+ /// references, while a local bundle has nothing but them.
///
public BundleInfo[] local = Array.Empty();
}
@@ -53,16 +54,17 @@ public override async Task GetResult(ListBundlesComman
// Published catalog bundles. Tolerate a fetch failure (e.g. not logged in / no realm) so the
// local list is still returned.
- BundleInfo[] published;
+ BundleSummaryInfo[] published;
try
{
var response = await args.Provider.GetService().GetBundles();
- published = (response.bundles ?? Array.Empty()).Select(BundleInfo.FromBundle).ToArray();
+ published = (response.bundles ?? Array.Empty())
+ .Select(BundleSummaryInfo.FromSummary).ToArray();
}
catch (RequesterException e)
{
Log.Warning($"Could not fetch published bundles from the catalog (status={e.Status}); showing local bundles only.");
- published = Array.Empty();
+ published = Array.Empty();
}
return new ListBundlesCommandOutput { published = published, local = local };
@@ -78,18 +80,20 @@ protected override void LogResult(object result)
var published = new Table().Title("Published");
published.AddColumn("Name");
- published.AddColumn("Published At");
- published.AddColumn("Checksum");
+ published.AddColumn("Updated At");
+ published.AddColumn("Version");
+ published.AddColumn("Latest Checksum");
published.AddColumn("ACL");
- published.AddColumn("Yanked");
+ published.AddColumn("Tags");
foreach (var bundle in output.published)
{
published.AddRow(
Markup.Escape(bundle.name),
- Markup.Escape(BundleInfo.FormatPublishedAt(bundle.publishedAt)),
- Markup.Escape(bundle.checksum),
+ Markup.Escape(BundleInfo.FormatPublishedAt(bundle.updatedAt)),
+ Markup.Escape(bundle.latestVersion.ToString()),
+ Markup.Escape(bundle.latestChecksum),
Markup.Escape(bundle.acl),
- bundle.yanked ? "yes" : "no");
+ Markup.Escape(bundle.FormatTags()));
}
AnsiConsole.Write(published);
@@ -142,7 +146,8 @@ private static BundleInfo FromLocalBundle(BundleConfigFile bundle, BeamoLocalMan
serviceNames = services.ToArray(),
storageIds = storages.ToArray(),
portalExtensionNames = extensions.ToArray(),
- peerDependencies = bundle.peerDependencies.ToDictionary(kvp => kvp.Key, kvp => kvp.Value?.type ?? ""),
+ bundleDependencies = bundle.bundleDependencies.ToDictionary(
+ kvp => kvp.Key, kvp => kvp.Value?.Format() ?? ""),
};
}
}
diff --git a/cli/cli/Commands/BundleCommands/NewBundleCommand.cs b/cli/cli/Commands/BundleCommands/NewBundleCommand.cs
index 31eec8b56c..fef5b9e2cb 100644
--- a/cli/cli/Commands/BundleCommands/NewBundleCommand.cs
+++ b/cli/cli/Commands/BundleCommands/NewBundleCommand.cs
@@ -60,7 +60,7 @@ public override async Task GetResult(NewBundleCommandArg
var json = new JObject
{
["components"] = new JArray(args.components),
- ["peerDependencies"] = new JObject()
+ ["bundleDependencies"] = new JObject()
};
File.WriteAllText(fullPath, json.ToString(Formatting.Indented));
Log.Information($"Created bundle config [{fullName}] at [{fullPath}]");
diff --git a/cli/cli/Commands/BundleCommands/PublishBundleCommand.cs b/cli/cli/Commands/BundleCommands/PublishBundleCommand.cs
index 5e8cc11b95..20d22ffd56 100644
--- a/cli/cli/Commands/BundleCommands/PublishBundleCommand.cs
+++ b/cli/cli/Commands/BundleCommands/PublishBundleCommand.cs
@@ -49,6 +49,10 @@ public class PublishBundleCommandOutput
public string name;
public string checksum;
public bool isNew;
+
+ /// The release version this publish produced.
+ public long version;
+
public BundleDiffResult diff;
}
@@ -76,7 +80,7 @@ public override void Configure()
(args, i) => args.fromLastPlan = i);
AddOption(new Option(new[] { "--tag" }, "An additional tag to advance to the published checksum"),
(args, i) => args.tag = i);
- AddOption(new Option(new[] { "--scope" }, "Widen the published checksum's visibility tier (each tier is a superset of the previous, not a list of realms): 'realm' = only this realm; 'org' = every realm in your customer; 'public' = every realm in every customer. A literal . / / * is also accepted"),
+ AddOption(new Option(new[] { "--scope" }, "Widen the bundle's visibility tier (each tier is a superset of the previous, not a list of realms): 'realm' = only this realm; 'org' = every realm in your customer; 'public' = every realm in every customer. '*' is also accepted as an alias for 'public'"),
(args, i) => args.scope = i);
}
@@ -218,15 +222,21 @@ await DeployUtil.UploadPortalExtensionBinaries(plan, provider, null,
request.tag = args.tag;
}
- if (bundle.peerDependencies.Count > 0)
+ if (bundle.bundleDependencies.Count > 0)
{
- var map = new MapOfBundlePeerDep();
- foreach (var kvp in bundle.peerDependencies)
+ var map = new MapOfBundleDepRange();
+ foreach (var kvp in bundle.bundleDependencies)
{
- map[kvp.Key] = new BundlePeerDep { type = kvp.Value?.type };
+ var range = new BundleDepRange { min = kvp.Value?.min ?? 0 };
+ if (kvp.Value?.max != null)
+ {
+ range.max = new OptionalLong(kvp.Value.max.Value);
+ }
+
+ map[kvp.Key] = range;
}
- request.peerDependencies = new OptionalMapOfBundlePeerDep { HasValue = true, Value = map };
+ request.bundleDependencies = new OptionalMapOfBundleDepRange { HasValue = true, Value = map };
}
var response = await bundleApi.PostBundlesPublish(bundle.name, ns, request);
@@ -235,14 +245,16 @@ await DeployUtil.UploadPortalExtensionBinaries(plan, provider, null,
var publishedName = response.name.GetOrElse(fullName);
var publishedChecksum = response.checksum.GetOrElse("");
var isNew = response.isNew.GetOrElse(false);
- Log.Information($"Published bundle=[{publishedName}] checksum=[{publishedChecksum}] isNew=[{isNew}]");
+ var version = response.version.GetOrElse(0);
+ Log.Information($"Published bundle=[{publishedName}] version=[{version}] checksum=[{publishedChecksum}] isNew=[{isNew}]");
- // Optionally widen the freshly-published checksum's ACL (publish always defaults to .).
+ // Optionally widen the bundle's ACL (publish always defaults to .). Visibility
+ // belongs to the name, so this exposes every version ever published under it.
if (!string.IsNullOrEmpty(args.scope))
{
var scope = BundleAclScope.Resolve(args.scope, args.AppContext);
- await bundleApi.PutBundlesChecksumsAcl(bundle.name, publishedChecksum, ns, new UpdateBundleAclRequest { scope = scope });
- Log.Information($"Widened ACL for checksum=[{publishedChecksum}] to scope=[{scope}]");
+ await bundleApi.PutBundlesAcl(bundle.name, ns, new UpdateBundleAclRequest { scope = scope });
+ Log.Information($"Widened ACL for bundle=[{publishedName}] to scope=[{scope}]. This applies to every version ever published under the name.");
}
this.SendResults(new PublishBundleCommandOutput
@@ -250,6 +262,7 @@ await DeployUtil.UploadPortalExtensionBinaries(plan, provider, null,
name = publishedName,
checksum = publishedChecksum,
isNew = isNew,
+ version = version,
diff = diff,
});
}
diff --git a/cli/cli/Docs/SkillTemplates/beam-bundles.md.scriban b/cli/cli/Docs/SkillTemplates/beam-bundles.md.scriban
index b73fd0c6c7..249730d5fc 100644
--- a/cli/cli/Docs/SkillTemplates/beam-bundles.md.scriban
+++ b/cli/cli/Docs/SkillTemplates/beam-bundles.md.scriban
@@ -23,7 +23,7 @@ Bundles are **authored** in the workspace as `*.beam.bundle.json` files and **pu
- Publishing a bundle and diffing it against what is already published (`bundles plan` / `bundles publish`).
- Moving a tag, widening visibility (`bundles tag` / `bundles acl`).
- Pinning a specific bundle checksum into a realm's manifest (`bundles pin`), and cleaning up after a version is retired (`bundles yank` / `bundles prune-yanked`).
-- Inspecting the catalog: what exists, its history, and its tags (`bundles list` / `get` / `history` / `tags`).
+- Inspecting the catalog: what exists, its releases, and its tags (`bundles list` / `get` / `releases` / `tags`).
If you instead want to deploy your local services to a single realm, that is `deploy plan` / `deploy release`, not bundles.
@@ -54,10 +54,10 @@ The generated file looks like:
```json
{
"components": ["PaymentService", "OrdersStorage", "CheckoutPanel"],
- "peerDependencies": {}
+ "bundleDependencies": {}
}
```
-`components` are the beamoIds that belong to this bundle; `peerDependencies` declares bundles this one expects to be present at run time (surfaced, not resolved by the CLI). A beamoId may belong to **at most one** bundle in the workspace, and each bundle file name must be unique.
+`components` are the beamoIds that belong to this bundle; `bundleDependencies` maps a bundle name to the range of its releases this one depends on, as `{"@ns/name": {"min": 1, "max": 5}}` (omit `max` for an open range; surfaced, not resolved by the CLI). A beamoId may belong to **at most one** bundle in the workspace, and each bundle file name must be unique.
{{ if commands["bundles new"] }}{{ if (array.size commands["bundles new"].arguments) > 0 }}
#### `beam bundles new` arguments
| Argument | Type | Description |
@@ -97,7 +97,7 @@ beam_exec("bundles plan checkout-stack -q")
beam_exec("bundles publish checkout-stack --from-latest-plan -q")
```
Behavior worth knowing (the flags themselves are in the options table below):
-- Publishing always creates the checksum at the `realm` ACL tier; you can widen it in the same step or later with `bundles acl` (see *Tags & Visibility*).
+- A bundle name starts at the `realm` ACL tier; you can widen it in the same step or later with `bundles acl` (see *Tags & Visibility*).
- Advancing a tag alongside the publish also moves that tag to the freshly-published checksum (in addition to `latest`).
- If the diff is a no-op, publish reports "nothing to publish" and makes no change.
- A saved plan is only valid against the catalog state it was diffed from; if `latest` moved since planning, publish rejects it — re-run `bundles plan`.
@@ -147,20 +147,23 @@ beam_exec("bundles get checkout-stack -q")
{{ for opt in commands["bundles get"].options }}| `{{ opt.name }}` | {{ opt.type }} | {{ opt.description }} |
{{ end }}{{ end }}{{ end }}
-`bundles history` lists every published version of a bundle, newest first.
+`bundles releases` lists a bundle's release log, newest first. A release records a change of the
+name's current content, so an idle republish adds nothing while a revert to earlier content does add
+a release. That means one checksum can hold several versions, and the version identifies a release.
+The log is paged; the command walks it to the end unless you pass `--limit`.
```
-beam_exec("bundles history checkout-stack -q")
+beam_exec("bundles releases checkout-stack -q")
```
-{{ if commands["bundles history"] }}{{ if (array.size commands["bundles history"].arguments) > 0 }}
-#### `beam bundles history` arguments
+{{ if commands["bundles releases"] }}{{ if (array.size commands["bundles releases"].arguments) > 0 }}
+#### `beam bundles releases` arguments
| Argument | Type | Description |
|---|---|---|
-{{ for arg in commands["bundles history"].arguments }}| `{{ arg.name }}` | {{ arg.type }} | {{ arg.description }} |
-{{ end }}{{ end }}{{ if (array.size commands["bundles history"].options) > 0 }}
-#### `beam bundles history` options
+{{ for arg in commands["bundles releases"].arguments }}| `{{ arg.name }}` | {{ arg.type }} | {{ arg.description }} |
+{{ end }}{{ end }}{{ if (array.size commands["bundles releases"].options) > 0 }}
+#### `beam bundles releases` options
| Option | Type | Description |
|---|---|---|
-{{ for opt in commands["bundles history"].options }}| `{{ opt.name }}` | {{ opt.type }} | {{ opt.description }} |
+{{ for opt in commands["bundles releases"].options }}| `{{ opt.name }}` | {{ opt.type }} | {{ opt.description }} |
{{ end }}{{ end }}{{ end }}
`bundles tags` shows the tag → checksum map for a bundle.
@@ -179,7 +182,7 @@ beam_exec("bundles tags checkout-stack -q")
{{ for opt in commands["bundles tags"].options }}| `{{ opt.name }}` | {{ opt.type }} | {{ opt.description }} |
{{ end }}{{ end }}{{ end }}
-`get`, `history`, and `tags` all accept the `@/` form to read another customer's bundle.
+`get`, `releases`, and `tags` all accept the `@/` form to read another customer's bundle.
## Tags & Visibility
@@ -204,9 +207,12 @@ beam_exec("bundles tag checkout-stack@sha256:abc123… stable -q")
- `org` — every realm in your customer (``).
- `public` — every realm in every customer (`*`).
-`bundles acl` accepts a bare name or `@tag` (it resolves to the checksum) as well as an exact `@sha256:…`. Widening is **admin-gated server-side** — a non-admin token is rejected even though the CLI accepts the argument.
+`bundles acl` takes a bundle **name** — no tag or checksum. Visibility belongs to the name, so widening
+exposes every version ever published under it, including content published while it was private.
+Widening is **admin-gated server-side** — a non-admin token is rejected even though the CLI accepts
+the argument.
```
-beam_exec("bundles acl checkout-stack@sha256:abc123… --scope org -q")
+beam_exec("bundles acl checkout-stack --scope org -q")
```
{{ if commands["bundles acl"] }}{{ if (array.size commands["bundles acl"].arguments) > 0 }}
#### `beam bundles acl` arguments
@@ -294,7 +300,7 @@ The catalog API is the generated `IBeamBeamobundleApi` (`Beamable.Api.Autogenera
## Wrap-Up
After a bundle workflow, summarize for the user:
-1. **What was published** — the logical name `@/`, the resulting checksum, and whether it was new (`bundles get` / `history` to confirm).
+1. **What was published** — the logical name `@/`, the release version, the resulting checksum, and whether it was new (`bundles get` / `releases` to confirm).
2. **Which tags moved** — `latest` always, plus any tag you advanced (`bundles tags`).
3. **Who can see it** — the ACL scope (`realm`/`org`/`public`).
4. **What consumes it** — which realm(s) pin the checksum in `manifest.beam.json`, and whether any pins need pruning after a yank.
diff --git a/cli/cli/Services/Bundles/BundleWorkspace.cs b/cli/cli/Services/Bundles/BundleWorkspace.cs
index 0d21d5a206..27076d8615 100644
--- a/cli/cli/Services/Bundles/BundleWorkspace.cs
+++ b/cli/cli/Services/Bundles/BundleWorkspace.cs
@@ -9,7 +9,7 @@ namespace cli.Services.Bundles;
///
/// In-memory model of an authored bundle config file (<bundle-name>.beam.bundle.json).
-/// Declares one bundle: the beamoIds of its components and optional peer dependencies. The bundle's
+/// Declares one bundle: the beamoIds of its components and optional bundle dependencies. The bundle's
/// (short) name is the file name itself — it is not stored inside the file. The namespace is never
/// authored either; it is the customer's cid alias, derived at runtime (see ).
/// See DesignDocs/infra/beamo-manifest/beamo-manifest-redesign.md (Workspace organization).
@@ -20,15 +20,28 @@ public class BundleConfigFile
[JsonIgnore] public string name;
public List components = new List();
- public Dictionary peerDependencies = new Dictionary();
+
+ /// Bundle name to the range of its releases this bundle depends on.
+ public Dictionary bundleDependencies = new Dictionary();
/// Absolute path this config was loaded from (not serialized).
[JsonIgnore] public string filePath;
}
-public class BundlePeerDependencyConfig
+///
+/// An inclusive range of another bundle's release versions. A null means the
+/// range has no upper bound.
+///
+public class BundleDependencyConfig
{
- public string type;
+ public long min;
+ public long? max;
+
+ public string Format() => FormatRange(min, max);
+
+ /// "1+" for an open range, "1-5" for a closed one.
+ public static string FormatRange(long min, long? max) =>
+ max.HasValue ? $"{min}-{max.Value}" : $"{min}+";
}
///
@@ -88,15 +101,17 @@ public static List Discover(ConfigService configService)
filePath = file,
name = Path.GetFileName(file).Substring(0, Path.GetFileName(file).Length - BUNDLE_FILE_SUFFIX.Length),
components = (obj["components"] as JArray)?.Select(t => t.Value()).ToList() ?? new List(),
- peerDependencies = new Dictionary()
+ bundleDependencies = new Dictionary()
};
- if (obj["peerDependencies"] is JObject peers)
+ if (obj["bundleDependencies"] is JObject deps)
{
- foreach (var kvp in peers)
+ foreach (var kvp in deps)
{
- config.peerDependencies[kvp.Key] = new BundlePeerDependencyConfig
+ var range = kvp.Value as JObject;
+ config.bundleDependencies[kvp.Key] = new BundleDependencyConfig
{
- type = (kvp.Value as JObject)?.Value("type")
+ min = range?.Value("min") ?? 0,
+ max = range?.Value("max")
};
}
}
diff --git a/cli/cli/Services/SwaggerService.cs b/cli/cli/Services/SwaggerService.cs
index e25e0327f2..d843ecf82a 100644
--- a/cli/cli/Services/SwaggerService.cs
+++ b/cli/cli/Services/SwaggerService.cs
@@ -655,7 +655,7 @@ public static string FormatPathNameAsMethodName(string input)
string output = Regex.Replace(input, pattern, "");
// // Remove all non-alphanumeric characters and join the remaining parts of the string
- output = string.Join("", output.Split(new char[] { '/', '-' }).Select(part =>
+ output = string.Join("", Regex.Split(output, @"\W").Select(part =>
{
if (part.Length > 0) // Check if the length of the part is greater than zero
{
diff --git a/web/CHANGELOG.md b/web/CHANGELOG.md
index 69ede44fbd..0c8feba4b4 100644
--- a/web/CHANGELOG.md
+++ b/web/CHANGELOG.md
@@ -60,6 +60,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
+- Bundle catalog APIs follow the reworked backend contract: `beamoGetBundlesHistory` is now
+ `beamoGetBundlesReleases` (a paged release log) and `beamoPutBundlesChecksumsAcl` is now
+ `beamoPutBundlesAcl`, since a bundle's visibility belongs to its name rather than to one
+ published checksum.
+- `beamoGetBundles` returns `BundleSummary[]` without the component arrays, bundle tags are a
+ tag-to-checksum map, and `peerDependencies` is now `bundleDependencies`.
- `Beam.init()` now skips the realtime connection when `realtime.enabled` is `false` instead of always connecting.
- `getUserDeviceAndPlatform()` now detects React Native (`navigator.product === 'ReactNative'`) and
reports `{ deviceType: 'Mobile', platform: 'React Native' }` instead of falling through to the
diff --git a/web/src/__generated__/apis/AnalyticsApi.ts b/web/src/__generated__/apis/AnalyticsApi.ts
index 1577410a4e..2435b37fbc 100644
--- a/web/src/__generated__/apis/AnalyticsApi.ts
+++ b/web/src/__generated__/apis/AnalyticsApi.ts
@@ -3,13 +3,86 @@
* All manual edits will be lost when this file is regenerated.
*/
+import { endpointEncoder } from '@/utils/endpointEncoder';
+import { eventPlaceholder } from '@/__generated__/apis/constants';
+import { GET } from '@/constants';
import { makeApiRequest } from '@/utils/makeApiRequest';
import { POST } from '@/constants';
+import type { AnalyticsObservedEventsResponse } from '@/__generated__/schemas/AnalyticsObservedEventsResponse';
import type { AnalyticsQueryRequest } from '@/__generated__/schemas/AnalyticsQueryRequest';
+import type { AnalyticsSchemaListResponse } from '@/__generated__/schemas/AnalyticsSchemaListResponse';
+import type { AnalyticsSchemaResponse } from '@/__generated__/schemas/AnalyticsSchemaResponse';
import type { ApiAnalyticsQueryPostAnalyticsResponse } from '@/__generated__/schemas/ApiAnalyticsQueryPostAnalyticsResponse';
import type { HttpRequester } from '@/network/http/types/HttpRequester';
import type { HttpResponse } from '@/network/http/types/HttpResponse';
+/**
+ * @remarks
+ * **Authentication:**
+ * This method requires a valid bearer token in the `Authorization` header.
+ *
+ * @param requester - The `HttpRequester` type to use for the API request.
+ * @param gamertag - Override the playerId of the requester. This is only necessary when not using a JWT bearer token.
+ *
+ */
+export async function analyticsGetEvents(requester: HttpRequester, gamertag?: string): Promise> {
+ let endpoint = "/api/analytics/events";
+
+ // Make the API request
+ return makeApiRequest({
+ r: requester,
+ e: endpoint,
+ m: GET,
+ g: gamertag,
+ w: true
+ });
+}
+
+/**
+ * @remarks
+ * **Authentication:**
+ * This method requires a valid bearer token in the `Authorization` header.
+ *
+ * @param requester - The `HttpRequester` type to use for the API request.
+ * @param gamertag - Override the playerId of the requester. This is only necessary when not using a JWT bearer token.
+ *
+ */
+export async function analyticsGetSchemas(requester: HttpRequester, gamertag?: string): Promise> {
+ let endpoint = "/api/analytics/schemas";
+
+ // Make the API request
+ return makeApiRequest({
+ r: requester,
+ e: endpoint,
+ m: GET,
+ g: gamertag,
+ w: true
+ });
+}
+
+/**
+ * @remarks
+ * **Authentication:**
+ * This method requires a valid bearer token in the `Authorization` header.
+ *
+ * @param requester - The `HttpRequester` type to use for the API request.
+ * @param event - The `event` parameter to include in the API request.
+ * @param gamertag - Override the playerId of the requester. This is only necessary when not using a JWT bearer token.
+ *
+ */
+export async function analyticsGetSchemasByEvent(requester: HttpRequester, event: string, gamertag?: string): Promise> {
+ let endpoint = "/api/analytics/schemas/{event}".replace(eventPlaceholder, endpointEncoder(event));
+
+ // Make the API request
+ return makeApiRequest({
+ r: requester,
+ e: endpoint,
+ m: GET,
+ g: gamertag,
+ w: true
+ });
+}
+
/**
* @remarks
* **Authentication:**
diff --git a/web/src/__generated__/apis/BeamoBundleApi.ts b/web/src/__generated__/apis/BeamoBundleApi.ts
index 1df11f9696..15336a1677 100644
--- a/web/src/__generated__/apis/BeamoBundleApi.ts
+++ b/web/src/__generated__/apis/BeamoBundleApi.ts
@@ -12,11 +12,12 @@ import { nsPlaceholder } from '@/__generated__/apis/constants';
import { POST } from '@/constants';
import { PUT } from '@/constants';
import { tagPlaceholder } from '@/__generated__/apis/constants';
-import type { ApiBeamoBundlesChecksumsAclPutBeamoBundleResponse } from '@/__generated__/schemas/ApiBeamoBundlesChecksumsAclPutBeamoBundleResponse';
+import type { ApiBeamoBundlesAclPutBeamoBundleResponse } from '@/__generated__/schemas/ApiBeamoBundlesAclPutBeamoBundleResponse';
import type { ApiBeamoBundlesTagsPostBeamoBundleResponse } from '@/__generated__/schemas/ApiBeamoBundlesTagsPostBeamoBundleResponse';
import type { GetBundleResponse } from '@/__generated__/schemas/GetBundleResponse';
import type { HttpRequester } from '@/network/http/types/HttpRequester';
import type { HttpResponse } from '@/network/http/types/HttpResponse';
+import type { ListBundleReleasesResponse } from '@/__generated__/schemas/ListBundleReleasesResponse';
import type { ListBundlesResponse } from '@/__generated__/schemas/ListBundlesResponse';
import type { PromoteBundleTagRequest } from '@/__generated__/schemas/PromoteBundleTagRequest';
import type { PublishBundleRequest } from '@/__generated__/schemas/PublishBundleRequest';
@@ -78,17 +79,23 @@ export async function beamoGetBundlesByBundleNameAndNs(requester: HttpRequester,
* @param requester - The `HttpRequester` type to use for the API request.
* @param bundleName - The `bundleName` parameter to include in the API request.
* @param ns - The `ns` parameter to include in the API request.
+ * @param fromVersion - The `fromVersion` parameter to include in the API request.
+ * @param limit - The `limit` parameter to include in the API request.
* @param gamertag - Override the playerId of the requester. This is only necessary when not using a JWT bearer token.
*
*/
-export async function beamoGetBundlesHistory(requester: HttpRequester, bundleName: string, ns: string, gamertag?: string): Promise> {
- let endpoint = "/api/beamo/bundles/{ns}/{bundleName}/history".replace(bundleNamePlaceholder, endpointEncoder(bundleName)).replace(nsPlaceholder, endpointEncoder(ns));
+export async function beamoGetBundlesReleases(requester: HttpRequester, bundleName: string, ns: string, fromVersion?: bigint | string, limit?: number, gamertag?: string): Promise> {
+ let endpoint = "/api/beamo/bundles/{ns}/{bundleName}/releases".replace(bundleNamePlaceholder, endpointEncoder(bundleName)).replace(nsPlaceholder, endpointEncoder(ns));
// Make the API request
- return makeApiRequest({
+ return makeApiRequest({
r: requester,
e: endpoint,
m: GET,
+ q: {
+ fromVersion,
+ limit
+ },
g: gamertag,
w: true
});
@@ -205,16 +212,15 @@ export async function beamoPostBundlesChecksumsYank(requester: HttpRequester, bu
* @param requester - The `HttpRequester` type to use for the API request.
* @param payload - The `UpdateBundleAclRequest` instance to use for the API request
* @param bundleName - The `bundleName` parameter to include in the API request.
- * @param checksum - The `checksum` parameter to include in the API request.
* @param ns - The `ns` parameter to include in the API request.
* @param gamertag - Override the playerId of the requester. This is only necessary when not using a JWT bearer token.
*
*/
-export async function beamoPutBundlesChecksumsAcl(requester: HttpRequester, bundleName: string, checksum: string, ns: string, payload: UpdateBundleAclRequest, gamertag?: string): Promise> {
- let endpoint = "/api/beamo/bundles/{ns}/{bundleName}/checksums/{checksum}/acl".replace(bundleNamePlaceholder, endpointEncoder(bundleName)).replace(checksumPlaceholder, endpointEncoder(checksum)).replace(nsPlaceholder, endpointEncoder(ns));
+export async function beamoPutBundlesAcl(requester: HttpRequester, bundleName: string, ns: string, payload: UpdateBundleAclRequest, gamertag?: string): Promise> {
+ let endpoint = "/api/beamo/bundles/{ns}/{bundleName}/acl".replace(bundleNamePlaceholder, endpointEncoder(bundleName)).replace(nsPlaceholder, endpointEncoder(ns));
// Make the API request
- return makeApiRequest({
+ return makeApiRequest({
r: requester,
e: endpoint,
m: PUT,
diff --git a/web/src/__generated__/apis/BeamoOtelApi.ts b/web/src/__generated__/apis/BeamoOtelApi.ts
index 182ccc18e9..3c24928ad8 100644
--- a/web/src/__generated__/apis/BeamoOtelApi.ts
+++ b/web/src/__generated__/apis/BeamoOtelApi.ts
@@ -24,11 +24,11 @@ import type { UpdateOtelViewRequest } from '@/__generated__/schemas/UpdateOtelVi
* This method requires a valid bearer token in the `Authorization` header.
*
* @param requester - The `HttpRequester` type to use for the API request.
- * @param playerId - Player ID to retrieve views for.
+ * @param accountId - Account ID to retrieve views for.
* @param gamertag - Override the playerId of the requester. This is only necessary when not using a JWT bearer token.
*
*/
-export async function beamoGetOtelViews(requester: HttpRequester, playerId?: string, gamertag?: string): Promise> {
+export async function beamoGetOtelViews(requester: HttpRequester, accountId?: string, gamertag?: string): Promise> {
let endpoint = "/api/beamo/otel/views";
// Make the API request
@@ -37,7 +37,7 @@ export async function beamoGetOtelViews(requester: HttpRequester, playerId?: str
e: endpoint,
m: GET,
q: {
- playerId
+ accountId
},
g: gamertag,
w: true
diff --git a/web/src/__generated__/apis/CampaignApi.ts b/web/src/__generated__/apis/CampaignApi.ts
index c179b58b2e..581c0c6958 100644
--- a/web/src/__generated__/apis/CampaignApi.ts
+++ b/web/src/__generated__/apis/CampaignApi.ts
@@ -13,11 +13,12 @@ import { versionPlaceholder } from '@/__generated__/apis/constants';
import type { ApiCampaignsArchivePostCampaignResponse } from '@/__generated__/schemas/ApiCampaignsArchivePostCampaignResponse';
import type { ApiCampaignsDeactivatePostCampaignResponse } from '@/__generated__/schemas/ApiCampaignsDeactivatePostCampaignResponse';
import type { ApiCampaignsDeleteCampaignResponse } from '@/__generated__/schemas/ApiCampaignsDeleteCampaignResponse';
-import type { ApiCampaignsGetCampaignResponse } from '@/__generated__/schemas/ApiCampaignsGetCampaignResponse';
import type { ApiCampaignsReactivatePostCampaignResponse } from '@/__generated__/schemas/ApiCampaignsReactivatePostCampaignResponse';
import type { CampaignFunnelDto } from '@/__generated__/schemas/CampaignFunnelDto';
import type { CampaignGraphDto } from '@/__generated__/schemas/CampaignGraphDto';
+import type { CampaignLifecycle } from '@/__generated__/schemas/enums/CampaignLifecycle';
import type { CampaignStatusDto } from '@/__generated__/schemas/CampaignStatusDto';
+import type { CampaignSummaryDtoCampaignPageDto } from '@/__generated__/schemas/CampaignSummaryDtoCampaignPageDto';
import type { DeactivateRequestDto } from '@/__generated__/schemas/DeactivateRequestDto';
import type { HttpRequester } from '@/network/http/types/HttpRequester';
import type { HttpResponse } from '@/network/http/types/HttpResponse';
@@ -79,17 +80,49 @@ export async function campaignsPostPublish(requester: HttpRequester, payload: Pu
* This method requires a valid bearer token in the `Authorization` header.
*
* @param requester - The `HttpRequester` type to use for the API request.
+ * @param campaignId - The `campaignId` parameter to include in the API request.
+ * @param createdAfter - The `createdAfter` parameter to include in the API request.
+ * @param createdBefore - The `createdBefore` parameter to include in the API request.
+ * @param createdBy - The `createdBy` parameter to include in the API request.
+ * @param descending - The `descending` parameter to include in the API request.
+ * @param limit - The `limit` parameter to include in the API request.
+ * @param name - The `name` parameter to include in the API request.
+ * @param phase - The `phase` parameter to include in the API request.
+ * @param publishedAfter - The `publishedAfter` parameter to include in the API request.
+ * @param publishedBefore - The `publishedBefore` parameter to include in the API request.
+ * @param publishedBy - The `publishedBy` parameter to include in the API request.
+ * @param realm - The `realm` parameter to include in the API request.
+ * @param skip - The `skip` parameter to include in the API request.
+ * @param sort - The `sort` parameter to include in the API request.
+ * @param tag - The `tag` parameter to include in the API request.
* @param gamertag - Override the playerId of the requester. This is only necessary when not using a JWT bearer token.
*
*/
-export async function campaignsGet(requester: HttpRequester, gamertag?: string): Promise> {
+export async function campaignsGet(requester: HttpRequester, campaignId?: string, createdAfter?: Date, createdBefore?: Date, createdBy?: string, descending?: boolean, limit?: number, name?: string, phase?: CampaignLifecycle[], publishedAfter?: Date, publishedBefore?: Date, publishedBy?: string, realm?: string, skip?: number, sort?: unknown, tag?: string, gamertag?: string): Promise> {
let endpoint = "/api/campaigns";
// Make the API request
- return makeApiRequest({
+ return makeApiRequest({
r: requester,
e: endpoint,
m: GET,
+ q: {
+ campaignId,
+ createdAfter,
+ createdBefore,
+ createdBy,
+ descending,
+ limit,
+ name,
+ phase,
+ publishedAfter,
+ publishedBefore,
+ publishedBy,
+ realm,
+ skip,
+ sort,
+ tag
+ },
g: gamertag,
w: true
});
diff --git a/web/src/__generated__/apis/MessageRailApi.ts b/web/src/__generated__/apis/MessageRailApi.ts
index fa20a9b247..4390ce8f84 100644
--- a/web/src/__generated__/apis/MessageRailApi.ts
+++ b/web/src/__generated__/apis/MessageRailApi.ts
@@ -3,9 +3,12 @@
* All manual edits will be lost when this file is regenerated.
*/
+import { endpointEncoder } from '@/utils/endpointEncoder';
import { GET } from '@/constants';
import { makeApiRequest } from '@/utils/makeApiRequest';
import { POST } from '@/constants';
+import { tokenPlaceholder } from '@/__generated__/apis/constants';
+import type { ApiMessageRailOpenGifGetMessageRailResponse } from '@/__generated__/schemas/ApiMessageRailOpenGifGetMessageRailResponse';
import type { GetStagingStateResponse } from '@/__generated__/schemas/GetStagingStateResponse';
import type { HttpRequester } from '@/network/http/types/HttpRequester';
import type { HttpResponse } from '@/network/http/types/HttpResponse';
@@ -39,6 +42,29 @@ export async function messageRailPostMessages(requester: HttpRequester, payload:
});
}
+/**
+ * @remarks
+ * **Authentication:**
+ * This method requires a valid bearer token in the `Authorization` header.
+ *
+ * @param requester - The `HttpRequester` type to use for the API request.
+ * @param token - The `token` parameter to include in the API request.
+ * @param gamertag - Override the playerId of the requester. This is only necessary when not using a JWT bearer token.
+ *
+ */
+export async function messageRailGetOpenTokenGif(requester: HttpRequester, token: string, gamertag?: string): Promise> {
+ let endpoint = "/api/message-rail/open/{token}.gif".replace(tokenPlaceholder, endpointEncoder(token));
+
+ // Make the API request
+ return makeApiRequest({
+ r: requester,
+ e: endpoint,
+ m: GET,
+ g: gamertag,
+ w: true
+ });
+}
+
/**
* @remarks
* **Authentication:**
diff --git a/web/src/__generated__/apis/SegmentsApi.ts b/web/src/__generated__/apis/SegmentsApi.ts
index 6f27d5b0df..4c8fcd6bc2 100644
--- a/web/src/__generated__/apis/SegmentsApi.ts
+++ b/web/src/__generated__/apis/SegmentsApi.ts
@@ -282,10 +282,15 @@ export async function customersPostRealmsSegmentsPropertiesRecompute(requester:
* @param requester - The `HttpRequester` type to use for the API request.
* @param customerId - The `customerId` parameter to include in the API request.
* @param realmId - The `realmId` parameter to include in the API request.
+ * @param custom - The `custom` parameter to include in the API request.
+ * @param domain - The `domain` parameter to include in the API request.
+ * @param namespace - The `namespace` parameter to include in the API request.
+ * @param refresh - The `refresh` parameter to include in the API request.
+ * @param visibility - The `visibility` parameter to include in the API request.
* @param gamertag - Override the playerId of the requester. This is only necessary when not using a JWT bearer token.
*
*/
-export async function customersGetRealmsSegmentsAttributes(requester: HttpRequester, customerId: string, realmId: string, gamertag?: string): Promise> {
+export async function customersGetRealmsSegmentsAttributes(requester: HttpRequester, customerId: string, realmId: string, custom?: boolean, domain?: string, namespace?: string[], refresh?: boolean, visibility?: string, gamertag?: string): Promise> {
let endpoint = "/api/customers/{customerId}/realms/{realmId}/segments/attributes".replace(customerIdPlaceholder, endpointEncoder(customerId)).replace(realmIdPlaceholder, endpointEncoder(realmId));
// Make the API request
@@ -293,6 +298,13 @@ export async function customersGetRealmsSegmentsAttributes(requester: HttpReques
r: requester,
e: endpoint,
m: GET,
+ q: {
+ custom,
+ domain,
+ namespace,
+ refresh,
+ visibility
+ },
g: gamertag,
w: true
});
diff --git a/web/src/__generated__/apis/constants.ts b/web/src/__generated__/apis/constants.ts
index 0d55572566..717662666d 100644
--- a/web/src/__generated__/apis/constants.ts
+++ b/web/src/__generated__/apis/constants.ts
@@ -3,6 +3,8 @@
* All manual edits will be lost when this file is regenerated.
*/
+export const eventPlaceholder = "{event}";
+
export const tokenIdPlaceholder = "{tokenId}";
export const manifestIdPlaceholder = "{manifestId}";
@@ -29,6 +31,10 @@ export const viewIdPlaceholder = "{viewId}";
export const pullRequestIdPlaceholder = "{pullRequestId}";
+export const campaignIdPlaceholder = "{campaignId}";
+
+export const versionPlaceholder = "{version}";
+
export const gameIdPlaceholder = "{gameId}";
export const aliasPlaceholder = "{alias}";
@@ -43,6 +49,8 @@ export const keyPlaceholder = "{key}";
export const idPlaceholder = "{id}";
+export const tokenPlaceholder = "{token}";
+
export const jobIdPlaceholder = "{jobId}";
export const itemTypePlaceholder = "{itemType}";
@@ -52,7 +60,3 @@ export const zoneIdPlaceholder = "{zoneId}";
export const accountIdPlaceholder = "{accountId}";
export const objectIdPlaceholder = "{objectId}";
-
-export const campaignIdPlaceholder = "{campaignId}";
-
-export const versionPlaceholder = "{version}";
diff --git a/web/src/__generated__/schemas/AnalyticsObservedEvent.ts b/web/src/__generated__/schemas/AnalyticsObservedEvent.ts
new file mode 100644
index 0000000000..d75f91edc6
--- /dev/null
+++ b/web/src/__generated__/schemas/AnalyticsObservedEvent.ts
@@ -0,0 +1,10 @@
+/**
+ * ⚠️ THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY.
+ * All manual edits will be lost when this file is regenerated.
+ */
+
+export type AnalyticsObservedEvent = {
+ event?: string;
+ keys?: string[];
+ lastSeen?: Date;
+};
diff --git a/web/src/__generated__/schemas/AnalyticsObservedEventsResponse.ts b/web/src/__generated__/schemas/AnalyticsObservedEventsResponse.ts
new file mode 100644
index 0000000000..38177ae173
--- /dev/null
+++ b/web/src/__generated__/schemas/AnalyticsObservedEventsResponse.ts
@@ -0,0 +1,10 @@
+/**
+ * ⚠️ THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY.
+ * All manual edits will be lost when this file is regenerated.
+ */
+
+import type { AnalyticsObservedEvent } from './AnalyticsObservedEvent';
+
+export type AnalyticsObservedEventsResponse = {
+ events?: AnalyticsObservedEvent[];
+};
diff --git a/web/src/__generated__/schemas/ApiBeamoBundlesChecksumsAclPutBeamoBundleResponse.ts b/web/src/__generated__/schemas/AnalyticsSchemaListResponse.ts
similarity index 67%
rename from web/src/__generated__/schemas/ApiBeamoBundlesChecksumsAclPutBeamoBundleResponse.ts
rename to web/src/__generated__/schemas/AnalyticsSchemaListResponse.ts
index 9738574808..1354f32219 100644
--- a/web/src/__generated__/schemas/ApiBeamoBundlesChecksumsAclPutBeamoBundleResponse.ts
+++ b/web/src/__generated__/schemas/AnalyticsSchemaListResponse.ts
@@ -3,5 +3,6 @@
* All manual edits will be lost when this file is regenerated.
*/
-export type ApiBeamoBundlesChecksumsAclPutBeamoBundleResponse = {
+export type AnalyticsSchemaListResponse = {
+ events?: string[];
};
diff --git a/web/src/__generated__/schemas/AnalyticsSchemaProperty.ts b/web/src/__generated__/schemas/AnalyticsSchemaProperty.ts
new file mode 100644
index 0000000000..74eec486f7
--- /dev/null
+++ b/web/src/__generated__/schemas/AnalyticsSchemaProperty.ts
@@ -0,0 +1,11 @@
+/**
+ * ⚠️ THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY.
+ * All manual edits will be lost when this file is regenerated.
+ */
+
+export type AnalyticsSchemaProperty = {
+ enum?: string[] | null;
+ name?: string;
+ required?: boolean;
+ type?: string;
+};
diff --git a/web/src/__generated__/schemas/AnalyticsSchemaResponse.ts b/web/src/__generated__/schemas/AnalyticsSchemaResponse.ts
new file mode 100644
index 0000000000..6ceaad2915
--- /dev/null
+++ b/web/src/__generated__/schemas/AnalyticsSchemaResponse.ts
@@ -0,0 +1,11 @@
+/**
+ * ⚠️ THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY.
+ * All manual edits will be lost when this file is regenerated.
+ */
+
+import type { AnalyticsSchemaProperty } from './AnalyticsSchemaProperty';
+
+export type AnalyticsSchemaResponse = {
+ event?: string;
+ properties?: AnalyticsSchemaProperty[];
+};
diff --git a/web/src/__generated__/schemas/BundlePeerDep.ts b/web/src/__generated__/schemas/ApiBeamoBundlesAclPutBeamoBundleResponse.ts
similarity index 70%
rename from web/src/__generated__/schemas/BundlePeerDep.ts
rename to web/src/__generated__/schemas/ApiBeamoBundlesAclPutBeamoBundleResponse.ts
index 602fc947ae..ac7701d6a7 100644
--- a/web/src/__generated__/schemas/BundlePeerDep.ts
+++ b/web/src/__generated__/schemas/ApiBeamoBundlesAclPutBeamoBundleResponse.ts
@@ -3,6 +3,5 @@
* All manual edits will be lost when this file is regenerated.
*/
-export type BundlePeerDep = {
- type?: string;
+export type ApiBeamoBundlesAclPutBeamoBundleResponse = {
};
diff --git a/web/src/__generated__/schemas/ObjectId.ts b/web/src/__generated__/schemas/ApiMessageRailOpenGifGetMessageRailResponse.ts
similarity index 65%
rename from web/src/__generated__/schemas/ObjectId.ts
rename to web/src/__generated__/schemas/ApiMessageRailOpenGifGetMessageRailResponse.ts
index 15975b0c66..9d3220cef0 100644
--- a/web/src/__generated__/schemas/ObjectId.ts
+++ b/web/src/__generated__/schemas/ApiMessageRailOpenGifGetMessageRailResponse.ts
@@ -3,7 +3,5 @@
* All manual edits will be lost when this file is regenerated.
*/
-export type ObjectId = {
- creationTime?: Date;
- timestamp?: number;
+export type ApiMessageRailOpenGifGetMessageRailResponse = {
};
diff --git a/web/src/__generated__/schemas/AuthorDto.ts b/web/src/__generated__/schemas/AuthorDto.ts
new file mode 100644
index 0000000000..ff37879523
--- /dev/null
+++ b/web/src/__generated__/schemas/AuthorDto.ts
@@ -0,0 +1,12 @@
+/**
+ * ⚠️ THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY.
+ * All manual edits will be lost when this file is regenerated.
+ */
+
+import type { AuthorKind } from './enums/AuthorKind';
+
+export type AuthorDto = {
+ accountId?: string;
+ email?: string | null;
+ kind?: AuthorKind;
+};
diff --git a/web/src/__generated__/schemas/Bundle.ts b/web/src/__generated__/schemas/Bundle.ts
index 11d22222b5..50da60a04d 100644
--- a/web/src/__generated__/schemas/Bundle.ts
+++ b/web/src/__generated__/schemas/Bundle.ts
@@ -3,17 +3,16 @@
* All manual edits will be lost when this file is regenerated.
*/
-import type { BundlePeerDep } from './BundlePeerDep';
+import type { BundleDep } from './BundleDep';
import type { PortalExtensionReference } from './PortalExtensionReference';
import type { SchemaReference } from './SchemaReference';
import type { ServiceReference } from './ServiceReference';
import type { ServiceStorageReference } from './ServiceStorageReference';
export type Bundle = {
- acl?: string;
+ bundleDependencies?: BundleDep[];
checksum?: string;
name?: string;
- peerDependencies?: Record;
portalExtensionReferences?: PortalExtensionReference[];
publishedAt?: bigint | string;
publisherFullScope?: string | null;
diff --git a/web/src/__generated__/schemas/BundleDep.ts b/web/src/__generated__/schemas/BundleDep.ts
new file mode 100644
index 0000000000..b87ba89950
--- /dev/null
+++ b/web/src/__generated__/schemas/BundleDep.ts
@@ -0,0 +1,11 @@
+/**
+ * ⚠️ THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY.
+ * All manual edits will be lost when this file is regenerated.
+ */
+
+export type BundleDep = {
+ checksum?: string;
+ max?: bigint | string | null;
+ min?: bigint | string;
+ name?: string;
+};
diff --git a/web/src/__generated__/schemas/BundleDepRange.ts b/web/src/__generated__/schemas/BundleDepRange.ts
new file mode 100644
index 0000000000..4736c96c4f
--- /dev/null
+++ b/web/src/__generated__/schemas/BundleDepRange.ts
@@ -0,0 +1,9 @@
+/**
+ * ⚠️ THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY.
+ * All manual edits will be lost when this file is regenerated.
+ */
+
+export type BundleDepRange = {
+ max?: bigint | string | null;
+ min?: bigint | string;
+};
diff --git a/web/src/__generated__/schemas/BundleTag.ts b/web/src/__generated__/schemas/BundleRelease.ts
similarity index 68%
rename from web/src/__generated__/schemas/BundleTag.ts
rename to web/src/__generated__/schemas/BundleRelease.ts
index c7d6d4b2f8..8502d838aa 100644
--- a/web/src/__generated__/schemas/BundleTag.ts
+++ b/web/src/__generated__/schemas/BundleRelease.ts
@@ -3,9 +3,9 @@
* All manual edits will be lost when this file is regenerated.
*/
-export type BundleTag = {
+export type BundleRelease = {
bundleName?: string;
checksum?: string;
- tag?: string;
- updatedAt?: bigint | string;
+ publishedAt?: Date;
+ version?: bigint | string;
};
diff --git a/web/src/__generated__/schemas/BundleSummary.ts b/web/src/__generated__/schemas/BundleSummary.ts
new file mode 100644
index 0000000000..5db84a1631
--- /dev/null
+++ b/web/src/__generated__/schemas/BundleSummary.ts
@@ -0,0 +1,16 @@
+/**
+ * ⚠️ THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY.
+ * All manual edits will be lost when this file is regenerated.
+ */
+
+import type { BundleSummaryTag } from './BundleSummaryTag';
+
+export type BundleSummary = {
+ acl?: string;
+ latestChecksum?: string;
+ latestVersion?: bigint | string;
+ name?: string;
+ ownerCid?: string;
+ tags?: BundleSummaryTag[];
+ updatedAt?: bigint | string;
+};
diff --git a/web/src/__generated__/schemas/BundleSummaryTag.ts b/web/src/__generated__/schemas/BundleSummaryTag.ts
new file mode 100644
index 0000000000..578d85023e
--- /dev/null
+++ b/web/src/__generated__/schemas/BundleSummaryTag.ts
@@ -0,0 +1,9 @@
+/**
+ * ⚠️ THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY.
+ * All manual edits will be lost when this file is regenerated.
+ */
+
+export type BundleSummaryTag = {
+ checksum?: string;
+ tag?: string;
+};
diff --git a/web/src/__generated__/schemas/CampaignAuditDto.ts b/web/src/__generated__/schemas/CampaignAuditDto.ts
new file mode 100644
index 0000000000..96669fd117
--- /dev/null
+++ b/web/src/__generated__/schemas/CampaignAuditDto.ts
@@ -0,0 +1,16 @@
+/**
+ * ⚠️ THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY.
+ * All manual edits will be lost when this file is regenerated.
+ */
+
+import type { AuthorDto } from './AuthorDto';
+
+export type CampaignAuditDto = {
+ createdAt?: Date;
+ createdBy?: AuthorDto;
+ createdBySystem?: string;
+ lastUpdatedAt?: Date;
+ lastUpdatedBy?: AuthorDto;
+ publishedAt?: Date | null;
+ publishedBy?: AuthorDto;
+};
diff --git a/web/src/__generated__/schemas/CampaignGraphDto.ts b/web/src/__generated__/schemas/CampaignGraphDto.ts
index e47c1db14b..7fbea28be0 100644
--- a/web/src/__generated__/schemas/CampaignGraphDto.ts
+++ b/web/src/__generated__/schemas/CampaignGraphDto.ts
@@ -3,11 +3,13 @@
* All manual edits will be lost when this file is regenerated.
*/
+import type { CampaignAuditDto } from './CampaignAuditDto';
import type { CampaignConfigDto } from './CampaignConfigDto';
import type { GraphEdgeDto } from './GraphEdgeDto';
import type { GraphNodeDto } from './GraphNodeDto';
export type CampaignGraphDto = {
+ audit?: CampaignAuditDto;
campaignId?: string;
config?: CampaignConfigDto;
edges?: GraphEdgeDto[];
diff --git a/web/src/__generated__/schemas/CampaignSummaryDto.ts b/web/src/__generated__/schemas/CampaignSummaryDto.ts
index 4a584c6bd3..6cc5d9698b 100644
--- a/web/src/__generated__/schemas/CampaignSummaryDto.ts
+++ b/web/src/__generated__/schemas/CampaignSummaryDto.ts
@@ -3,11 +3,16 @@
* All manual edits will be lost when this file is regenerated.
*/
+import type { AuthorDto } from './AuthorDto';
import type { CampaignLifecycle } from './enums/CampaignLifecycle';
export type CampaignSummaryDto = {
campaignId?: string;
+ createdAt?: Date | null;
+ createdBy?: AuthorDto;
name?: string;
phase?: CampaignLifecycle;
+ publishedAt?: Date | null;
+ publishedBy?: AuthorDto;
version?: number;
};
diff --git a/web/src/__generated__/schemas/ApiCampaignsGetCampaignResponse.ts b/web/src/__generated__/schemas/CampaignSummaryDtoCampaignPageDto.ts
similarity index 57%
rename from web/src/__generated__/schemas/ApiCampaignsGetCampaignResponse.ts
rename to web/src/__generated__/schemas/CampaignSummaryDtoCampaignPageDto.ts
index 39c6dfed00..364f033b7f 100644
--- a/web/src/__generated__/schemas/ApiCampaignsGetCampaignResponse.ts
+++ b/web/src/__generated__/schemas/CampaignSummaryDtoCampaignPageDto.ts
@@ -5,5 +5,9 @@
import type { CampaignSummaryDto } from './CampaignSummaryDto';
-export type ApiCampaignsGetCampaignResponse = CampaignSummaryDto[] & {
+export type CampaignSummaryDtoCampaignPageDto = {
+ limit?: number;
+ records?: CampaignSummaryDto[];
+ skip?: number;
+ total?: bigint | string;
};
diff --git a/web/src/__generated__/schemas/ClientAnalyticsEvent.ts b/web/src/__generated__/schemas/ClientAnalyticsEvent.ts
index 136402ed74..8ad8c515db 100644
--- a/web/src/__generated__/schemas/ClientAnalyticsEvent.ts
+++ b/web/src/__generated__/schemas/ClientAnalyticsEvent.ts
@@ -4,6 +4,7 @@
*/
export type ClientAnalyticsEvent = {
+ c?: string | null;
e?: string | null;
p?: Record | null;
time?: bigint | string | null;
diff --git a/web/src/__generated__/schemas/GetBundleResponse.ts b/web/src/__generated__/schemas/GetBundleResponse.ts
index 51574ab402..51bee75f93 100644
--- a/web/src/__generated__/schemas/GetBundleResponse.ts
+++ b/web/src/__generated__/schemas/GetBundleResponse.ts
@@ -4,9 +4,9 @@
*/
import type { Bundle } from './Bundle';
-import type { BundleTag } from './BundleTag';
export type GetBundleResponse = {
bundle?: Bundle;
- tags?: BundleTag[];
+ tags?: Record;
+ version?: bigint | string;
};
diff --git a/web/src/__generated__/schemas/GoalPredicateDto.ts b/web/src/__generated__/schemas/GoalPredicateDto.ts
index cc756fa00f..687a14cbc7 100644
--- a/web/src/__generated__/schemas/GoalPredicateDto.ts
+++ b/web/src/__generated__/schemas/GoalPredicateDto.ts
@@ -3,11 +3,15 @@
* All manual edits will be lost when this file is regenerated.
*/
+import type { PropertyBoundDto } from './PropertyBoundDto';
import type { GoalPredicateKind } from './enums/GoalPredicateKind';
+import type { PropertyBoundsMode } from './enums/PropertyBoundsMode';
export type GoalPredicateDto = {
event?: string | null;
kind?: GoalPredicateKind;
predicates?: GoalPredicateDto[] | null;
+ properties?: PropertyBoundDto[] | null;
+ propertiesMode?: PropertyBoundsMode;
withinMs?: bigint | string | null;
};
diff --git a/web/src/__generated__/schemas/ListBundleReleasesResponse.ts b/web/src/__generated__/schemas/ListBundleReleasesResponse.ts
new file mode 100644
index 0000000000..6191fc9fac
--- /dev/null
+++ b/web/src/__generated__/schemas/ListBundleReleasesResponse.ts
@@ -0,0 +1,11 @@
+/**
+ * ⚠️ THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY.
+ * All manual edits will be lost when this file is regenerated.
+ */
+
+import type { BundleRelease } from './BundleRelease';
+
+export type ListBundleReleasesResponse = {
+ releases?: BundleRelease[];
+ tags?: Record;
+};
diff --git a/web/src/__generated__/schemas/ListBundlesResponse.ts b/web/src/__generated__/schemas/ListBundlesResponse.ts
index f287a59894..f5f492f6b0 100644
--- a/web/src/__generated__/schemas/ListBundlesResponse.ts
+++ b/web/src/__generated__/schemas/ListBundlesResponse.ts
@@ -3,8 +3,8 @@
* All manual edits will be lost when this file is regenerated.
*/
-import type { Bundle } from './Bundle';
+import type { BundleSummary } from './BundleSummary';
export type ListBundlesResponse = {
- bundles?: Bundle[];
+ bundles?: BundleSummary[];
};
diff --git a/web/src/__generated__/schemas/Message.ts b/web/src/__generated__/schemas/Message.ts
index b6981bb920..c8036b5a54 100644
--- a/web/src/__generated__/schemas/Message.ts
+++ b/web/src/__generated__/schemas/Message.ts
@@ -19,8 +19,8 @@ export type Message = {
bodyRef?: bigint | string;
claimedTimeMs?: bigint | string;
expires?: bigint | string;
+ metadata?: Record;
playerRewards?: PlayerReward;
rewards?: MailRewards;
subject?: string;
- metadata?: Record;
};
diff --git a/web/src/__generated__/schemas/OtelView.ts b/web/src/__generated__/schemas/OtelView.ts
index 8bcc3fd000..84ca8355fa 100644
--- a/web/src/__generated__/schemas/OtelView.ts
+++ b/web/src/__generated__/schemas/OtelView.ts
@@ -3,13 +3,11 @@
* All manual edits will be lost when this file is regenerated.
*/
-import type { ObjectId } from './ObjectId';
-
export type OtelView = {
+ accountId: string;
name: string;
- playerId: string;
query: string;
- id?: ObjectId;
+ id?: string | null;
isFavorite?: boolean;
isPublic?: boolean;
};
diff --git a/web/src/__generated__/schemas/ProtoError.ts b/web/src/__generated__/schemas/ProtoError.ts
new file mode 100644
index 0000000000..b68f6b1f4b
--- /dev/null
+++ b/web/src/__generated__/schemas/ProtoError.ts
@@ -0,0 +1,10 @@
+/**
+ * ⚠️ THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY.
+ * All manual edits will be lost when this file is regenerated.
+ */
+
+export type ProtoError = {
+ description?: string | null;
+ error?: string | null;
+ status?: number;
+};
diff --git a/web/src/__generated__/schemas/PublishBundleRequest.ts b/web/src/__generated__/schemas/PublishBundleRequest.ts
index 2594dde47a..11fa15255d 100644
--- a/web/src/__generated__/schemas/PublishBundleRequest.ts
+++ b/web/src/__generated__/schemas/PublishBundleRequest.ts
@@ -3,14 +3,14 @@
* All manual edits will be lost when this file is regenerated.
*/
-import type { BundlePeerDep } from './BundlePeerDep';
+import type { BundleDepRange } from './BundleDepRange';
import type { PortalExtensionReference } from './PortalExtensionReference';
import type { SchemaReference } from './SchemaReference';
import type { ServiceReference } from './ServiceReference';
import type { ServiceStorageReference } from './ServiceStorageReference';
export type PublishBundleRequest = {
- peerDependencies?: Record;
+ bundleDependencies?: Record;
portalExtensionReferences?: PortalExtensionReference[];
schemaReferences?: SchemaReference[];
serviceReferences?: ServiceReference[];
diff --git a/web/src/__generated__/schemas/PublishBundleResponse.ts b/web/src/__generated__/schemas/PublishBundleResponse.ts
index 7707ba0cd7..cb610c6b1a 100644
--- a/web/src/__generated__/schemas/PublishBundleResponse.ts
+++ b/web/src/__generated__/schemas/PublishBundleResponse.ts
@@ -7,4 +7,5 @@ export type PublishBundleResponse = {
checksum?: string;
isNew?: boolean;
name?: string;
+ version?: bigint | string;
};
diff --git a/web/src/__generated__/schemas/ReportRailFunnelStageRequest.ts b/web/src/__generated__/schemas/ReportRailFunnelStageRequest.ts
new file mode 100644
index 0000000000..459699d82e
--- /dev/null
+++ b/web/src/__generated__/schemas/ReportRailFunnelStageRequest.ts
@@ -0,0 +1,13 @@
+/**
+ * ⚠️ THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY.
+ * All manual edits will be lost when this file is regenerated.
+ */
+
+export type ReportRailFunnelStageRequest = {
+ federationId: string;
+ outreachId: string;
+ stage: string;
+ analyticsTrackRef?: string | null;
+ externalSystemTrackId?: string | null;
+ gamerTag?: bigint | string;
+};
diff --git a/web/src/__generated__/schemas/RuleLeaf.ts b/web/src/__generated__/schemas/RuleLeaf.ts
index dd99fe866d..6d2896b4fa 100644
--- a/web/src/__generated__/schemas/RuleLeaf.ts
+++ b/web/src/__generated__/schemas/RuleLeaf.ts
@@ -7,6 +7,7 @@ import type { Operator } from './enums/Operator';
export type RuleLeaf = {
key?: string | null;
+ ns?: string | null;
op?: Operator;
values?: (string | number | number | boolean | (string | number | number | boolean)[])[] | null;
};
diff --git a/web/src/__generated__/schemas/SegmentAttribute.ts b/web/src/__generated__/schemas/SegmentAttribute.ts
index a92b6385a3..1f3c4165c8 100644
--- a/web/src/__generated__/schemas/SegmentAttribute.ts
+++ b/web/src/__generated__/schemas/SegmentAttribute.ts
@@ -6,7 +6,11 @@
export type SegmentAttribute = {
computed: boolean;
description: string;
+ domain: string;
key: string;
+ namespace: string;
type: string;
+ visibility: string;
+ custom?: boolean;
unit?: string | null;
};
diff --git a/web/src/__generated__/schemas/SendMailObjectRequest.ts b/web/src/__generated__/schemas/SendMailObjectRequest.ts
index 9f0d506c73..8a0aa26873 100644
--- a/web/src/__generated__/schemas/SendMailObjectRequest.ts
+++ b/web/src/__generated__/schemas/SendMailObjectRequest.ts
@@ -15,8 +15,8 @@ export type SendMailObjectRequest = {
bodyRef?: bigint | string;
expires?: string;
id?: bigint | string;
+ metadata?: Record;
playerRewards?: PlayerReward;
rewards?: MailRewards;
subject?: string;
- metadata?: Record;
};
diff --git a/web/src/__generated__/schemas/SendMailRequest.ts b/web/src/__generated__/schemas/SendMailRequest.ts
index 9811984f90..f3c10fd78b 100644
--- a/web/src/__generated__/schemas/SendMailRequest.ts
+++ b/web/src/__generated__/schemas/SendMailRequest.ts
@@ -16,8 +16,8 @@ export type SendMailRequest = {
bodyRef?: bigint | string;
expires?: string;
id?: bigint | string;
+ metadata?: Record;
playerRewards?: PlayerReward;
rewards?: MailRewards;
subject?: string;
- metadata?: Record;
};
diff --git a/web/src/__generated__/schemas/enums/AuthorKind.ts b/web/src/__generated__/schemas/enums/AuthorKind.ts
new file mode 100644
index 0000000000..7582bcb927
--- /dev/null
+++ b/web/src/__generated__/schemas/enums/AuthorKind.ts
@@ -0,0 +1,9 @@
+/**
+ * ⚠️ THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY.
+ * All manual edits will be lost when this file is regenerated.
+ */
+
+export enum AuthorKind {
+ User = "User",
+ System = "System"
+}
diff --git a/web/src/__generated__/schemas/enums/BeamoV2FederationType.ts b/web/src/__generated__/schemas/enums/BeamoV2FederationType.ts
index f57fc846aa..069033d06e 100644
--- a/web/src/__generated__/schemas/enums/BeamoV2FederationType.ts
+++ b/web/src/__generated__/schemas/enums/BeamoV2FederationType.ts
@@ -8,5 +8,6 @@ export enum BeamoV2FederationType {
IFederatedInventory = "IFederatedInventory",
IFederatedCommerce = "IFederatedCommerce",
IFederatedGameServer = "IFederatedGameServer",
- IFederatedPlayerInit = "IFederatedPlayerInit"
+ IFederatedPlayerInit = "IFederatedPlayerInit",
+ IFederatedMessageRail = "IFederatedMessageRail"
}
diff --git a/web/src/__generated__/schemas/enums/PropertyBoundsMode.ts b/web/src/__generated__/schemas/enums/PropertyBoundsMode.ts
new file mode 100644
index 0000000000..81d45877ca
--- /dev/null
+++ b/web/src/__generated__/schemas/enums/PropertyBoundsMode.ts
@@ -0,0 +1,9 @@
+/**
+ * ⚠️ THIS FILE IS AUTO-GENERATED. DO NOT EDIT MANUALLY.
+ * All manual edits will be lost when this file is regenerated.
+ */
+
+export enum PropertyBoundsMode {
+ All = "All",
+ Any = "Any"
+}
diff --git a/web/src/__generated__/schemas/index.ts b/web/src/__generated__/schemas/index.ts
index 0861bebe4d..d4735a1c78 100644
--- a/web/src/__generated__/schemas/index.ts
+++ b/web/src/__generated__/schemas/index.ts
@@ -5,6 +5,7 @@
export * from './enums/ActivationStatus';
export * from './enums/AddressFamily';
+export * from './enums/AuthorKind';
export * from './enums/BeamoV2FederationType';
export * from './enums/BeamoV2LogLevel';
export * from './enums/BeamoV2LogProvider';
@@ -36,6 +37,7 @@ export * from './enums/PaymentStatus';
export * from './enums/PresenceStatus';
export * from './enums/PromotableType';
export * from './enums/PropertyAggregate';
+export * from './enums/PropertyBoundsMode';
export * from './enums/PropertyKind';
export * from './enums/PullRequestStatus';
export * from './enums/RealmSecretsOperation';
@@ -71,7 +73,12 @@ export * from './AdminGetPlayerStatusRequest';
export * from './AdminGetPlayerStatusResponse';
export * from './AdminPlayerStatus';
export * from './AliasAvailableRequest';
+export * from './AnalyticsObservedEvent';
+export * from './AnalyticsObservedEventsResponse';
export * from './AnalyticsQueryRequest';
+export * from './AnalyticsSchemaListResponse';
+export * from './AnalyticsSchemaProperty';
+export * from './AnalyticsSchemaResponse';
export * from './AnnouncementAttachment';
export * from './AnnouncementContent';
export * from './AnnouncementContentResponse';
@@ -83,7 +90,7 @@ export * from './AnnouncementRequest';
export * from './AnnouncementState';
export * from './AnnouncementView';
export * from './ApiAnalyticsQueryPostAnalyticsResponse';
-export * from './ApiBeamoBundlesChecksumsAclPutBeamoBundleResponse';
+export * from './ApiBeamoBundlesAclPutBeamoBundleResponse';
export * from './ApiBeamoBundlesTagsPostBeamoBundleResponse';
export * from './ApiBeamoCidsForcedBundlesDeleteBeamoForcedBundleResponse';
export * from './ApiBeamoCidsForcedBundlesPutBeamoForcedBundleResponse';
@@ -95,7 +102,6 @@ export * from './ApiBeamoZonesForcedBundlesPutZonesResponse';
export * from './ApiCampaignsArchivePostCampaignResponse';
export * from './ApiCampaignsDeactivatePostCampaignResponse';
export * from './ApiCampaignsDeleteCampaignResponse';
-export * from './ApiCampaignsGetCampaignResponse';
export * from './ApiCampaignsReactivatePostCampaignResponse';
export * from './ApiCustomersActivatePutCustomerResponse';
export * from './ApiCustomersRealmsSegmentsAttributesGetSegmentsResponse';
@@ -104,6 +110,7 @@ export * from './ApiDataBindingsPutDataBindingResponse';
export * from './ApiLobbiesServerPostLobbyResponse';
export * from './ApiMailboxPublishPostMailboxResponse';
export * from './ApiMatchmakingTicketsDeleteTicketResponse';
+export * from './ApiMessageRailOpenGifGetMessageRailResponse';
export * from './ApiPartiesInviteDeletePartyResponse';
export * from './ApiPartiesInvitePostPartyResponse';
export * from './ApiPartiesMembersDeletePartyResponse';
@@ -127,6 +134,7 @@ export * from './Attachment';
export * from './AttachmentProperty';
export * from './AttachmentRequest';
export * from './AudienceRequest';
+export * from './AuthorDto';
export * from './AuthResponse';
export * from './AuthV2AuthCode';
export * from './AuthV2AuthCodeRequest';
@@ -162,6 +170,7 @@ export * from './BatchGetStatsResponse';
export * from './BatchReadStatsRequest';
export * from './BatchReadStatsResponse';
export * from './BatchSetStatsRequest';
+export * from './BatchState';
export * from './BatchWriteItem';
export * from './BatchWriteRequest';
export * from './BeamoBasicGetManifestRequest';
@@ -247,12 +256,16 @@ export * from './BulkMembershipResponse';
export * from './BulkSendMailRequest';
export * from './BulkUpdateMailObjectRequest';
export * from './Bundle';
-export * from './BundlePeerDep';
-export * from './BundleTag';
+export * from './BundleDep';
+export * from './BundleDepRange';
+export * from './BundleRelease';
+export * from './BundleSummary';
+export * from './BundleSummaryTag';
export * from './CalendarClaimRequest';
export * from './CalendarQueryResponse';
export * from './CalendarView';
export * from './CallerInfo';
+export * from './CampaignAuditDto';
export * from './CampaignChangeDto';
export * from './CampaignChangeErrorDto';
export * from './CampaignConfigDto';
@@ -261,6 +274,7 @@ export * from './CampaignGraphDto';
export * from './CampaignNodeFunnelDto';
export * from './CampaignStatusDto';
export * from './CampaignSummaryDto';
+export * from './CampaignSummaryDtoCampaignPageDto';
export * from './CancelInviteToParty';
export * from './CancelPurchaseRequest';
export * from './Catalog';
@@ -589,6 +603,7 @@ export * from './LeaveParty';
export * from './Link';
export * from './ListAuditRequest';
export * from './ListAuditResponse';
+export * from './ListBundleReleasesResponse';
export * from './ListBundlesResponse';
export * from './ListDataBindingsResponse';
export * from './ListDefinitionsResponse';
@@ -657,7 +672,6 @@ export * from './NodeBodyDto';
export * from './NodeOutcomeDto';
export * from './NotificationRequest';
export * from './NotificationRequestData';
-export * from './ObjectId';
export * from './ObjectMetadataResponse';
export * from './ObjectRequest';
export * from './ObjectRequests';
@@ -734,6 +748,7 @@ export * from './PropertyBoundDto';
export * from './PropertyDelta';
export * from './PropertyFilterDTO';
export * from './ProposedManifest';
+export * from './ProtoError';
export * from './PublishBundleRequest';
export * from './PublishBundleResponse';
export * from './PublishMessage';
@@ -794,6 +809,7 @@ export * from './RenameZoneRequest';
export * from './RepeatManifestRequest';
export * from './ReplaceObjectsRequest';
export * from './ReportPurchaseRequest';
+export * from './ReportRailFunnelStageRequest';
export * from './RequalifyDto';
export * from './ResultResponse';
export * from './RevokeTokenRequest';