Skip to content

Packages and their versions

Which version of the API client, Apps SDK, CLI, and contracts applies and what changed for developers in each version.

28 minute readChangesUpdated: 10/25/2026

On this page

Before you start

For
developers who work with one of these packages and want to know what changed in a version.
Prerequisite
none.

Version and changes of the packages for developers — API client, Apps SDK, CLI, and contracts, newest first.

The list is built with every new version from the change notes of the platform and shows their section for developers. There is no public way to obtain the packages today; the page says which version applies and what changed in it.

Package Version
@szenera/cli 0.4.0
@szenera/client 0.6.0

@szenera/cli

0.4.0 · 2026-10-25

Breaking changes

  • The stored sign-in state carries the fields token and expiresAt. Upgrade: An old sign-in state counts as signed out, and the next sign-in writes the new one. (#821)

Added

  • New commands szenera proof list, szenera proof show, and szenera proof download. (#822)
  • New commands szenera analytics overview, szenera analytics explore, and szenera analytics delivery <acp_…>. (#822)
  • New commands advertiser list, advertiser get, advertiser create, campaign list, campaign get, booking list, creative list, and creative approve. (#822)

Changed

  • The archive follows the client with the revenue statements, without a new command. (#822)
  • The archive follows the client without the read routes of the minute counting and the insights. The commands stay. (#822)
  • The archive follows the client with the panel sources cec, ddc, and none. The commands stay. (#822)
  • The command line ships the client that knows a sign-in host of its own. Without a setting, nothing changes. (#825)
  • The archive follows the client with campaignId per proof of the campaign report. The commands stay. (#822)
  • The archive bundles the current state of the contracts, and the commands of szenera stay the same. (#847)
  • szenera playlist get shows an ad break as "Werbeblock · 3 Plätze à 10 s" with its duration. (#822)

0.3.0 · 2026-10-23

Breaking changes

  • Die JSON-Ausgabe der Kommandozeile nennt dieselben Namen wie die API. Umstieg: Skripte, die die JSON-Ausgabe lesen, auf die englischen Feldnamen umstellen. (#761) (German only)
  • szenera api-key revoke <akm_…> --compromised nennt den Grund des Widerrufs. szenera api-key list mit einem Schlüssel-Profil antwortet 401. Umstieg: Für szenera api-key list ein Profil mit Sitzung verwenden. (#762) (German only)

Added

  • Die Typen folgen der API: Feed-Katalog, Quellen für den Betrieb und der Fehlercode FeedSource.NotFound. (#801) (German only)
  • Neue Aufrufe: Zusammenfassung, Sammelaktion und Wiederherstellen von Benachrichtigungen, dazu state und groupKey an der Liste. (#795) (German only)
  • playerId an der Vorschau der Widget-Daten und der Lesebereich player-location. (#801) (German only)
  • Standorte: region und openingHours, dazu das Ereignis fleet.location.opening-hours-changed. (#801) (German only)
  • Widget-Definitionen des Katalogs kennen size und preview.states, Ansichten des Stores kennen size. (#801) (German only)

0.2.3

Changes

  • GET /v1/audit/bulk/:correlationId entfällt und mit ihm client.audit.auditBulk und das Schema GetBulkActionDetailResponse. (#742) (German only)
  • Das Recht audit.bulk.read, die Ereignisart audit.bulk-action.completed und der Fehlercode Internal.AuditBulkActionDetailRepositoryUnavailable entfallen. (#742) (German only)

0.2.2

Changes

  • @szenera/contracts: neu CatalogAppSchema, AppReleaseNotesSchema (Notizen je Zielgruppe und Sprache), AppReleaseEventSchema, RestoreAppRelease*, ListAppReleaseHistory* und GetAppVersionHistory*. Ein AppRelease trägt notes, die Wire-Form daneben weiter releaseNotes. PATCH /v1/platform/app-catalog/apps/{appId}/releases/{id} nimmt notes je Zielgruppe oder wie bisher releaseNotes. (#677) (German only)
  • Ein Grant trägt installedReleaseId, pendingReleaseId, pendingReasons und pendingDeadline, ein Zustimmungs-Nachweis releaseId, eine offene Zustimmung fromVersion, toVersion, reasons und deadline. Entfallen sind autoUpgrade am Grant und ConfigSchemaChangedPayloadSchema. (#677) (German only)
  • GET /v1/apps/{appId}/history liefert einer Organisation die Fassungen einer App, die stable erreicht haben, mit Datum und „Neu in dieser Fassung" in der erbetenen Sprache (?locale=en-US, ohne Angabe Deutsch). (#677) (German only)
  • @szenera/api-client: neu client.platform.appCatalogAppsHistory.list, client.platform.appCatalogAppsReleases.restore und client.appCatalog.appsHistory.list. @szenera/client: neu client.appCatalog.appsHistory.list. @szenera/cli bündelt die neuen Verträge, ihre Befehle bleiben, wie sie sind. (#677) (German only)
  • Das scenes-Bündel der Momentaufnahme trägt appVersions (je App die eine Fassung des Displays) sowie appRendererHosts und appWidgetTypes je <appId>@<version>, alle mit der Vorgabe {}. Die Pins der Szenen und Widgets nennen dieselbe Fassung. (#683) (German only)
  • displayAppVersion(pins, installed) in @szenera/contracts/composition rechnet die Fassung eines Displays: die installierte, bei gehaltenen Pins älterer Hauptnummern die niedrigste davon. (#683) (German only)
  • Die neue Befundart AppVersionHeld ist immer eine Warnung und trägt appId, appName, version, installedVersion und widgetIds. Die KI-Anbindung erklärt sie. (#683) (German only)
  • @szenera/client: Der Filter type der Integritäts-Befunde einer Szene kennt AppVersionHeld. @szenera/cli bündelt den erweiterten Vertrag, ihre Befehle bleiben, wie sie sind. (#683) (German only)
  • Ein Zustimmungs-Nachweis trägt version, die Nummer der Fassung, der zugestimmt wurde (null nur bei Nachweisen von davor, deren Fassung schon fehlte). Eine Installation trägt declinedAt neben declinedVersion. (#681) (German only)
  • GET /v1/apps/{appId}/history nennt je Fassung releaseId, dieselbe Kennung wie an Installation, Nachweis und Update-Entscheidung. (#681) (German only)
  • @szenera/client: client.appCatalog.appsHistory.list nennt je Fassung releaseId, eine Installation trägt declinedAt. @szenera/cli bündelt die erweiterten Verträge, ihre Befehle bleiben, wie sie sind. (#681) (German only)
  • @szenera/widget-editor: EditorShell nimmt appsAwaitingUpdate (Apps samt Weg zur Entscheidung). Der App-Bereich zeigt ihre Widgets mit „Update wartet“, ein Klick führt zur Entscheidung statt einzufügen. (#681) (German only)
  • Neue Routen der Organisation: GET /v1/me/apps/updates und GET /v1/me/apps/{appId}/update liefern die Entscheidung über ein Update (Fassung von und nach, Gründe, Neues, Änderungen in Klartext, Folgen, Frist, ob Ablehnen noch geht), POST /v1/me/apps/{appId}/update/accept und …/update/reject entscheiden mit dem Hash der Ziel-Fassung. (#680) (German only)
  • Kanäle mit Publikum: GET|PUT /v1/me/apps/beta-enrollment und POST|DELETE /v1/me/apps/{appId}/beta-enrollment tragen eine Organisation für Fassungen aus beta ein, global oder je App. Store, App-Seite, Installation und Upgrade nehmen die höchste Fassung, die die Organisation sieht, die Liste trägt dazu channel. (#680) (German only)
  • Schwimmende Pins: effectiveAppVersion(pin, installed) in @szenera/contracts/composition. Die Momentaufnahme nennt die gespielte Fassung. GET /v1/me/apps/{appId}/scene-pins und POST …/scene-pins/lift heben alle Szenen auf die installierte Fassung, je Szene als neue veröffentlichte Fassung. (#680) (German only)
  • POST /v1/marketplace/apps/{appId}/upgrade geht nur vorwärts und nur auf Fassungen, die die Organisation sieht. Neuer Fehlercode App.UpdateUnavailable (409, details.reason: not-forward, none, not-rejectable). (#680) (German only)
  • Entfallen sind GET /v1/me/pending-reacceptances, POST /v1/marketplace/apps/{appId}/accept und …/reject samt ihren Verträgen. RetireAppReleaseRequest nimmt grace und securityAdvisory statt graceMonths. (#680) (German only)
  • Neue Ereignisse marketplace.app.update-declined, marketplace.app.update-withdrawn und marketplace.app.release-switched. app-catalog.app-release.retired und …grace-expired tragen successorVersion. Ein Grant trägt declinedReleaseId und declinedVersion, ein Nachweis reasons, eine Fassung securityAdvisory. (#680) (German only)
  • @szenera/client und @szenera/api-client: neu me.appsUpdates.list, me.appsUpdate.list/accept/reject, me.appsBetaEnrollment.* und me.appsScenePins.list/lift, entfallen me.pendingReacceptances und marketplace.marketplaceApps.accept/reject. szenera app accept und app reject nutzen die neuen Routen, ihre Aufrufe bleiben gleich. (#680) (German only)
  • @szenera/client und @szenera/cli bündeln die erweiterten Verträge der Plattform. Ihre Aufrufe und Befehle bleiben, wie sie sind. (#697) (German only)
  • @szenera/contracts baut je Quelldatei ein Modul (dist/<domain>/<pfad>.js), und die exports-Karte trägt das Muster ./*: Jedes Blatt ist ladbar (@szenera/contracts/app-catalog/app-manifest/locked-app). Die benannten Subpaths bleiben, auch die drei des Host-Vertrags der App-Laufzeit (composition, media-library, shared): appRuntimeHostSpecifiers steht unverändert, die Import-Map der Anzeige kennt keinen neuen Namen. Ein Import aus einem Barrel kostet nur noch die Blätter, deren Exporte gebraucht werden (sideEffects nennt allein openapi-extend). (#688) (German only)
  • Jede Datei, deren Code .openapi(…) ruft, importiert openapi-extend selbst. Wer ein Blatt direkt lädt, braucht den Barrel seiner Domäne nicht mehr, damit die Zod-Erweiterung vor dem Schema läuft. (#688) (German only)
  • @szenera/apps-sdk liest Widget-Definition, Konfigurations-Schema und Manifest aus den Blättern des App-Katalogs statt aus dessen Barrel. (#688) (German only)
  • @szenera/client und @szenera/cli: Die Archive sind neu geschnitten, weil die eingebündelten Verträge ihre Nebenwirkungs-Importe je Blatt tragen. Oberfläche und Deckel bleiben, wie sie sind. (#688) (German only)
  • Neue Routen des Stores (session): GET /v1/me/apps/store (Karten, Filter mit Zahlen, Zählung, Kernfunktionen), GET /v1/me/apps/store/{appId} (Eintrag mit fertig entschiedener Lage, Sprache per locale oder Accept-Language), GET /v1/me/apps/collections, GET /v1/me/apps/{appId}/installed (App-Seite der installierten Fassung), POST /v1/me/apps/{appId}/install-request, POST /v1/me/apps/{appId}/update/decision-request, GET /v1/me/apps/{appId}/data, POST und DELETE /v1/me/apps/{appId}/data/deletion. Fehler OwnerRequest.NotApplicable, AppData.NotDeletable und AppData.DeletionNotFound. (#688) (German only)
  • Neue Pflege-Routen (Betreiber): GET, POST /v1/platform/app-catalog/collections, PATCH …/collections/{collectionKey}, PUT …/collections/order. (#688) (German only)
  • @szenera/contracts: StoreEntryView, StoreCardView, StoreSituation (Lage, genau eine Handlung, Grund mit Zahlen), Sammlungen, Bitten, App-Daten. Das Manifest trägt am Ende den optionalen Block compatibility. preview.screenshots wird nicht mehr gelesen, und die Liste des Marktplatzes führt es nicht mehr (Bruch). InstalledApp.coreFeature, GetAppUpdateResponse.decisionRequest, SetPlayerProgramResponse.warnings, vertical an der Organisation und im Profil. (#688) (German only)
  • @szenera/client und @szenera/api-client: me.appsStore, me.appsCollections, me.appsInstalled, me.apps.installRequest, me.appsUpdate.decisionRequest, me.appsData, me.appsDataDeletion, platform.appCatalogCollections. @szenera/cli bündelt die erweiterten Verträge, seine Befehle bleiben, wie sie sind. @szenera/agent kennt die neuen Fehlercodes. (#688) (German only)
  • @szenera/apps-sdk: AppLifecycleHooks hat zwei weitere freiwillige Punkte, inventory(tenantId) (Einträge je Datenbereich) und purge(tenantId) (alles endgültig löschen, idempotent). Sie kommen nur zusammen, eine Klasse mit nur einem von beiden lehnt der Boot ab. (#688) (German only)
  • @szenera/contracts: Das Manifest trägt translations, je Sprache ein Block nur mit Texten (AppManifestTranslationsSchema). Dazu appManifestLocales(), localizeAppManifest() und appManifestTranslationIssues(). Der Store antwortet in locale oder Accept-Language und nennt die Sprache der Texte in textLocale. Entfallen sind MarketplaceAppListingSchema und die Anwendungsfälle der entfallenen Routen, GetInstalledAppResponse trägt history, die Store-Übersicht coreFeatures mit der angebotenen Fassung. PortalFeatureEntry trägt keinen Namen mehr, die Namen stehen in den Texten des Stores. (#699) (German only)
  • @szenera/client: client.marketplace.apps.list und .get sowie client.me.installedApps sind entfallen, client.me.apps.list({ locale }) liefert die installierten Apps. (#699) (German only)
  • @szenera/apps-sdk: defineAppManifest wirft bei einem unvollständigen Übersetzungsblock und nennt die Stelle. (#699) (German only)
  • @szenera/widget-editor: schemaFieldText(schema, pfad) und splitFieldDescription() lesen Beschriftung und Hilfe eines Felds aus .describe('Titel|Satz'), APP_CATEGORY_LABEL_KEYS ordnet die Kategorien den Beschriftungen der Palette zu. (#699) (German only)
  • @szenera/cli liest Apps über die Store-Routen, die Befehle bleiben, wie sie sind. (#699) (German only)

0.2.1

No entry for developers.

0.2.0

Breaking changes

  • Die Kommandozeile heißt jetzt szenera. Das Paket @szenera/cli liefert das Programm unter diesem Namen aus, der Name signage entfällt ohne Übergang. (#618) (German only)
  • Die Umgebungsvariablen heißen SZENERA_PROFILE, SZENERA_BASE_URL, SZENERA_API_KEY, SZENERA_OUTPUT und SZENERA_PROFILE_FILE. Variablen mit dem Präfix SIGNAGE_ liest die Kommandozeile nicht mehr. (#618) (German only)
  • Die Profil-Datei liegt unter ~/.config/szenera/profile.json. Ein zwischengespeichertes Zugriffsmerkmal liegt daneben, nach dem Umzug meldet sich die Kommandozeile einmal neu an. (#618) (German only)
  • In der Sitzungsliste erscheint die Kommandozeile als szenera-cli mit ihrer Fassung. (#618) (German only)
  • Die Befehle des Plattformbetriebs sind nicht mehr enthalten. szenera führt 122 Befehle für Organisationen: Medien, Szenen, Programme, Geräte, Team, Schlüssel, Abonnement und den Notausgang api. (#618) (German only)
  • Ein Profil für den Plattformbetrieb ("audience": "operator") weist die Kommandozeile beim Lesen ab. (#618) (German only)
  • permission catalog --key-eligible zeigt jetzt die Rechte, die ein Schlüssel der eigenen Organisation tragen darf. (#618) (German only)
  • invoice list kennt die Flagge --status nicht mehr. Für eine Organisation blieb sie bisher ohne Wirkung. (#618) (German only)
  • Die Pakete heißen jetzt @szenera/* und die Apps @szenera-app/*, Importe und Abhängigkeiten sind entsprechend anzupassen. (#610) (German only)

Changes

  • POST /v1/devices/:id/release mit reason ersetzt POST /v1/devices/:id/reset. (#601) (German only)
  • Neu sind POST /v1/devices/:id/block, PATCH /v1/devices/:id sowie release, block und unblock unter /v1/platform/ops/devices/:id. (#601) (German only)
  • POST /v1/players/:id/decommission entfällt, und DELETE /v1/players/:id nimmt die Angabe device mit reconnect, remove oder keep. (#601) (German only)
  • Der Zustand eines Geräts ist nur noch unclaimed, active oder blocked. (#601) (German only)
  • Neue Fehlercodes sind Auth.DeviceBlocked, Device.Blocked, Device.NotBlocked und Player.KeepDeviceNotAllowed, und Auth.DeviceSuspended entfällt. (#601) (German only)
  • Die Ereignisse identity.device.blocked und identity.device.unblocked kommen hinzu, identity.device.decommissioned entfällt, und identity.device.released trägt einen reason. (#601) (German only)
  • POST /v1/devices/register antwortet einem gekoppelten Gerät mit neuem Schlüssel mit 409 Device.ReregistrationPending und dem Gerätenamen in details.deviceName und ersetzt damit den Code Device.ReregistrationBlocked. (#607) (German only)
  • Neu ist POST /v1/devices/:id/reregistration mit decision keep, reconnect oder block samt reason, dazu der Fehlercode Device.ReregistrationNotPending. (#607) (German only)
  • Geräte tragen die Felder reregistrationRequestedAt, reregistrationAttempts, reregistrationSourceIp und reregistrationAllowedUntil. (#607) (German only)
  • Die Ereignisse identity.device.reregistration-requested und identity.device.reregistration-decided kommen hinzu, ebenso die Benachrichtigungs-Art identity.device-reregistration-requested. (#607) (German only)
  • Die Befehlsart factory-reset entfällt, denn ein Gerät wird nur noch über die Freigabe geleert. (#607) (German only)
  • Die Erstanmeldung eines Browsers unter der Kennung eines gekoppelten WebDisplays antwortet mit Device.AlreadyClaimed. (#607) (German only)
  • Der Block host der Gerätefähigkeiten kennt zwei weitere Plattformen: vega für Fire TV mit Vega OS und extension für die Erweiterung für Chrome. Bisher meldet kein Gerät sie. (#636) (German only)
  • Die Fähigkeiten eines Geräts kennen den Block remote nicht mehr. Die Erweiterung meldet sich im Block host mit platform: extension. Der Block host trägt dazu bridge (die Brückenfassung des Wirts) und bootStart (ob der Wirt von selbst startet). (#640) (German only)
  • Die Archive von @szenera/client und @szenera/cli werden jetzt geprüft, bevor eine Fassung erscheinen darf: Sie tragen nur die eigenen Dateien, keine Route außerhalb der öffentlichen Spezifikation und keinen Verweis auf ein unveröffentlichtes Paket, und die Installation gelingt auf Node 22 und 24. (#620) (German only)
  • Die gepackte Größe jedes Archivs ist gedeckelt, und jedes Archiv trägt einen Fingerabdruck seiner Dateien. Ändert sich ein Archiv, gehört dazu eine neue Fassung. (#620) (German only)
  • @szenera/cli bringt Kern, Befehle, die Module des öffentlichen Klienten und die Verträge in einer einzigen Datei mit. @szenera/client bringt seine Typen je Unterpfad mit und braucht neben zod nichts aus der Plattform. (#620) (German only)
  • Die Kommandozeile nimmt nur noch Schlüssel einer Organisation (ak_…) an und nennt in ihrer Kennung die Fassung aus ihrem eigenen Manifest. (#620) (German only)
  • Veröffentlicht ist weiterhin nichts. (#620) (German only)
  • Der Herzschlag eines Geräts nennt im Block renderer die Fassung, den Bau und die Quelle der Anzeige (bundle oder hosted), dazu die Folge der zuletzt angenommenen Freigabe und seit wann das Bündel aktiv ist. Alle Felder sind optional. (#633) (German only)
  • Geräte tragen statt runtime den Block software (je Baustein Fassung, Bau und angenommene Freigabe), dazu channel und softwareTarget, das Soll ihres Kanals. Player tragen kein capabilities mehr, der gemeldete Zustand kein reportedState.capabilities. Was ein Gerät kann, steht in seinen Fähigkeiten, deren Block software runtime ersetzt. (#642) (German only)
  • Der Zustand der Anzeige (lastTelemetry.renderer) nennt das Bau-Profil (modern oder legacy). (#642) (German only)
  • PlayerCapabilitySchema und die beiden OS_CHANNELS entfallen, ReleaseChannel lebt in @szenera/contracts/shared neben PROTOCOL_SERVED. Die Selbstsicht trägt channel und softwareTarget. channel fehlt, solange die Cloud keinen Kanal für das Gerät führt, currentOsChannel bleibt für ältere Fernwartungen. (#642) (German only)
  • Beispiele der Vorfassungen je Naht liegen unter packages/contracts/src/samples/protocols/, Tests in TypeScript und Go legen sie den heutigen Lesern vor. (#642) (German only)
  • Die Kommandozeile ändert kein Verhalten. Ihr Archiv trägt den neuen Stand der Verträge (Servicemenü am Gerät), deshalb ein neuer Fingerabdruck. (#628) (German only)
  • HOST_EDITIONS, HostEditionSchema und HostEdition stehen in @szenera/contracts/fleet und im Einstieg @szenera/contracts/fleet/host-bridge. Die Beschreibung eines Wirts in @szenera/host-bridge nimmt edition. (#653) (German only)
  • Das Archiv von @szenera/cli ist mit esbuild 0.28 neu gebündelt. Befehle und Verhalten sind unverändert, nur der Fingerabdruck des Archivs ist neu. (#621) (German only)

0.1.0

Stand vor den Änderungsnotizen — die erste Fassung mit eigener Zahl. Was davor geschah, steht im Verlauf des Quellbaums; diese Liste beginnt mit der nächsten Fassung. (German only)

@szenera/client

0.6.0 · 2026-10-25

Breaking changes

  • analytics.analyticsReports is @beta and carries a SavedExploreQuery as its query. The only formats are csv and pdf. Upgrade: Recreate reports as a query of the ad hoc analysis. (#822)
  • analytics.analyticsPlayback, analytics.playersPlayback, analytics.mediaAssetsPlayback, analytics.analyticsInsightsOverview, and analytics.analyticsInsights are removed. Upgrade: Read the new analytics through analytics.analyticsOverview, analytics.analyticsPlayersDay, and analytics.analyticsExplore. (#822)
  • Entries of playlists and of the timeline of a display know the kind adPod, the ad break with slots, spot length, and filler. Upgrade: Handle entries with kind: 'adPod' when reading playlists and timelines. (#822)

Added

  • analytics.analyticsExplore.create and .export, analytics.analyticsCatalog.list and analytics.analyticsOverview.list (beta) for query, catalog, output, and overview. (#822)
  • analytics.analyticsPlayersDay.list, analytics.analyticsPlayersPlays.list, analytics.analyticsContent.list and .byId, analytics.analyticsCampaignsDelivery.list (beta). (#822)
  • fleet.playersScreenshots.list and fleet.playersScreenshots.byId (beta) read the time series of screenshots of a display. (#822)
  • analytics.analyticsProofs (list, byId, interim), analytics.analyticsProofsFiles.byId, and analytics.analyticsShareLinks (list, create, remove), all beta. (#822)
  • analytics.publicProofKeys.list, analytics.publicProofs.verify, and analytics.publicCampaignReports (open, proofFile) call without sign-in, all beta. (#822)
  • advertising.advertisingRevenue.list (beta) reads the revenue statements of the organization, with allocation per ad campaign and a reference to the credit note. (#822)
  • The factory accepts authBaseUrl. Sign-in, session, OAuth, SCIM, and invitation go to this host, everything else to baseUrl. Without the setting, nothing changes. (#825)
  • analytics.publicCampaignReports.open returns campaignId per proof. (#822)
  • New module advertising (beta): advertisers, ad campaigns, bookings, creatives, ad space, audience, participation, and settings. (#822)
  • Locations carry venueType, the type of venue. (#822)

Changed

  • analytics.analyticsPlayersDay.list names cec, ddc, or none as the source of the panel state and, as the reason for a plan revision, only what planning sets. (#822)
  • The bundled types follow the cleaned-up catalog of error codes and events. Codes and events of the removed distribution campaigns and the OS shelf no longer exist. (#847)

0.5.0 · 2026-10-23

Breaking changes

  • Das Paket nutzt das englische API-Format. Felder, Typen und Werte in Billing, Lizenzen, Abbildern und Bündeln heißen anders. Umstieg: Die Namen im eigenen Code ersetzen, etwa zielstand durch targetState und herkunft durch provenance. (#761) (German only)
  • me.apiKeys.remove(id, { reason }) verlangt den Grund owner-rotation oder compromised. Unter /v1/me antworten mit einem Schlüssel nur noch fünf Lesewege, alle übrigen mit 401. Umstieg: Den Grund mitsenden und Automation auf die fünf Lesewege beschränken. (#762) (German only)

Added

  • Dokumente: Varianten page-<n> und page-<n>-sm, pageCount an Medien und der Befund DocumentPagesChanged. (#801) (German only)
  • Die Typen folgen der API: Feed-Katalog, Quellen für den Betrieb und der Fehlercode FeedSource.NotFound. (#801) (German only)
  • Neue Aufrufe: Zusammenfassung, Sammelaktion und Wiederherstellen von Benachrichtigungen, dazu state und groupKey an der Liste. (#795) (German only)
  • playerId an der Vorschau der Widget-Daten und der Lesebereich player-location. (#801) (German only)
  • Standorte: region und openingHours, dazu das Ereignis fleet.location.opening-hours-changed. (#801) (German only)
  • Widget-Definitionen des Katalogs kennen size und preview.states, Ansichten des Stores kennen size. (#801) (German only)

Changed

  • Billing: zielstand heißt targetState, regel heißt rule, teilstorno heißt partialCancellation, staffel heißt tierScale, testphase heißt trialCredit. (#761) (German only)
  • Billing: belegteBildschirme heißt usedDisplays, zyklusVormerkung heißt pendingBillingCycle, restguthabenCents heißt remainingCreditCents, mindestBildschirme heißt minDisplays. (#761) (German only)
  • Lizenzen: konfliktBis heißt conflictUntil, lizenzKonfliktBis heißt licenseConflictUntil, vormerkungWirktAm heißt pendingChangeEffectiveAt, mandant heißt tenant. (#761) (German only)
  • Abbilder und Bündel: herkunft heißt provenance mit environment, appAnchor und otaAnchor. Die Liste der Abbilder filtert über ?environment=. (#761) (German only)
  • Rollen liest der Client über assignments mit roleId und expiresAt statt über roleIds. (#762) (German only)

0.4.0

Breaking changes

  • GET /v1/audit/bulk/:correlationId entfällt und mit ihm client.audit.auditBulk und das Schema GetBulkActionDetailResponse. (#742) (German only)
  • Das Recht audit.bulk.read, die Ereignisart audit.bulk-action.completed und der Fehlercode Internal.AuditBulkActionDetailRepositoryUnavailable entfallen. (#742) (German only)

0.3.0

Breaking changes

  • Neue Routen der Organisation: GET /v1/me/apps/updates und GET /v1/me/apps/{appId}/update liefern die Entscheidung über ein Update (Fassung von und nach, Gründe, Neues, Änderungen in Klartext, Folgen, Frist, ob Ablehnen noch geht), POST /v1/me/apps/{appId}/update/accept und …/update/reject entscheiden mit dem Hash der Ziel-Fassung. (#680) (German only)
  • Kanäle mit Publikum: GET|PUT /v1/me/apps/beta-enrollment und POST|DELETE /v1/me/apps/{appId}/beta-enrollment tragen eine Organisation für Fassungen aus beta ein, global oder je App. Store, App-Seite, Installation und Upgrade nehmen die höchste Fassung, die die Organisation sieht, die Liste trägt dazu channel. (#680) (German only)
  • Schwimmende Pins: effectiveAppVersion(pin, installed) in @szenera/contracts/composition. Die Momentaufnahme nennt die gespielte Fassung. GET /v1/me/apps/{appId}/scene-pins und POST …/scene-pins/lift heben alle Szenen auf die installierte Fassung, je Szene als neue veröffentlichte Fassung. (#680) (German only)
  • POST /v1/marketplace/apps/{appId}/upgrade geht nur vorwärts und nur auf Fassungen, die die Organisation sieht. Neuer Fehlercode App.UpdateUnavailable (409, details.reason: not-forward, none, not-rejectable). (#680) (German only)
  • Entfallen sind GET /v1/me/pending-reacceptances, POST /v1/marketplace/apps/{appId}/accept und …/reject samt ihren Verträgen. RetireAppReleaseRequest nimmt grace und securityAdvisory statt graceMonths. (#680) (German only)
  • Neue Ereignisse marketplace.app.update-declined, marketplace.app.update-withdrawn und marketplace.app.release-switched. app-catalog.app-release.retired und …grace-expired tragen successorVersion. Ein Grant trägt declinedReleaseId und declinedVersion, ein Nachweis reasons, eine Fassung securityAdvisory. (#680) (German only)
  • @szenera/client und @szenera/api-client: neu me.appsUpdates.list, me.appsUpdate.list/accept/reject, me.appsBetaEnrollment.* und me.appsScenePins.list/lift, entfallen me.pendingReacceptances und marketplace.marketplaceApps.accept/reject. szenera app accept und app reject nutzen die neuen Routen, ihre Aufrufe bleiben gleich. (#680) (German only)
  • Neue Routen des Stores (session): GET /v1/me/apps/store (Karten, Filter mit Zahlen, Zählung, Kernfunktionen), GET /v1/me/apps/store/{appId} (Eintrag mit fertig entschiedener Lage, Sprache per locale oder Accept-Language), GET /v1/me/apps/collections, GET /v1/me/apps/{appId}/installed (App-Seite der installierten Fassung), POST /v1/me/apps/{appId}/install-request, POST /v1/me/apps/{appId}/update/decision-request, GET /v1/me/apps/{appId}/data, POST und DELETE /v1/me/apps/{appId}/data/deletion. Fehler OwnerRequest.NotApplicable, AppData.NotDeletable und AppData.DeletionNotFound. (#688) (German only)
  • Neue Pflege-Routen (Betreiber): GET, POST /v1/platform/app-catalog/collections, PATCH …/collections/{collectionKey}, PUT …/collections/order. (#688) (German only)
  • @szenera/contracts: StoreEntryView, StoreCardView, StoreSituation (Lage, genau eine Handlung, Grund mit Zahlen), Sammlungen, Bitten, App-Daten. Das Manifest trägt am Ende den optionalen Block compatibility. preview.screenshots wird nicht mehr gelesen, und die Liste des Marktplatzes führt es nicht mehr (Bruch). InstalledApp.coreFeature, GetAppUpdateResponse.decisionRequest, SetPlayerProgramResponse.warnings, vertical an der Organisation und im Profil. (#688) (German only)
  • @szenera/client und @szenera/api-client: me.appsStore, me.appsCollections, me.appsInstalled, me.apps.installRequest, me.appsUpdate.decisionRequest, me.appsData, me.appsDataDeletion, platform.appCatalogCollections. @szenera/cli bündelt die erweiterten Verträge, seine Befehle bleiben, wie sie sind. @szenera/agent kennt die neuen Fehlercodes. (#688) (German only)
  • @szenera/apps-sdk: AppLifecycleHooks hat zwei weitere freiwillige Punkte, inventory(tenantId) (Einträge je Datenbereich) und purge(tenantId) (alles endgültig löschen, idempotent). Sie kommen nur zusammen, eine Klasse mit nur einem von beiden lehnt der Boot ab. (#688) (German only)
  • @szenera/contracts: Das Manifest trägt translations, je Sprache ein Block nur mit Texten (AppManifestTranslationsSchema). Dazu appManifestLocales(), localizeAppManifest() und appManifestTranslationIssues(). Der Store antwortet in locale oder Accept-Language und nennt die Sprache der Texte in textLocale. Entfallen sind MarketplaceAppListingSchema und die Anwendungsfälle der entfallenen Routen, GetInstalledAppResponse trägt history, die Store-Übersicht coreFeatures mit der angebotenen Fassung. PortalFeatureEntry trägt keinen Namen mehr, die Namen stehen in den Texten des Stores. (#699) (German only)
  • @szenera/client: client.marketplace.apps.list und .get sowie client.me.installedApps sind entfallen, client.me.apps.list({ locale }) liefert die installierten Apps. (#699) (German only)
  • @szenera/apps-sdk: defineAppManifest wirft bei einem unvollständigen Übersetzungsblock und nennt die Stelle. (#699) (German only)
  • @szenera/widget-editor: schemaFieldText(schema, pfad) und splitFieldDescription() lesen Beschriftung und Hilfe eines Felds aus .describe('Titel|Satz'), APP_CATEGORY_LABEL_KEYS ordnet die Kategorien den Beschriftungen der Palette zu. (#699) (German only)
  • @szenera/cli liest Apps über die Store-Routen, die Befehle bleiben, wie sie sind. (#699) (German only)

Changes

  • @szenera/contracts: neu CatalogAppSchema, AppReleaseNotesSchema (Notizen je Zielgruppe und Sprache), AppReleaseEventSchema, RestoreAppRelease*, ListAppReleaseHistory* und GetAppVersionHistory*. Ein AppRelease trägt notes, die Wire-Form daneben weiter releaseNotes. PATCH /v1/platform/app-catalog/apps/{appId}/releases/{id} nimmt notes je Zielgruppe oder wie bisher releaseNotes. (#677) (German only)
  • Ein Grant trägt installedReleaseId, pendingReleaseId, pendingReasons und pendingDeadline, ein Zustimmungs-Nachweis releaseId, eine offene Zustimmung fromVersion, toVersion, reasons und deadline. Entfallen sind autoUpgrade am Grant und ConfigSchemaChangedPayloadSchema. (#677) (German only)
  • GET /v1/apps/{appId}/history liefert einer Organisation die Fassungen einer App, die stable erreicht haben, mit Datum und „Neu in dieser Fassung" in der erbetenen Sprache (?locale=en-US, ohne Angabe Deutsch). (#677) (German only)
  • @szenera/api-client: neu client.platform.appCatalogAppsHistory.list, client.platform.appCatalogAppsReleases.restore und client.appCatalog.appsHistory.list. @szenera/client: neu client.appCatalog.appsHistory.list. @szenera/cli bündelt die neuen Verträge, ihre Befehle bleiben, wie sie sind. (#677) (German only)
  • Das scenes-Bündel der Momentaufnahme trägt appVersions (je App die eine Fassung des Displays) sowie appRendererHosts und appWidgetTypes je <appId>@<version>, alle mit der Vorgabe {}. Die Pins der Szenen und Widgets nennen dieselbe Fassung. (#683) (German only)
  • displayAppVersion(pins, installed) in @szenera/contracts/composition rechnet die Fassung eines Displays: die installierte, bei gehaltenen Pins älterer Hauptnummern die niedrigste davon. (#683) (German only)
  • Die neue Befundart AppVersionHeld ist immer eine Warnung und trägt appId, appName, version, installedVersion und widgetIds. Die KI-Anbindung erklärt sie. (#683) (German only)
  • @szenera/client: Der Filter type der Integritäts-Befunde einer Szene kennt AppVersionHeld. @szenera/cli bündelt den erweiterten Vertrag, ihre Befehle bleiben, wie sie sind. (#683) (German only)
  • Ein Zustimmungs-Nachweis trägt version, die Nummer der Fassung, der zugestimmt wurde (null nur bei Nachweisen von davor, deren Fassung schon fehlte). Eine Installation trägt declinedAt neben declinedVersion. (#681) (German only)
  • GET /v1/apps/{appId}/history nennt je Fassung releaseId, dieselbe Kennung wie an Installation, Nachweis und Update-Entscheidung. (#681) (German only)
  • @szenera/client: client.appCatalog.appsHistory.list nennt je Fassung releaseId, eine Installation trägt declinedAt. @szenera/cli bündelt die erweiterten Verträge, ihre Befehle bleiben, wie sie sind. (#681) (German only)
  • @szenera/widget-editor: EditorShell nimmt appsAwaitingUpdate (Apps samt Weg zur Entscheidung). Der App-Bereich zeigt ihre Widgets mit „Update wartet“, ein Klick führt zur Entscheidung statt einzufügen. (#681) (German only)
  • @szenera/client und @szenera/cli bündeln die erweiterten Verträge der Plattform. Ihre Aufrufe und Befehle bleiben, wie sie sind. (#697) (German only)
  • @szenera/contracts baut je Quelldatei ein Modul (dist/<domain>/<pfad>.js), und die exports-Karte trägt das Muster ./*: Jedes Blatt ist ladbar (@szenera/contracts/app-catalog/app-manifest/locked-app). Die benannten Subpaths bleiben, auch die drei des Host-Vertrags der App-Laufzeit (composition, media-library, shared): appRuntimeHostSpecifiers steht unverändert, die Import-Map der Anzeige kennt keinen neuen Namen. Ein Import aus einem Barrel kostet nur noch die Blätter, deren Exporte gebraucht werden (sideEffects nennt allein openapi-extend). (#688) (German only)
  • Jede Datei, deren Code .openapi(…) ruft, importiert openapi-extend selbst. Wer ein Blatt direkt lädt, braucht den Barrel seiner Domäne nicht mehr, damit die Zod-Erweiterung vor dem Schema läuft. (#688) (German only)
  • @szenera/apps-sdk liest Widget-Definition, Konfigurations-Schema und Manifest aus den Blättern des App-Katalogs statt aus dessen Barrel. (#688) (German only)
  • @szenera/client und @szenera/cli: Die Archive sind neu geschnitten, weil die eingebündelten Verträge ihre Nebenwirkungs-Importe je Blatt tragen. Oberfläche und Deckel bleiben, wie sie sind. (#688) (German only)

0.2.1

No entry for developers.

0.2.0

Breaking changes

  • Die Fähigkeiten eines Geräts kennen den Block remote nicht mehr. Die Erweiterung meldet sich im Block host mit platform: extension. Der Block host trägt dazu bridge (die Brückenfassung des Wirts) und bootStart (ob der Wirt von selbst startet). (#640) (German only)
  • Geräte tragen statt runtime den Block software (je Baustein Fassung, Bau und angenommene Freigabe), dazu channel und softwareTarget, das Soll ihres Kanals. Player tragen kein capabilities mehr, der gemeldete Zustand kein reportedState.capabilities. Was ein Gerät kann, steht in seinen Fähigkeiten, deren Block software runtime ersetzt. (#642) (German only)
  • Der Zustand der Anzeige (lastTelemetry.renderer) nennt das Bau-Profil (modern oder legacy). (#642) (German only)
  • PlayerCapabilitySchema und die beiden OS_CHANNELS entfallen, ReleaseChannel lebt in @szenera/contracts/shared neben PROTOCOL_SERVED. Die Selbstsicht trägt channel und softwareTarget. channel fehlt, solange die Cloud keinen Kanal für das Gerät führt, currentOsChannel bleibt für ältere Fernwartungen. (#642) (German only)
  • Beispiele der Vorfassungen je Naht liegen unter packages/contracts/src/samples/protocols/, Tests in TypeScript und Go legen sie den heutigen Lesern vor. (#642) (German only)
  • HOST_EDITIONS, HostEditionSchema und HostEdition stehen in @szenera/contracts/fleet und im Einstieg @szenera/contracts/fleet/host-bridge. Die Beschreibung eines Wirts in @szenera/host-bridge nimmt edition. (#653) (German only)

Changes

  • Der Block host der Gerätefähigkeiten kennt zwei weitere Plattformen: vega für Fire TV mit Vega OS und extension für die Erweiterung für Chrome. Bisher meldet kein Gerät sie. (#636) (German only)
  • Neu ist das Paket @szenera/client, der öffentliche TypeScript-Klient der Schnittstelle. Er spricht genau die Operationen der öffentlichen Spezifikation, je Bereich ein Namensraum, und weist sich mit einem API-Schlüssel ak_… oder dem Zugriffstoken oat_… eines delegierten Zugangs aus. Veröffentlicht wird er noch nicht. (#617) (German only)
  • Jede Methode beider Klienten trägt die Kurzbeschreibung ihrer Operation als Kommentar. Junge Operationen tragen zusätzlich @beta, auslaufende @deprecated mit ihrem Abschalt-Tag. (#617) (German only)
  • Die anmeldefreien Routen GET /v1/public/status und GET /v1/public/maintenance-status stehen im eigenen Bereich status statt unter ops-console. Im Klienten heißt ihr Namensraum deshalb status statt opsConsole. (#617) (German only)
  • Die öffentliche Spezifikation führt die Sitzung und die Einrichtung der Betreiber-Konten nicht mehr (POST /v1/auth/operator/refresh, POST /v1/auth/onboarding/consume). Sie nennt keinen Server auf localhost mehr und nur noch die Ausweisarten, die eine ihrer Operationen annimmt. (#617) (German only)
  • Das Sicherheitsverfahren cookie nennt das Cookie, das es wirklich gibt: refresh_token, gelesen nur von POST /v1/auth/refresh. (#617) (German only)
  • Die Beispiele der Spezifikation zeigen Geräte-Adressen aus dem Dokumentationsbereich 192.0.2.0/24. (#617) (German only)
  • @szenera/api-client/factory bietet mit createBearerClientWith einen Klienten mit festem Merkmal und frei gewählten Modulen. (#617) (German only)
  • Die Archive von @szenera/client und @szenera/cli werden jetzt geprüft, bevor eine Fassung erscheinen darf: Sie tragen nur die eigenen Dateien, keine Route außerhalb der öffentlichen Spezifikation und keinen Verweis auf ein unveröffentlichtes Paket, und die Installation gelingt auf Node 22 und 24. (#620) (German only)
  • Die gepackte Größe jedes Archivs ist gedeckelt, und jedes Archiv trägt einen Fingerabdruck seiner Dateien. Ändert sich ein Archiv, gehört dazu eine neue Fassung. (#620) (German only)
  • @szenera/cli bringt Kern, Befehle, die Module des öffentlichen Klienten und die Verträge in einer einzigen Datei mit. @szenera/client bringt seine Typen je Unterpfad mit und braucht neben zod nichts aus der Plattform. (#620) (German only)
  • Die Kommandozeile nimmt nur noch Schlüssel einer Organisation (ak_…) an und nennt in ihrer Kennung die Fassung aus ihrem eigenen Manifest. (#620) (German only)
  • Veröffentlicht ist weiterhin nichts. (#620) (German only)
  • Der Herzschlag eines Geräts nennt im Block renderer die Fassung, den Bau und die Quelle der Anzeige (bundle oder hosted), dazu die Folge der zuletzt angenommenen Freigabe und seit wann das Bündel aktiv ist. Alle Felder sind optional. (#633) (German only)
  • Neue Verträge DeviceServiceStatus, RendererServiceStatus und ServiceFinding in @szenera/contracts/fleet. (#628) (German only)
  • GET /v1/devices/me liefert deviceName, den Namen aus der Geräteakte. (#628) (German only)
  • Der Herzschlag nimmt appFailures an, höchstens 20 je Meldung mit dem Grund missing, rejected oder failed. Der Agent füllt time.offsetMs mit dem Versatz seiner Uhr zur Cloud. (#628) (German only)
  • Die Ereignis-Kategorie service bringt die Codes service.menu-opened (input) und service.menu-closed (reason). Der Agent meldet jetzt auch content.bundle-failed. (#628) (German only)
  • Der Agent bedient auf 127.0.0.1:8081 die Seite des Menüs und GET /v1/status, /v1/report, /v1/input, /v1/backdrop sowie POST /v1/open und /v1/close. service.menu-opened entsteht erst, wenn die Seite das Öffnen meldet. Origin: null bekommt 403, außer die Startseite mit ihrem Schlüssel im Kopf X-Service-Token. Der Eingabe-Wächter szenera-input-watch ist ein eigenes Programm im selben Go-Modul. (#628) (German only)
  • Der Katalog der Befunde kennt app-bundle-download-failed (appId, version, appName, httpStatus, since). Die App-Befunde tragen appName, wifi-weak und clock-skew den Auslöser trigger. (#628) (German only)

0.1.0

Die erste Fassung mit eigener Zahl, noch nicht veröffentlicht. Diese Liste beginnt mit der nächsten Fassung. (German only)