@reventlessdev/reventless-spec 3.0.0-alpha.110 → 3.0.0-alpha.112

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,21 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # 3.0.0-alpha.112 (2026-08-13)
7
+
8
+ **Note:** Version bump only for package @reventlessdev/reventless-spec
9
+
10
+
11
+
12
+
13
+
14
+ # 3.0.0-alpha.111 (2026-08-12)
15
+
16
+ ### Features
17
+
18
+ * **scripts:** publish the platform SDL instead of copying it by hand ([3f28ceb](https://github.com/ReventlessDev/reventless-core/commit/3f28cebe7f9f947894105592d7ff7e5c07043d8f))
19
+
20
+
6
21
  # 3.0.0-alpha.110 (2026-08-12)
7
22
 
8
23
  ### Features
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reventlessdev/reventless-spec",
3
- "version": "3.0.0-alpha.110",
3
+ "version": "3.0.0-alpha.112",
4
4
  "description": "Specifications for Reventless",
5
5
  "license": "Apache-2.0",
6
6
  "bin": {
@@ -21,7 +21,7 @@
21
21
  "sury": "11.0.0-alpha.4",
22
22
  "sury-ppx": "11.0.0-alpha.2",
23
23
  "yaml": "^2.8.3",
24
- "@reventlessdev/rescript-node": "2.0.0-alpha.4"
24
+ "@reventlessdev/rescript-node": "2.0.0-alpha.5"
25
25
  },
26
26
  "devDependencies": {
27
27
  "rescript": "12.3.0",
@@ -0,0 +1,41 @@
1
+ # The platform admin API contract
2
+
3
+ `platform-api.graphql` is the SDL of the platform admin API — the `Platform_*`
4
+ half of what a UI shell talks to. It is **published with this package**, and a
5
+ shell compiles its Relay queries against it as a dependency rather than keeping a
6
+ copy of its own.
7
+
8
+ That is the whole point of it living here. A snapshot copied by hand into another
9
+ repo rots silently: the copy keeps compiling green against a schema no server
10
+ serves, and the shell fails only against a real backend. A snapshot that arrives
11
+ by dependency bump cannot get out of step with a version. Lerna versions this
12
+ repo off conventional commits, so this package bumps exactly when its contents
13
+ change — **the version a shell pins is the contract version it compiles
14
+ against.**
15
+
16
+ That also keeps a shell from running ahead of a platform. A hand-written GraphQL
17
+ document is a lockstep change, not an additive one: the server rejects the whole
18
+ document when it selects a field the schema does not declare, so a shell ahead of
19
+ its platform boots to nothing rather than degrading. Pinning a published version
20
+ means the contract a shell compiles against is one that exists.
21
+
22
+ ## It is generated, not written
23
+
24
+ Written by `pnpm run check:graphql` from the repo root, which boots the hybrid
25
+ example's local platform and introspects it. Do not edit it by hand.
26
+
27
+ The example is only a vehicle — nothing example-specific reaches this file. Every
28
+ type in it is `Platform_*` or framework-level (`CommandResult`, `PageInfo`,
29
+ `SortOrder`, …); no plugin of that example contributes anything. Its sibling
30
+ golden, `domain-api.graphql`, is the plugin-generated half and stays with the
31
+ example that produces it.
32
+
33
+ Sorted through `lexicographicSortSchema`, so it is a function of the schema alone
34
+ — the platform builds its type map from dicts, and unsorted output would diff on
35
+ iteration order rather than on a real contract change.
36
+
37
+ ## Changing it
38
+
39
+ Change the platform, then run `pnpm run check:graphql:update` and commit this
40
+ file alongside the change that moved it. The diff is the review artifact for a
41
+ wire-shape change.
@@ -0,0 +1,318 @@
1
+ type CommandAccepted {
2
+ entityId: ID
3
+ eventCount: Int!
4
+ msgId: ID!
5
+ }
6
+
7
+ type CommandPending {
8
+ msgId: ID!
9
+ }
10
+
11
+ type CommandRejected {
12
+ errorCode: String!
13
+ errorDetail: String
14
+ msgId: ID!
15
+ }
16
+
17
+ union CommandResult = CommandAccepted | CommandPending | CommandRejected
18
+
19
+ type Mutation {
20
+ Platform_PluginStatusChanged(pluginId: ID!, status: PluginStatus!): PluginStatusChangeEvent
21
+ Platform_Plugin_Activate(_0: String!, id: ID!): CommandResult!
22
+ Platform_Plugin_Deactivate(_0: String!, id: ID!): CommandResult!
23
+ Platform_Plugin_Retire(_0: String!, id: ID!): CommandResult!
24
+ Platform_UIFragmentDeregistered(pluginId: ID!): UIFragmentChangeEvent
25
+ Platform_UIFragmentRegistered(manifest: String, pluginId: ID!): UIFragmentChangeEvent
26
+ Platform_UIFragmentUpdated(manifest: String, pluginId: ID!): UIFragmentChangeEvent
27
+ }
28
+
29
+ interface Node {
30
+ id: ID!
31
+ }
32
+
33
+ type PageInfo {
34
+ endCursor: String
35
+ hasNextPage: Boolean!
36
+ hasPreviousPage: Boolean!
37
+ startCursor: String
38
+ }
39
+
40
+ type Platform_AutomationSliceDef {
41
+ chapter: String
42
+ consumedEventTypes: [String!]!
43
+ name: String!
44
+ producedCommandTypes: [String!]!
45
+ targetName: String
46
+ }
47
+
48
+ type Platform_CommandDef {
49
+ aggregateIdField: String
50
+ allowedStates: [String!]
51
+ apiExposed: Boolean
52
+ level: String!
53
+ mutationField: String!
54
+ name: String!
55
+ ownerField: String
56
+ references: [Platform_FieldReference!]!
57
+ requiredAccess: [String!]
58
+ schema: String!
59
+ targetState: String
60
+ }
61
+
62
+ type Platform_ComponentDefinitionEntry {
63
+ aggregates: [Platform_WriteSideDef!]!
64
+ automationSlices: [Platform_AutomationSliceDef!]!
65
+ extensions: [Platform_ExtensionDef!]!
66
+ inboundTranslationSlices: [Platform_InboundTranslationSliceDef!]!
67
+ internalQueryables: [Platform_ReadSideDef!]!
68
+ outboundTranslationSlices: [Platform_OutboundTranslationSliceDef!]!
69
+ pluginId: String!
70
+ readModels: [Platform_ReadSideDef!]!
71
+ stateChangeSlices: [Platform_WriteSideDef!]!
72
+ stateViewSlices: [Platform_ReadSideDef!]!
73
+ }
74
+
75
+ type Platform_ErrorDef {
76
+ name: String!
77
+ references: [Platform_FieldReference!]!
78
+ schema: String!
79
+ }
80
+
81
+ type Platform_EventDef {
82
+ name: String!
83
+ references: [Platform_FieldReference!]!
84
+ schema: String!
85
+ }
86
+
87
+ type Platform_ExtensionDef {
88
+ commandTypes: [String!]!
89
+ delegateNames: [String!]!
90
+ eventTypes: [String!]!
91
+ name: String!
92
+ }
93
+
94
+ type Platform_ExtensionPointDef {
95
+ commandTypes: [String!]
96
+ delegateNames: [String!]!
97
+ name: String!
98
+ sourceEventTypes: [String!]!
99
+ }
100
+
101
+ type Platform_FieldReference {
102
+ entity: String!
103
+ fieldName: String!
104
+ plugin: String
105
+ }
106
+
107
+ type Platform_InboundTranslationSliceDef {
108
+ chapter: String
109
+ commandTypes: [String!]!
110
+ externalSystem: String
111
+ name: String!
112
+ targetName: String
113
+ }
114
+
115
+ type Platform_OutboundTranslationSliceDef {
116
+ chapter: String
117
+ consumedEventTypes: [String!]!
118
+ externalSystem: String
119
+ inboundCommandTypes: [String!]!
120
+ name: String!
121
+ targetName: String
122
+ }
123
+
124
+ type Platform_Plugin implements Node {
125
+ apiSchemaFragment: String
126
+ apiTarget: String
127
+ dcbEventLog: Platform_PluginDcbEventLog
128
+ extensionPoints: [Platform_PluginExtensionPoints!]!
129
+ extensions: [Platform_PluginExtensions!]!
130
+ id: ID!
131
+ kind: Platform_PluginKind
132
+ name: String!
133
+ otherConnectedVersions: [String!]!
134
+ status: Platform_PluginStatus!
135
+ statusChange: Platform_PluginStatusChange!
136
+ structure: String
137
+ version: String!
138
+ }
139
+
140
+ type Platform_PluginConnection {
141
+ edges: [Platform_PluginEdge!]!
142
+ pageInfo: PageInfo!
143
+ }
144
+
145
+ type Platform_PluginDcbEventLog {
146
+ eventTopicArn: String!
147
+ name: String!
148
+ }
149
+
150
+ type Platform_PluginEdge {
151
+ cursor: String!
152
+ node: Platform_Plugin!
153
+ }
154
+
155
+ type Platform_PluginExtensionPoints {
156
+ commandTopic: String!
157
+ eventTopic: String!
158
+ name: String!
159
+ }
160
+
161
+ type Platform_PluginExtensions {
162
+ dcbSources: [String!]!
163
+ extensionPointName: String!
164
+ name: String!
165
+ }
166
+
167
+ input Platform_PluginFilter {
168
+ ids: [ID!]
169
+ kindEq: String
170
+ search: String
171
+ searchPrefix: String
172
+ }
173
+
174
+ enum Platform_PluginKind {
175
+ Commercial
176
+ Domain
177
+ Marketplace
178
+ PlatformInfrastructure
179
+ }
180
+
181
+ enum Platform_PluginStatus {
182
+ Connected
183
+ Disconnected
184
+ Inactive
185
+ Retired
186
+ }
187
+
188
+ type Platform_PluginStatusChange {
189
+ at: String!
190
+ by: String!
191
+ }
192
+
193
+ type Platform_PluginStructureEntry {
194
+ aggregates: [Platform_WriteSideDef!]!
195
+ automationSlices: [Platform_AutomationSliceDef!]!
196
+ extensionPoints: [Platform_ExtensionPointDef!]
197
+ extensions: [Platform_ExtensionDef!]!
198
+ inboundTranslationSlices: [Platform_InboundTranslationSliceDef!]!
199
+ outboundTranslationSlices: [Platform_OutboundTranslationSliceDef!]!
200
+ pluginId: String!
201
+ readModels: [Platform_ReadSideDef!]!
202
+ requiredStoreDeclarations: [Platform_RequiredStoreDeclaration!]
203
+ requiredStores: [String!]
204
+ stateChangeSlices: [Platform_WriteSideDef!]!
205
+ stateViewSlices: [Platform_ReadSideDef!]!
206
+ }
207
+
208
+ type Platform_ReadSideDef {
209
+ chapter: String
210
+ consumedEventTypes: [String!]!
211
+ idField: String
212
+ idFieldSource: String
213
+ labelField: String!
214
+ labelFieldSource: String
215
+ linkedWriteSide: [String!]!
216
+ name: String!
217
+ ownerField: String
218
+ queryField: String!
219
+ requiredAccess: [String!]
220
+ schema: String!
221
+ searchableFields: [String!]!
222
+ singleQueryField: String
223
+ statusField: String
224
+ visibility: String
225
+ }
226
+
227
+ type Platform_RequiredStoreDeclaration {
228
+ annotation: String
229
+ component: String!
230
+ field: String!
231
+ store: String!
232
+ }
233
+
234
+ type Platform_UIFragmentEntry {
235
+ pages: [Platform_UIPage!]!
236
+ panels: [Platform_UIPanel!]!
237
+ pluginId: String!
238
+ registeredAt: String!
239
+ remoteEntryUrl: String!
240
+ updatedAt: String!
241
+ }
242
+
243
+ type Platform_UIMenuEntry {
244
+ group: String
245
+ icon: String
246
+ label: String!
247
+ sortOrder: Int!
248
+ }
249
+
250
+ type Platform_UIPage {
251
+ fragmentId: String!
252
+ menuEntry: Platform_UIMenuEntry!
253
+ requiredAccess: String
254
+ title: String!
255
+ }
256
+
257
+ type Platform_UIPanel {
258
+ description: String!
259
+ fragmentId: String!
260
+ positions: [String!]!
261
+ requiredAccess: String
262
+ title: String!
263
+ }
264
+
265
+ type Platform_WriteSideDef {
266
+ chapter: String
267
+ commands: [Platform_CommandDef!]!
268
+ consistencyRead: String
269
+ consumedEventTypes: [String!]!
270
+ errors: [Platform_ErrorDef!]!
271
+ events: [Platform_EventDef!]!
272
+ linkedViews: [String!]!
273
+ name: String!
274
+ producedEventTypes: [String!]!
275
+ }
276
+
277
+ enum PluginStatus {
278
+ Connected
279
+ Disconnected
280
+ Inactive
281
+ Retired
282
+ }
283
+
284
+ type PluginStatusChangeEvent {
285
+ pluginId: ID!
286
+ status: PluginStatus!
287
+ }
288
+
289
+ type Query {
290
+ Platform_ComponentDefinitions: [Platform_ComponentDefinitionEntry!]!
291
+ Platform_Plugin(id: ID!): Platform_Plugin
292
+ Platform_PluginStructures: [Platform_PluginStructureEntry!]!
293
+ Platform_Plugins(after: String, before: String, filter: Platform_PluginFilter, first: Int, last: Int): Platform_PluginConnection!
294
+ Platform_PluginsByIds(ids: [String!]!): [Platform_Plugin!]!
295
+ Platform_UIFragments: [Platform_UIFragmentEntry!]!
296
+ }
297
+
298
+ enum SortOrder {
299
+ ASC
300
+ DESC
301
+ }
302
+
303
+ type Subscription {
304
+ onPluginStatusChange: PluginStatusChangeEvent
305
+ onUIFragmentChange: UIFragmentChangeEvent
306
+ }
307
+
308
+ type UIFragmentChangeEvent {
309
+ changeKind: UIFragmentChangeKind!
310
+ manifest: String
311
+ pluginId: ID!
312
+ }
313
+
314
+ enum UIFragmentChangeKind {
315
+ Deregistered
316
+ Registered
317
+ Updated
318
+ }