Skip to content

Releases: Cratis/Showrunner

Release v1.8.0

Choose a tag to compare

@github-actions github-actions released this 31 Oct 14:24
0ac6bd2

Box Office now has a user interface. @cratis/showrunner.boxoffice.react tells the signed-in user what their tenant may do, keeps navigation and pages of modules the tenant lacks out of sight, and gives the product's maintainers seats, usage and plan pages.

Added

  • @cratis/showrunner.boxoffice.react: BoxOfficeProvider, useEntitlements, useModuleFilter, RequiresModule, TrialBanner, SuspensionBanner, NoLicense, PortalButton, SeatsPage, UsagePage and PlanPage, with replaceable texts and a stylesheet built on the Cratis Components tokens. (#51)
  • CurrentEntitlements query returning what the signed-in user's tenant may do in one answer: read-only reason, trial, seats and each module's access.
  • CurrentUsage query, authorized by BoxOffice.ManageCompute, returning where the tenant stands with each meter in its allowance period.
  • LinkToPortal query and the CustomerPortalUrl, CustomerPortalSigningKey and CustomerPortalLinkLifetime options: a product can send tenants to the operator's customer portal with a signed, short-lived link. The host fails to start when only one of the address and the key is set.
  • Documentation for the React components and the customer portal, and the new queries and options on the existing Box Office pages. (#53)

Release v1.7.0

Choose a tag to compare

@github-actions github-actions released this 31 Oct 14:09
9cfe505

Box Office now refuses what a tenant has not got and decides whether a tenant may start compute before the work starts.

Added

  • Module gating: commands and queries in a namespace a module owns are refused with ModuleNotEntitled when the tenant does not have the module, a gated reactor asks IModuleGate.Admits(this) and skips the event, and an included module is always admitted. A module trial or grant stops admitting the day after its last day without any event. BoxOfficeOptions.EnforceModules turns enforcement off; it is on by default. (#45)
  • Compute admission: IComputeAdmission.Admit(meter) decides before work starts whether the tenant may run it, returning admitted, AtConcurrencyLimit, AllowanceExhausted, BudgetReached, or parked until the next period starts, and End frees the concurrent slot. The concurrency limit is decided from the tenant's start and stop facts under a concurrency scope, so two starts for the last slot admit one. (#49)
  • The first refusal for an allowance in a period records that it ran out and reports AllowanceExhausted to the operator once; later refusals in the period are logged and counted, and record nothing. (#49)
  • SetComputeBudget and SetComputeConcurrencyLimit let a product's maintainers set a budget below the operator's allowance and a concurrency limit per meter, and the CurrentLimits query returns them, with generated proxies in @cratis/showrunner.boxoffice. (#49)
  • BoxOfficeOptions.MaximumWorkDuration (12 hours by default) bounds how long admitted work that was never ended holds its concurrent slot.
  • Documentation for module gating and compute admission.

Changed

  • Register the BoxOffice.ManageCompute authorization policy next to BoxOffice.ManageSeats, to say who may set compute budgets and concurrency limits.
  • Cratis.Showrunner.BoxOffice now references Cratis.Showrunner.BoxOffice.Offering, whose declared modules and meters gating and admission read. Compute admission needs AddBoxOfficeOffering and AddBoxOfficeMetering.

Release v1.6.0

Choose a tag to compare

@github-actions github-actions released this 31 Oct 13:05
fa4ea66

Marquee now runs end to end in the consumer's Arc and Chronicle process, the way Usher does: write announcements, receive them once per product, show each tenant what its audience matches, and record who has dismissed a dialog.

Added

  • Cratis.Showrunner.Marquee.Authoring: commands to author, amend, retarget and withdraw an announcement, an observable per-product query for the authoring screen, and one MarqueeOutbox reactor that publishes all four contract events. Authorization is the host's: register a policy named MarqueeAuthoring.Policy. A withdrawal that is processed together with, or ahead of, its publication never leaves the announcement standing. (#36)
  • Cratis.Showrunner.Marquee: AddMarquee subscribes the product to its authoring store's outbox, records announcements once in the product's own namespace, drops what arrives after a retraction, and answers the observable query AnnouncementsForMe per tenant. Module and plan audiences are answered by the host's IAudienceEntitlements, and never match without one. A tenant created after publication still sees an active announcement. (#37)
  • AcknowledgeAnnouncement: records that a person saw a dialog shown once, in the tenant's namespace with the person as compliance subject, so it is shown once per person on every device. Acknowledging twice, a dialog shown every session and a banner record nothing. (#38)
  • @cratis/showrunner.marquee and @cratis/showrunner.marquee.authoring: the generated TypeScript proxies for the receiving and the authoring slices.
  • Documentation for authoring, receiving, acknowledging and the proxy packages: https://github.com/Cratis/Showrunner/blob/main/Documentation/Marquee/index.md

Changed

  • AnnouncementId is now an EventSourceId<Guid>, so an announcement has its own stream where it is authored, received and acknowledged. Contract events still carry it as a payload field.
  • The CI check that the committed proxies are current now covers every backend project that generates them.

Release v1.5.0

Choose a tag to compare

@github-actions github-actions released this 31 Oct 12:40
a2840bd

Box Office for a product: declare what the product sells, and measure what each tenant uses.

Added

  • Cratis.Showrunner.BoxOffice.Offering package. AddBoxOfficeOffering declares a product's modules (requirements, owned namespaces, trial days, availability), meters and seat licensing, rejects a declaration that cannot be sold at startup, and reports OfferingDeclared only when the declaration differs from the last one reported (#43)
  • AddBoxOfficeMetering and IMeter: a meter reads the product's own events into a quantity per tenant, meter and UTC day, kept in buckets beside the event log in MongoDB. Box Office adds no second "session started" event (#48)
  • A UTC day closes 6 hours after midnight and ComputeDayClosed is reported once, also across restarts; a session that ends after its day closed produces one ComputeDayCorrected with the corrected totals (#48)
  • Counters for metering buckets, closed days and corrections (#48)
  • Documentation for the offering declaration and for compute metering, and integration specifications for the MongoDB metering store (#48)

Release v1.4.0

Choose a tag to compare

@github-actions github-actions released this 31 Oct 10:48
29f3771

Box Office now runs inside a managed product: it receives the operator's decisions about a tenant, refuses changes from a tenant that is suspended or read-only, and licenses seats.

Added

  • Cratis.Showrunner.BoxOffice, added with AddBoxOffice: it subscribes the application to each operator's outbox, records the operator's decisions about a tenant in the tenant's own namespace, and answers what the tenant may use through IEntitlements: trial, seats, modules, previews and allowances. A trial, module or seat that has an end stops counting the day after it, without an event. (#44)
  • A command filter that refuses every command from a suspended tenant, or one whose trial closed without seats, with TenantSuspended or TrialClosed. Commands marked AllowedWhileSuspended still run, and TenantReinstated lifts the refusal immediately. The CurrentStanding query tells the frontend why. (#47)
  • AssignSeat and ReleaseSeat, guarded so two assignments cannot overfill the pool, with SeatTaken and SeatReleased reported to the operator. Commands marked RequiresSeat are refused with SeatRequired for a user without a licensed seat, and a pool that shrinks keeps the oldest holders licensed. The product defines the BoxOffice.ManageSeats policy for who may assign seats. (#46)
  • @cratis/showrunner.boxoffice, the generated TypeScript proxies for the product's frontend.
  • Documentation for Receiving and entitlements, Suspension and Seat licensing.

Release v1.3.0

Choose a tag to compare

@github-actions github-actions released this 31 Oct 09:34
3356732

Box Office now has a catalog: the offers an operator such as Direct sells, their prices, and the pricing arithmetic, published to products through the existing OfferPublished and OfferWithdrawn contracts.

Added

  • Cratis.Showrunner.BoxOffice.Catalog NuGet package with three kinds of offer: seat plans (seats or unlimited, included modules and allowances, sales contact), modules (flat per organization or per seat, trial length, paid or preview) and compute packs (meter, quantity per period, stackable). (#50)
  • Commands DefineSeatPlan, DefineModuleOffer, DefineComputePack, PriceOffer, IncludeModuleInOffer, IncludeAllowanceInOffer and RetireOffer, and the Offer read model with observable AllOffers and OffersOnSale queries. Repeating a price, module or allowance an offer already has records nothing.
  • Pricing.TotalFor, PeriodEnd and Prorate, moved from Direct's Admin catalog and expressed in minor units, for monthly and yearly billing.
  • SeatPlanOffers.From turns an existing seat SKU and its price into the events of an identical seat plan offer.
  • OfferPublisher reactor that appends OfferPublished to the outbox when what an offer tells a product changes, and OfferWithdrawn when a published offer is retired. An unlimited seat plan publishes int.MaxValue seats, and allowances are not published because the contract has no field for them.
  • Documentation for the catalog at https://github.com/Cratis/Showrunner/blob/main/Documentation/BoxOffice/catalog.md.

Release v1.2.0

Choose a tag to compare

@github-actions github-actions released this 31 Oct 09:32
9f1a89f

Marquee gets its first package: the public events a product receives announcements through.

Added

  • Cratis.Showrunner.Marquee.Contracts, published with every release, with the public events AnnouncementPublished, AnnouncementRevised, AnnouncementAudienceChanged and AnnouncementRetracted. The active window is exact UTC times, so maintenance windows can be announced to the minute; an announcement with no end uses ActiveUntil.Indefinitely. (#35)
  • Audience with Everyone, Tenants, HoldersOfModule and OnPlan, plus Display (Banner, DialogOnce, DialogEverySession) and Importance (Information, Warning, Critical).
  • IAudienceEntitlements and NoAudienceEntitlements: module and plan audiences are resolved by an entitlement source the host plugs in, so Marquee depends on no other Showrunner part and still delivers Everyone and Tenants announcements without one.
  • An event schema snapshot guard: a schema change without regenerating the snapshot, or without a new generation for a released event, fails the build.
  • Documentation for Marquee contracts.

Release v1.1.0

Choose a tag to compare

@github-actions github-actions released this 31 Oct 08:28
43d22e0

Box Office, the licensing part of Showrunner, gets its first package: the public events an operator such as Direct and a managed product exchange about tenants. It replaces the v1 Admin.Contracts events, and its names line up one to one with Direct's seats, trials and suspension.

Added

  • Cratis.Showrunner.BoxOffice.Contracts, published with every release alongside the Usher packages. Operator to product: TenantRegistered, TrialOpened, TrialEndMoved, TrialClosed, SeatCapacitySet, ModuleGranted, ModuleTrialGranted, ModulePreviewOpened, ModuleRevoked, AllowanceSet, TenantSuspended, TenantReinstated and TenantClosing. Product-wide from the operator: OfferPublished and OfferWithdrawn. Product to operator: OfferingDeclared, TenantProvisioned, SeatTaken, SeatReleased, ActivitySummarized, ComputeDayClosed, ComputeDayCorrected and AllowanceExhausted. (#42)
  • Every contract is [Public], carries TenantId when it concerns a tenant, and is appended under the operator's own OrganizationId, ProductId or OfferId, so none of them repeats an event source id in its payload.
  • An EventSchemas.snapshot.json guard and a ReleasedEventSchemas.json list of frozen generations, as in Usher.
  • Box Office documentation with the contract reference and a mapping from every v1 event, and from Direct's own seat, trial and suspension facts, to its replacement: https://github.com/Cratis/Showrunner/blob/main/Documentation/BoxOffice/contracts.md

Release v1.0.0

Choose a tag to compare

@github-actions github-actions released this 28 Oct 04:48
5878781

The first release of Showrunner brings Usher: issue reporting and support conversations for applications built on Cratis, hosted as a library inside the application and exchanging events with a support desk.

Added

  • Cratis.Showrunner.Usher.Contracts with the public events an application and a support desk exchange about issues, in both directions. See Contracts. (#1) (part of #8)
  • Cratis.Showrunner.Usher, added with AddUsher, with commands to report an issue or an error, share identity, add details, answer questions, reopen, withdraw, and grant or revoke support access, and the observable ReportedIssue.MyIssues() and IssueConversation.ForIssue(issueId) queries, all recorded as private events in the tenant's own namespace. See Backend. (#2)
  • Reporters only see and act on their own issues, and everything they send is bounded by ReportLimits and classified as personal data of that reporter.
  • Usher publishes the reporter's facts to the outbox for the desks named in DeskStores, records the desk's answers as private Support… facts in the tenant the event names, and lapses grants of access on their exact end, in every tenant namespace. See Exchanging events with a desk. (#3)
  • Failing commands are captured on the server with their slice location, error and stack frames, so a report of that error records what the backend saw, fingerprinted to group repeats. Configure it with the ErrorCapture options. (#4)
  • @cratis/showrunner.usher with the generated TypeScript proxies for Usher's commands and queries, carrying their slice location, and helpers that turn an error into what a report sends. It requires @cratis/arc, @cratis/arc.react and @cratis/fundamentals. See Frontend proxies. (part of #5)
  • @cratis/showrunner.usher.react with UsherProvider, ReportButton and MyIssuesButton, and the ReportIssueDialog, ReportErrorDialog and MyIssuesDialog built on @cratis/components, with replaceable texts and correlation-id tracking. See React components. (#6)
  • Slot-in report a problem, report this error and my issues dialogs that an application adds with AddUsher, UsherProvider and a button, and can open from its own menus. (#10)
  • Access grants and support sessions: a reporter grants support access to one issue for a fixed time, and MapUsher maps the grant check and session notification endpoints for Cratis AuthProxy's on-behalf sessions, so support can act as the reporter on that issue only while the grant is live. The reporter sees each session and what support did in it. See Access and support sessions. (part of #7)
  • Requires the Cratis Arc release that adds slice location metadata and on-behalf forwarding (Cratis/Arc#3533, Cratis/Arc#3534, Cratis/Arc#3535).