Pakete und ihre Fassungen
Welche Fassung von API-Client, Apps-SDK, CLI und Verträgen gilt und was sich in jeder Fassung für Entwickler geändert hat.
26 Minuten LesezeitÄnderungenStand: 25.10.2026
Auf dieser Seite
Bevor Sie loslegen
- Für wen
- Entwicklerinnen und Entwickler, die mit einem dieser Pakete arbeiten und wissen wollen, was sich in einer Fassung geändert hat.
- Voraussetzung
- keine.
Fassung und Änderungen der Pakete für Entwickler — API-Client, Apps-SDK, CLI und Verträge, das Neueste zuerst.
Die Liste entsteht mit jeder neuen Fassung aus den Änderungsnotizen der Plattform und zeigt deren Abschnitt für Entwickler. Einen öffentlichen Bezugsweg für die Pakete gibt es heute nicht; die Seite sagt, welche Fassung gilt und was sich darin geändert hat.
| Paket | Fassung |
|---|---|
@szenera/cli |
0.4.0 |
@szenera/client |
0.6.0 |
@szenera/cli
0.4.0 · 2026-10-25
Breaking changes
- Der gespeicherte Anmeldestand trägt die Felder
tokenundexpiresAt. Umstieg: Ein alter Anmeldestand gilt als nicht angemeldet, die nächste Anmeldung schreibt den neuen. (#821)
Added
- Neue Befehle
szenera proof list,szenera proof showundszenera proof download. (#822) - Neue Befehle
szenera analytics overview,szenera analytics exploreundszenera analytics delivery <acp_…>. (#822) - Neue Befehle
advertiser list,advertiser get,advertiser create,campaign list,campaign get,booking list,creative listundcreative approve. (#822)
Changed
- Das Archiv folgt dem Klienten mit den Erlösaufstellungen, ohne neuen Befehl. (#822)
- Das Archiv folgt dem Klienten ohne die Lesewege der Minutenzählung und der Insights. Die Befehle bleiben. (#822)
- Das Archiv folgt dem Klienten mit den Panelquellen
cec,ddcundnone. Die Befehle bleiben. (#822) - Die Kommandozeile bringt den Client mit, der einen eigenen Anmelde-Wirt kennt. Ohne Einstellung ändert sich nichts. (#825)
- Das Archiv folgt dem Klienten mit
campaignIdje Nachweis des Kampagnenberichts. Die Befehle bleiben. (#822) - Das Archiv bündelt den aktuellen Stand der Verträge, die Befehle von
szenerableiben gleich. (#847) szenera playlist getzeigt einen Werbeblock als „Werbeblock · 3 Plätze à 10 s“ mit seiner Dauer. (#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)
szenera api-key revoke <akm_…> --compromisednennt den Grund des Widerrufs.szenera api-key listmit einem Schlüssel-Profil antwortet 401. Umstieg: Fürszenera api-key listein Profil mit Sitzung verwenden. (#762)
Added
- Die Typen folgen der API: Feed-Katalog, Quellen für den Betrieb und der Fehlercode
FeedSource.NotFound. (#801) - Neue Aufrufe: Zusammenfassung, Sammelaktion und Wiederherstellen von Benachrichtigungen, dazu
stateundgroupKeyan der Liste. (#795) playerIdan der Vorschau der Widget-Daten und der Lesebereichplayer-location. (#801)- Standorte:
regionundopeningHours, dazu das Ereignisfleet.location.opening-hours-changed. (#801) - Widget-Definitionen des Katalogs kennen
sizeundpreview.states, Ansichten des Stores kennensize. (#801)
0.2.3
Änderungen
GET /v1/audit/bulk/:correlationIdentfällt und mit ihmclient.audit.auditBulkund das SchemaGetBulkActionDetailResponse. (#742)- Das Recht
audit.bulk.read, die Ereignisartaudit.bulk-action.completedund der FehlercodeInternal.AuditBulkActionDetailRepositoryUnavailableentfallen. (#742)
0.2.2
Änderungen
@szenera/contracts: neuCatalogAppSchema,AppReleaseNotesSchema(Notizen je Zielgruppe und Sprache),AppReleaseEventSchema,RestoreAppRelease*,ListAppReleaseHistory*undGetAppVersionHistory*. EinAppReleaseträgtnotes, die Wire-Form daneben weiterreleaseNotes.PATCH /v1/platform/app-catalog/apps/{appId}/releases/{id}nimmtnotesje Zielgruppe oder wie bisherreleaseNotes. (#677)- Ein Grant trägt
installedReleaseId,pendingReleaseId,pendingReasonsundpendingDeadline, ein Zustimmungs-NachweisreleaseId, eine offene ZustimmungfromVersion,toVersion,reasonsunddeadline. Entfallen sindautoUpgradeam Grant undConfigSchemaChangedPayloadSchema. (#677) GET /v1/apps/{appId}/historyliefert 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)@szenera/api-client: neuclient.platform.appCatalogAppsHistory.list,client.platform.appCatalogAppsReleases.restoreundclient.appCatalog.appsHistory.list.@szenera/client: neuclient.appCatalog.appsHistory.list.@szenera/clibündelt die neuen Verträge, ihre Befehle bleiben, wie sie sind. (#677)- Das scenes-Bündel der Momentaufnahme trägt
appVersions(je App die eine Fassung des Displays) sowieappRendererHostsundappWidgetTypesje<appId>@<version>, alle mit der Vorgabe{}. Die Pins der Szenen und Widgets nennen dieselbe Fassung. (#683) displayAppVersion(pins, installed)in@szenera/contracts/compositionrechnet die Fassung eines Displays: die installierte, bei gehaltenen Pins älterer Hauptnummern die niedrigste davon. (#683)- Die neue Befundart
AppVersionHeldist immer eine Warnung und trägtappId,appName,version,installedVersionundwidgetIds. Die KI-Anbindung erklärt sie. (#683) @szenera/client: Der Filtertypeder Integritäts-Befunde einer Szene kenntAppVersionHeld.@szenera/clibündelt den erweiterten Vertrag, ihre Befehle bleiben, wie sie sind. (#683)- Ein Zustimmungs-Nachweis trägt
version, die Nummer der Fassung, der zugestimmt wurde (nullnur bei Nachweisen von davor, deren Fassung schon fehlte). Eine Installation trägtdeclinedAtnebendeclinedVersion. (#681) GET /v1/apps/{appId}/historynennt je FassungreleaseId, dieselbe Kennung wie an Installation, Nachweis und Update-Entscheidung. (#681)@szenera/client:client.appCatalog.appsHistory.listnennt je FassungreleaseId, eine Installation trägtdeclinedAt.@szenera/clibündelt die erweiterten Verträge, ihre Befehle bleiben, wie sie sind. (#681)@szenera/widget-editor:EditorShellnimmtappsAwaitingUpdate(Apps samt Weg zur Entscheidung). Der App-Bereich zeigt ihre Widgets mit „Update wartet“, ein Klick führt zur Entscheidung statt einzufügen. (#681)- Neue Routen der Organisation:
GET /v1/me/apps/updatesundGET /v1/me/apps/{appId}/updateliefern 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/acceptund…/update/rejectentscheiden mit dem Hash der Ziel-Fassung. (#680) - Kanäle mit Publikum:
GET|PUT /v1/me/apps/beta-enrollmentundPOST|DELETE /v1/me/apps/{appId}/beta-enrollmenttragen 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 dazuchannel. (#680) - Schwimmende Pins:
effectiveAppVersion(pin, installed)in@szenera/contracts/composition. Die Momentaufnahme nennt die gespielte Fassung.GET /v1/me/apps/{appId}/scene-pinsundPOST …/scene-pins/liftheben alle Szenen auf die installierte Fassung, je Szene als neue veröffentlichte Fassung. (#680) POST /v1/marketplace/apps/{appId}/upgradegeht nur vorwärts und nur auf Fassungen, die die Organisation sieht. Neuer FehlercodeApp.UpdateUnavailable(409,details.reason:not-forward,none,not-rejectable). (#680)- Entfallen sind
GET /v1/me/pending-reacceptances,POST /v1/marketplace/apps/{appId}/acceptund…/rejectsamt ihren Verträgen.RetireAppReleaseRequestnimmtgraceundsecurityAdvisorystattgraceMonths. (#680) - Neue Ereignisse
marketplace.app.update-declined,marketplace.app.update-withdrawnundmarketplace.app.release-switched.app-catalog.app-release.retiredund…grace-expiredtragensuccessorVersion. Ein Grant trägtdeclinedReleaseIdunddeclinedVersion, ein Nachweisreasons, eine FassungsecurityAdvisory. (#680) @szenera/clientund@szenera/api-client: neume.appsUpdates.list,me.appsUpdate.list/accept/reject,me.appsBetaEnrollment.*undme.appsScenePins.list/lift, entfallenme.pendingReacceptancesundmarketplace.marketplaceApps.accept/reject.szenera app acceptundapp rejectnutzen die neuen Routen, ihre Aufrufe bleiben gleich. (#680)@szenera/clientund@szenera/clibündeln die erweiterten Verträge der Plattform. Ihre Aufrufe und Befehle bleiben, wie sie sind. (#697)@szenera/contractsbaut je Quelldatei ein Modul (dist/<domain>/<pfad>.js), und dieexports-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):appRuntimeHostSpecifierssteht 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 (sideEffectsnennt alleinopenapi-extend). (#688)- Jede Datei, deren Code
.openapi(…)ruft, importiertopenapi-extendselbst. Wer ein Blatt direkt lädt, braucht den Barrel seiner Domäne nicht mehr, damit die Zod-Erweiterung vor dem Schema läuft. (#688) @szenera/apps-sdkliest Widget-Definition, Konfigurations-Schema und Manifest aus den Blättern des App-Katalogs statt aus dessen Barrel. (#688)@szenera/clientund@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)- 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 perlocaleoderAccept-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,POSTundDELETE /v1/me/apps/{appId}/data/deletion. FehlerOwnerRequest.NotApplicable,AppData.NotDeletableundAppData.DeletionNotFound. (#688) - Neue Pflege-Routen (Betreiber):
GET,POST /v1/platform/app-catalog/collections,PATCH …/collections/{collectionKey},PUT …/collections/order. (#688) @szenera/contracts:StoreEntryView,StoreCardView,StoreSituation(Lage, genau eine Handlung, Grund mit Zahlen), Sammlungen, Bitten, App-Daten. Das Manifest trägt am Ende den optionalen Blockcompatibility.preview.screenshotswird nicht mehr gelesen, und die Liste des Marktplatzes führt es nicht mehr (Bruch).InstalledApp.coreFeature,GetAppUpdateResponse.decisionRequest,SetPlayerProgramResponse.warnings,verticalan der Organisation und im Profil. (#688)@szenera/clientund@szenera/api-client:me.appsStore,me.appsCollections,me.appsInstalled,me.apps.installRequest,me.appsUpdate.decisionRequest,me.appsData,me.appsDataDeletion,platform.appCatalogCollections.@szenera/clibündelt die erweiterten Verträge, seine Befehle bleiben, wie sie sind.@szenera/agentkennt die neuen Fehlercodes. (#688)@szenera/apps-sdk:AppLifecycleHookshat zwei weitere freiwillige Punkte,inventory(tenantId)(Einträge je Datenbereich) undpurge(tenantId)(alles endgültig löschen, idempotent). Sie kommen nur zusammen, eine Klasse mit nur einem von beiden lehnt der Boot ab. (#688)@szenera/contracts: Das Manifest trägttranslations, je Sprache ein Block nur mit Texten (AppManifestTranslationsSchema). DazuappManifestLocales(),localizeAppManifest()undappManifestTranslationIssues(). Der Store antwortet inlocaleoderAccept-Languageund nennt die Sprache der Texte intextLocale. Entfallen sindMarketplaceAppListingSchemaund die Anwendungsfälle der entfallenen Routen,GetInstalledAppResponseträgthistory, die Store-ÜbersichtcoreFeaturesmit der angebotenen Fassung.PortalFeatureEntryträgt keinen Namen mehr, die Namen stehen in den Texten des Stores. (#699)@szenera/client:client.marketplace.apps.listund.getsowieclient.me.installedAppssind entfallen,client.me.apps.list({ locale })liefert die installierten Apps. (#699)@szenera/apps-sdk:defineAppManifestwirft bei einem unvollständigen Übersetzungsblock und nennt die Stelle. (#699)@szenera/widget-editor:schemaFieldText(schema, pfad)undsplitFieldDescription()lesen Beschriftung und Hilfe eines Felds aus.describe('Titel|Satz'),APP_CATEGORY_LABEL_KEYSordnet die Kategorien den Beschriftungen der Palette zu. (#699)@szenera/cliliest Apps über die Store-Routen, die Befehle bleiben, wie sie sind. (#699)
0.2.1
Ohne Eintrag für Entwickler.
0.2.0
Brüche
- Die Kommandozeile heißt jetzt
szenera. Das Paket@szenera/cliliefert das Programm unter diesem Namen aus, der Namesignageentfällt ohne Übergang. (#618) - Die Umgebungsvariablen heißen
SZENERA_PROFILE,SZENERA_BASE_URL,SZENERA_API_KEY,SZENERA_OUTPUTundSZENERA_PROFILE_FILE. Variablen mit dem PräfixSIGNAGE_liest die Kommandozeile nicht mehr. (#618) - 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) - In der Sitzungsliste erscheint die Kommandozeile als
szenera-climit ihrer Fassung. (#618) - Die Befehle des Plattformbetriebs sind nicht mehr enthalten.
szeneraführt 122 Befehle für Organisationen: Medien, Szenen, Programme, Geräte, Team, Schlüssel, Abonnement und den Notausgangapi. (#618) - Ein Profil für den Plattformbetrieb (
"audience": "operator") weist die Kommandozeile beim Lesen ab. (#618) permission catalog --key-eligiblezeigt jetzt die Rechte, die ein Schlüssel der eigenen Organisation tragen darf. (#618)invoice listkennt die Flagge--statusnicht mehr. Für eine Organisation blieb sie bisher ohne Wirkung. (#618)- Die Pakete heißen jetzt
@szenera/*und die Apps@szenera-app/*, Importe und Abhängigkeiten sind entsprechend anzupassen. (#610)
Änderungen
POST /v1/devices/:id/releasemitreasonersetztPOST /v1/devices/:id/reset. (#601)- Neu sind
POST /v1/devices/:id/block,PATCH /v1/devices/:idsowierelease,blockundunblockunter/v1/platform/ops/devices/:id. (#601) POST /v1/players/:id/decommissionentfällt, undDELETE /v1/players/:idnimmt die Angabedevicemitreconnect,removeoderkeep. (#601)- Der Zustand eines Geräts ist nur noch
unclaimed,activeoderblocked. (#601) - Neue Fehlercodes sind
Auth.DeviceBlocked,Device.Blocked,Device.NotBlockedundPlayer.KeepDeviceNotAllowed, undAuth.DeviceSuspendedentfällt. (#601) - Die Ereignisse
identity.device.blockedundidentity.device.unblockedkommen hinzu,identity.device.decommissionedentfällt, undidentity.device.releasedträgt einenreason. (#601) POST /v1/devices/registerantwortet einem gekoppelten Gerät mit neuem Schlüssel mit409 Device.ReregistrationPendingund dem Gerätenamen indetails.deviceNameund ersetzt damit den CodeDevice.ReregistrationBlocked. (#607)- Neu ist
POST /v1/devices/:id/reregistrationmitdecisionkeep,reconnectoderblocksamtreason, dazu der FehlercodeDevice.ReregistrationNotPending. (#607) - Geräte tragen die Felder
reregistrationRequestedAt,reregistrationAttempts,reregistrationSourceIpundreregistrationAllowedUntil. (#607) - Die Ereignisse
identity.device.reregistration-requestedundidentity.device.reregistration-decidedkommen hinzu, ebenso die Benachrichtigungs-Artidentity.device-reregistration-requested. (#607) - Die Befehlsart
factory-resetentfällt, denn ein Gerät wird nur noch über die Freigabe geleert. (#607) - Die Erstanmeldung eines Browsers unter der Kennung eines gekoppelten WebDisplays antwortet mit
Device.AlreadyClaimed. (#607) - Der Block
hostder Gerätefähigkeiten kennt zwei weitere Plattformen:vegafür Fire TV mit Vega OS undextensionfür die Erweiterung für Chrome. Bisher meldet kein Gerät sie. (#636) - Die Fähigkeiten eines Geräts kennen den Block
remotenicht mehr. Die Erweiterung meldet sich im Blockhostmitplatform: extension. Der Blockhostträgt dazubridge(die Brückenfassung des Wirts) undbootStart(ob der Wirt von selbst startet). (#640) - Die Archive von
@szenera/clientund@szenera/cliwerden 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) - 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)
@szenera/clibringt Kern, Befehle, die Module des öffentlichen Klienten und die Verträge in einer einzigen Datei mit.@szenera/clientbringt seine Typen je Unterpfad mit und braucht nebenzodnichts aus der Plattform. (#620)- Die Kommandozeile nimmt nur noch Schlüssel einer Organisation (
ak_…) an und nennt in ihrer Kennung die Fassung aus ihrem eigenen Manifest. (#620) - Veröffentlicht ist weiterhin nichts. (#620)
- Der Herzschlag eines Geräts nennt im Block
rendererdie Fassung, den Bau und die Quelle der Anzeige (bundleoderhosted), dazu die Folge der zuletzt angenommenen Freigabe und seit wann das Bündel aktiv ist. Alle Felder sind optional. (#633) - Geräte tragen statt
runtimeden Blocksoftware(je Baustein Fassung, Bau und angenommene Freigabe), dazuchannelundsoftwareTarget, das Soll ihres Kanals. Player tragen keincapabilitiesmehr, der gemeldete Zustand keinreportedState.capabilities. Was ein Gerät kann, steht in seinen Fähigkeiten, deren Blocksoftwareruntimeersetzt. (#642) - Der Zustand der Anzeige (
lastTelemetry.renderer) nennt das Bau-Profil (modernoderlegacy). (#642) PlayerCapabilitySchemaund die beidenOS_CHANNELSentfallen,ReleaseChannellebt in@szenera/contracts/sharednebenPROTOCOL_SERVED. Die Selbstsicht trägtchannelundsoftwareTarget.channelfehlt, solange die Cloud keinen Kanal für das Gerät führt,currentOsChannelbleibt für ältere Fernwartungen. (#642)- Beispiele der Vorfassungen je Naht liegen unter
packages/contracts/src/samples/protocols/, Tests in TypeScript und Go legen sie den heutigen Lesern vor. (#642) - Die Kommandozeile ändert kein Verhalten. Ihr Archiv trägt den neuen Stand der Verträge (Servicemenü am Gerät), deshalb ein neuer Fingerabdruck. (#628)
HOST_EDITIONS,HostEditionSchemaundHostEditionstehen in@szenera/contracts/fleetund im Einstieg@szenera/contracts/fleet/host-bridge. Die Beschreibung eines Wirts in@szenera/host-bridgenimmtedition. (#653)- Das Archiv von
@szenera/cliist mit esbuild 0.28 neu gebündelt. Befehle und Verhalten sind unverändert, nur der Fingerabdruck des Archivs ist neu. (#621)
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.
@szenera/client
0.6.0 · 2026-10-25
Breaking changes
analytics.analyticsReportssteht auf@betaund trägt als Abfrage eineSavedExploreQuery. Als Format gibt es nurcsvundpdf. Umstieg: Berichte als Abfrage der freien Auswertung neu anlegen. (#822)analytics.analyticsPlayback,analytics.playersPlayback,analytics.mediaAssetsPlayback,analytics.analyticsInsightsOverviewundanalytics.analyticsInsightsentfallen. Umstieg: Die neue Auswertung überanalytics.analyticsOverview,analytics.analyticsPlayersDayundanalytics.analyticsExplorelesen. (#822)- Einträge von Playlisten und der Zeitleiste eines Displays kennen die Art
adPod, den Werbeblock mit Plätzen, Spotlänge und Lückenfüller. Umstieg: Einträge mitkind: 'adPod'beim Lesen von Playlisten und Zeitleisten behandeln. (#822)
Added
analytics.analyticsExplore.createund.export,analytics.analyticsCatalog.listundanalytics.analyticsOverview.list(beta) für Abfrage, Katalog, Ausgabe und Überblick. (#822)analytics.analyticsPlayersDay.list,analytics.analyticsPlayersPlays.list,analytics.analyticsContent.listund.byId,analytics.analyticsCampaignsDelivery.list(beta). (#822)fleet.playersScreenshots.listundfleet.playersScreenshots.byId(beta) lesen die Zeitreihe der Bildschirmaufnahmen eines Displays. (#822)analytics.analyticsProofs(list,byId,interim),analytics.analyticsProofsFiles.byIdundanalytics.analyticsShareLinks(list,create,remove), alle beta. (#822)analytics.publicProofKeys.list,analytics.publicProofs.verifyundanalytics.publicCampaignReports(open,proofFile) rufen ohne Anmeldung, alle beta. (#822)advertising.advertisingRevenue.list(beta) liest die Erlösaufstellungen der Organisation, mit Verteilung je Werbekampagne und Verweis auf die Gutschrift. (#822)- Die Fabrik nimmt
authBaseUrlan. Anmeldung, Sitzung, OAuth, SCIM und Einladung gehen an diesen Wirt, alles andere anbaseUrl. Ohne die Einstellung ändert sich nichts. (#825) analytics.publicCampaignReports.openliefert je NachweiscampaignId. (#822)- Neues Modul
advertising(beta): Werbepartner, Werbekampagnen, Buchungen, Motive, Werbefläche, Publikum, Teilnahme und Stellgrößen. (#822) - Standorte tragen
venueType, die Art des Ladens. (#822)
Changed
analytics.analyticsPlayersDay.listnennt als Quelle des Panelzustandscec,ddcodernoneund als Grund einer Planfassung nur, was die Planung setzt. (#822)- Die mitgelieferten Typen folgen dem bereinigten Katalog der Fehlercodes und Ereignisse. Codes und Ereignisse der entfallenen Verteilungs-Kampagnen und des OS-Regals gibt es nicht mehr. (#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
zielstanddurchtargetStateundherkunftdurchprovenance. (#761) me.apiKeys.remove(id, { reason })verlangt den Grundowner-rotationodercompromised. Unter/v1/meantworten 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)
Added
- Dokumente: Varianten
page-<n>undpage-<n>-sm,pageCountan Medien und der BefundDocumentPagesChanged. (#801) - Die Typen folgen der API: Feed-Katalog, Quellen für den Betrieb und der Fehlercode
FeedSource.NotFound. (#801) - Neue Aufrufe: Zusammenfassung, Sammelaktion und Wiederherstellen von Benachrichtigungen, dazu
stateundgroupKeyan der Liste. (#795) playerIdan der Vorschau der Widget-Daten und der Lesebereichplayer-location. (#801)- Standorte:
regionundopeningHours, dazu das Ereignisfleet.location.opening-hours-changed. (#801) - Widget-Definitionen des Katalogs kennen
sizeundpreview.states, Ansichten des Stores kennensize. (#801)
Changed
- Billing:
zielstandheißttargetState,regelheißtrule,teilstornoheißtpartialCancellation,staffelheißttierScale,testphaseheißttrialCredit. (#761) - Billing:
belegteBildschirmeheißtusedDisplays,zyklusVormerkungheißtpendingBillingCycle,restguthabenCentsheißtremainingCreditCents,mindestBildschirmeheißtminDisplays. (#761) - Lizenzen:
konfliktBisheißtconflictUntil,lizenzKonfliktBisheißtlicenseConflictUntil,vormerkungWirktAmheißtpendingChangeEffectiveAt,mandantheißttenant. (#761) - Abbilder und Bündel:
herkunftheißtprovenancemitenvironment,appAnchorundotaAnchor. Die Liste der Abbilder filtert über?environment=. (#761) - Rollen liest der Client über
assignmentsmitroleIdundexpiresAtstatt überroleIds. (#762)
0.4.0
Brüche
GET /v1/audit/bulk/:correlationIdentfällt und mit ihmclient.audit.auditBulkund das SchemaGetBulkActionDetailResponse. (#742)- Das Recht
audit.bulk.read, die Ereignisartaudit.bulk-action.completedund der FehlercodeInternal.AuditBulkActionDetailRepositoryUnavailableentfallen. (#742)
0.3.0
Brüche
- Neue Routen der Organisation:
GET /v1/me/apps/updatesundGET /v1/me/apps/{appId}/updateliefern 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/acceptund…/update/rejectentscheiden mit dem Hash der Ziel-Fassung. (#680) - Kanäle mit Publikum:
GET|PUT /v1/me/apps/beta-enrollmentundPOST|DELETE /v1/me/apps/{appId}/beta-enrollmenttragen 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 dazuchannel. (#680) - Schwimmende Pins:
effectiveAppVersion(pin, installed)in@szenera/contracts/composition. Die Momentaufnahme nennt die gespielte Fassung.GET /v1/me/apps/{appId}/scene-pinsundPOST …/scene-pins/liftheben alle Szenen auf die installierte Fassung, je Szene als neue veröffentlichte Fassung. (#680) POST /v1/marketplace/apps/{appId}/upgradegeht nur vorwärts und nur auf Fassungen, die die Organisation sieht. Neuer FehlercodeApp.UpdateUnavailable(409,details.reason:not-forward,none,not-rejectable). (#680)- Entfallen sind
GET /v1/me/pending-reacceptances,POST /v1/marketplace/apps/{appId}/acceptund…/rejectsamt ihren Verträgen.RetireAppReleaseRequestnimmtgraceundsecurityAdvisorystattgraceMonths. (#680) - Neue Ereignisse
marketplace.app.update-declined,marketplace.app.update-withdrawnundmarketplace.app.release-switched.app-catalog.app-release.retiredund…grace-expiredtragensuccessorVersion. Ein Grant trägtdeclinedReleaseIdunddeclinedVersion, ein Nachweisreasons, eine FassungsecurityAdvisory. (#680) @szenera/clientund@szenera/api-client: neume.appsUpdates.list,me.appsUpdate.list/accept/reject,me.appsBetaEnrollment.*undme.appsScenePins.list/lift, entfallenme.pendingReacceptancesundmarketplace.marketplaceApps.accept/reject.szenera app acceptundapp rejectnutzen die neuen Routen, ihre Aufrufe bleiben gleich. (#680)- 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 perlocaleoderAccept-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,POSTundDELETE /v1/me/apps/{appId}/data/deletion. FehlerOwnerRequest.NotApplicable,AppData.NotDeletableundAppData.DeletionNotFound. (#688) - Neue Pflege-Routen (Betreiber):
GET,POST /v1/platform/app-catalog/collections,PATCH …/collections/{collectionKey},PUT …/collections/order. (#688) @szenera/contracts:StoreEntryView,StoreCardView,StoreSituation(Lage, genau eine Handlung, Grund mit Zahlen), Sammlungen, Bitten, App-Daten. Das Manifest trägt am Ende den optionalen Blockcompatibility.preview.screenshotswird nicht mehr gelesen, und die Liste des Marktplatzes führt es nicht mehr (Bruch).InstalledApp.coreFeature,GetAppUpdateResponse.decisionRequest,SetPlayerProgramResponse.warnings,verticalan der Organisation und im Profil. (#688)@szenera/clientund@szenera/api-client:me.appsStore,me.appsCollections,me.appsInstalled,me.apps.installRequest,me.appsUpdate.decisionRequest,me.appsData,me.appsDataDeletion,platform.appCatalogCollections.@szenera/clibündelt die erweiterten Verträge, seine Befehle bleiben, wie sie sind.@szenera/agentkennt die neuen Fehlercodes. (#688)@szenera/apps-sdk:AppLifecycleHookshat zwei weitere freiwillige Punkte,inventory(tenantId)(Einträge je Datenbereich) undpurge(tenantId)(alles endgültig löschen, idempotent). Sie kommen nur zusammen, eine Klasse mit nur einem von beiden lehnt der Boot ab. (#688)@szenera/contracts: Das Manifest trägttranslations, je Sprache ein Block nur mit Texten (AppManifestTranslationsSchema). DazuappManifestLocales(),localizeAppManifest()undappManifestTranslationIssues(). Der Store antwortet inlocaleoderAccept-Languageund nennt die Sprache der Texte intextLocale. Entfallen sindMarketplaceAppListingSchemaund die Anwendungsfälle der entfallenen Routen,GetInstalledAppResponseträgthistory, die Store-ÜbersichtcoreFeaturesmit der angebotenen Fassung.PortalFeatureEntryträgt keinen Namen mehr, die Namen stehen in den Texten des Stores. (#699)@szenera/client:client.marketplace.apps.listund.getsowieclient.me.installedAppssind entfallen,client.me.apps.list({ locale })liefert die installierten Apps. (#699)@szenera/apps-sdk:defineAppManifestwirft bei einem unvollständigen Übersetzungsblock und nennt die Stelle. (#699)@szenera/widget-editor:schemaFieldText(schema, pfad)undsplitFieldDescription()lesen Beschriftung und Hilfe eines Felds aus.describe('Titel|Satz'),APP_CATEGORY_LABEL_KEYSordnet die Kategorien den Beschriftungen der Palette zu. (#699)@szenera/cliliest Apps über die Store-Routen, die Befehle bleiben, wie sie sind. (#699)
Änderungen
@szenera/contracts: neuCatalogAppSchema,AppReleaseNotesSchema(Notizen je Zielgruppe und Sprache),AppReleaseEventSchema,RestoreAppRelease*,ListAppReleaseHistory*undGetAppVersionHistory*. EinAppReleaseträgtnotes, die Wire-Form daneben weiterreleaseNotes.PATCH /v1/platform/app-catalog/apps/{appId}/releases/{id}nimmtnotesje Zielgruppe oder wie bisherreleaseNotes. (#677)- Ein Grant trägt
installedReleaseId,pendingReleaseId,pendingReasonsundpendingDeadline, ein Zustimmungs-NachweisreleaseId, eine offene ZustimmungfromVersion,toVersion,reasonsunddeadline. Entfallen sindautoUpgradeam Grant undConfigSchemaChangedPayloadSchema. (#677) GET /v1/apps/{appId}/historyliefert 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)@szenera/api-client: neuclient.platform.appCatalogAppsHistory.list,client.platform.appCatalogAppsReleases.restoreundclient.appCatalog.appsHistory.list.@szenera/client: neuclient.appCatalog.appsHistory.list.@szenera/clibündelt die neuen Verträge, ihre Befehle bleiben, wie sie sind. (#677)- Das scenes-Bündel der Momentaufnahme trägt
appVersions(je App die eine Fassung des Displays) sowieappRendererHostsundappWidgetTypesje<appId>@<version>, alle mit der Vorgabe{}. Die Pins der Szenen und Widgets nennen dieselbe Fassung. (#683) displayAppVersion(pins, installed)in@szenera/contracts/compositionrechnet die Fassung eines Displays: die installierte, bei gehaltenen Pins älterer Hauptnummern die niedrigste davon. (#683)- Die neue Befundart
AppVersionHeldist immer eine Warnung und trägtappId,appName,version,installedVersionundwidgetIds. Die KI-Anbindung erklärt sie. (#683) @szenera/client: Der Filtertypeder Integritäts-Befunde einer Szene kenntAppVersionHeld.@szenera/clibündelt den erweiterten Vertrag, ihre Befehle bleiben, wie sie sind. (#683)- Ein Zustimmungs-Nachweis trägt
version, die Nummer der Fassung, der zugestimmt wurde (nullnur bei Nachweisen von davor, deren Fassung schon fehlte). Eine Installation trägtdeclinedAtnebendeclinedVersion. (#681) GET /v1/apps/{appId}/historynennt je FassungreleaseId, dieselbe Kennung wie an Installation, Nachweis und Update-Entscheidung. (#681)@szenera/client:client.appCatalog.appsHistory.listnennt je FassungreleaseId, eine Installation trägtdeclinedAt.@szenera/clibündelt die erweiterten Verträge, ihre Befehle bleiben, wie sie sind. (#681)@szenera/widget-editor:EditorShellnimmtappsAwaitingUpdate(Apps samt Weg zur Entscheidung). Der App-Bereich zeigt ihre Widgets mit „Update wartet“, ein Klick führt zur Entscheidung statt einzufügen. (#681)@szenera/clientund@szenera/clibündeln die erweiterten Verträge der Plattform. Ihre Aufrufe und Befehle bleiben, wie sie sind. (#697)@szenera/contractsbaut je Quelldatei ein Modul (dist/<domain>/<pfad>.js), und dieexports-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):appRuntimeHostSpecifierssteht 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 (sideEffectsnennt alleinopenapi-extend). (#688)- Jede Datei, deren Code
.openapi(…)ruft, importiertopenapi-extendselbst. Wer ein Blatt direkt lädt, braucht den Barrel seiner Domäne nicht mehr, damit die Zod-Erweiterung vor dem Schema läuft. (#688) @szenera/apps-sdkliest Widget-Definition, Konfigurations-Schema und Manifest aus den Blättern des App-Katalogs statt aus dessen Barrel. (#688)@szenera/clientund@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)
0.2.1
Ohne Eintrag für Entwickler.
0.2.0
Brüche
- Die Fähigkeiten eines Geräts kennen den Block
remotenicht mehr. Die Erweiterung meldet sich im Blockhostmitplatform: extension. Der Blockhostträgt dazubridge(die Brückenfassung des Wirts) undbootStart(ob der Wirt von selbst startet). (#640) - Geräte tragen statt
runtimeden Blocksoftware(je Baustein Fassung, Bau und angenommene Freigabe), dazuchannelundsoftwareTarget, das Soll ihres Kanals. Player tragen keincapabilitiesmehr, der gemeldete Zustand keinreportedState.capabilities. Was ein Gerät kann, steht in seinen Fähigkeiten, deren Blocksoftwareruntimeersetzt. (#642) - Der Zustand der Anzeige (
lastTelemetry.renderer) nennt das Bau-Profil (modernoderlegacy). (#642) PlayerCapabilitySchemaund die beidenOS_CHANNELSentfallen,ReleaseChannellebt in@szenera/contracts/sharednebenPROTOCOL_SERVED. Die Selbstsicht trägtchannelundsoftwareTarget.channelfehlt, solange die Cloud keinen Kanal für das Gerät führt,currentOsChannelbleibt für ältere Fernwartungen. (#642)- Beispiele der Vorfassungen je Naht liegen unter
packages/contracts/src/samples/protocols/, Tests in TypeScript und Go legen sie den heutigen Lesern vor. (#642) HOST_EDITIONS,HostEditionSchemaundHostEditionstehen in@szenera/contracts/fleetund im Einstieg@szenera/contracts/fleet/host-bridge. Die Beschreibung eines Wirts in@szenera/host-bridgenimmtedition. (#653)
Änderungen
- Der Block
hostder Gerätefähigkeiten kennt zwei weitere Plattformen:vegafür Fire TV mit Vega OS undextensionfür die Erweiterung für Chrome. Bisher meldet kein Gerät sie. (#636) - 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üsselak_…oder dem Zugriffstokenoat_…eines delegierten Zugangs aus. Veröffentlicht wird er noch nicht. (#617) - Jede Methode beider Klienten trägt die Kurzbeschreibung ihrer Operation als Kommentar. Junge Operationen tragen zusätzlich
@beta, auslaufende@deprecatedmit ihrem Abschalt-Tag. (#617) - Die anmeldefreien Routen
GET /v1/public/statusundGET /v1/public/maintenance-statusstehen im eigenen Bereichstatusstatt unterops-console. Im Klienten heißt ihr Namensraum deshalbstatusstattopsConsole. (#617) - 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 auflocalhostmehr und nur noch die Ausweisarten, die eine ihrer Operationen annimmt. (#617) - Das Sicherheitsverfahren
cookienennt das Cookie, das es wirklich gibt:refresh_token, gelesen nur vonPOST /v1/auth/refresh. (#617) - Die Beispiele der Spezifikation zeigen Geräte-Adressen aus dem Dokumentationsbereich
192.0.2.0/24. (#617) @szenera/api-client/factorybietet mitcreateBearerClientWitheinen Klienten mit festem Merkmal und frei gewählten Modulen. (#617)- Die Archive von
@szenera/clientund@szenera/cliwerden 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) - 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)
@szenera/clibringt Kern, Befehle, die Module des öffentlichen Klienten und die Verträge in einer einzigen Datei mit.@szenera/clientbringt seine Typen je Unterpfad mit und braucht nebenzodnichts aus der Plattform. (#620)- Die Kommandozeile nimmt nur noch Schlüssel einer Organisation (
ak_…) an und nennt in ihrer Kennung die Fassung aus ihrem eigenen Manifest. (#620) - Veröffentlicht ist weiterhin nichts. (#620)
- Der Herzschlag eines Geräts nennt im Block
rendererdie Fassung, den Bau und die Quelle der Anzeige (bundleoderhosted), dazu die Folge der zuletzt angenommenen Freigabe und seit wann das Bündel aktiv ist. Alle Felder sind optional. (#633) - Neue Verträge
DeviceServiceStatus,RendererServiceStatusundServiceFindingin@szenera/contracts/fleet. (#628) GET /v1/devices/meliefertdeviceName, den Namen aus der Geräteakte. (#628)- Der Herzschlag nimmt
appFailuresan, höchstens 20 je Meldung mit dem Grundmissing,rejectedoderfailed. Der Agent füllttime.offsetMsmit dem Versatz seiner Uhr zur Cloud. (#628) - Die Ereignis-Kategorie
servicebringt die Codesservice.menu-opened(input) undservice.menu-closed(reason). Der Agent meldet jetzt auchcontent.bundle-failed. (#628) - Der Agent bedient auf
127.0.0.1:8081die Seite des Menüs undGET /v1/status,/v1/report,/v1/input,/v1/backdropsowiePOST /v1/openund/v1/close.service.menu-openedentsteht erst, wenn die Seite das Öffnen meldet.Origin: nullbekommt 403, außer die Startseite mit ihrem Schlüssel im KopfX-Service-Token. Der Eingabe-Wächterszenera-input-watchist ein eigenes Programm im selben Go-Modul. (#628) - Der Katalog der Befunde kennt
app-bundle-download-failed(appId,version,appName,httpStatus,since). Die App-Befunde tragenappName,wifi-weakundclock-skewden Auslösertrigger. (#628)
0.1.0
Die erste Fassung mit eigener Zahl, noch nicht veröffentlicht. Diese Liste beginnt mit der nächsten Fassung.