@statelyai/sdk 0.37.3 → 0.37.4

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/README.md CHANGED
@@ -464,6 +464,16 @@ from graph data. Source generation is part of the private Editor Sync workflow.
464
464
  For pricing and support, contact
465
465
  [team@stately.ai](mailto:team@stately.ai).
466
466
 
467
+ ## Machine JSON schemas
468
+
469
+ <!-- JSON schema exports from package.json and schemas/ -->
470
+
471
+ Use `@statelyai/sdk/xstate-v6.schema.json` to validate the `MachineJSON` loader format accepted by XState v6's `createMachineFromConfig`, including `@expr` expressions and `@xstate.*` action objects. It uses JSON Schema draft 2020-12.
472
+
473
+ This loader format has its own contract: transition `actions` must be arrays, history states require a non-empty fallback `target`, and state `onDone` and root `options` are unsupported. Code-authored `createMachine` configurations and the editor's general `xstate-json` exports can contain fields or shorthand outside this loader format.
474
+
475
+ `@statelyai/sdk/xstate.schema.json` and `xstate-json.schema.json` continue to describe v5 definitions. The schemas are also available under the `schemas/` export paths.
476
+
467
477
  ## Self-hosting
468
478
 
469
479
  <!-- self-host configuration from the editor app auth and editor-sync routes -->
package/dist/embed.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import "./protocol-M3Zeun3o.mjs";
2
- import { c as createPendingExportManager, l as settingsWithViewMode, r as createPostMessageTransport, s as createEventRegistry, t as SDK_VERSION, u as toInitMessage } from "./version-Bdi39PxU.mjs";
2
+ import { c as createPendingExportManager, l as settingsWithViewMode, r as createPostMessageTransport, s as createEventRegistry, t as SDK_VERSION, u as toInitMessage } from "./version-BeGmL5w7.mjs";
3
3
  import { EDITOR_PROTOCOL_VERSION } from "./editorHostProtocol.mjs";
4
4
 
5
5
  //#region src/embed.ts
package/dist/index.mjs CHANGED
@@ -1,10 +1,10 @@
1
1
  import { n as StudioApiError, r as createStatelyClient, t as DEFAULT_STATELY_BASE_URL } from "./studio-uGK1kS0n.mjs";
2
2
  import { c as createInspectionRoomUrls, d as isEmbedExampleMachine, i as INSPECTION_ROOM_QUERY_PARAM, l as getInspectionRoomId, m as resolveInspectorSettings, n as EMBED_DOCUMENT_LIMITS, o as assertEmbedExamples, p as mergeInspectorSettings, r as INSPECTION_PROTOCOL_VERSION, s as createInspectionActorId, t as EMBED_DOCUMENT_LANGUAGES, u as isEmbedExample } from "./protocol-M3Zeun3o.mjs";
3
- import { i as createWebSocketTransport, r as createPostMessageTransport } from "./version-Bdi39PxU.mjs";
3
+ import { i as createWebSocketTransport, r as createPostMessageTransport } from "./version-BeGmL5w7.mjs";
4
4
  import { EDITOR_PROTOCOL_VERSION } from "./editorHostProtocol.mjs";
5
5
  import { createStatelyEmbed } from "./embed.mjs";
6
6
  import { createS3AssetUploadAdapter, createSupabaseAssetUploadAdapter } from "./assetStorage.mjs";
7
- import { n as createStatelyInspector, t as createInspector } from "./inspect-C2F95TDZ.mjs";
7
+ import { n as createStatelyInspector, t as createInspector } from "./inspect-CGMew487.mjs";
8
8
  import { createAuthorizationHeader, getCredentialToken } from "./auth.mjs";
9
9
  import { buildAuthorizeUrl, createPkcePair, discoverAuthorizationServer, discoverProtectedResource, exchangeCodeForToken, refreshToken, registerOAuthClient } from "./oauth.mjs";
10
10
  import { StatelyApiError, createStatelyApiClient, createStatelyApiUrl } from "./api.mjs";
@@ -1,5 +1,5 @@
1
1
  import { c as createInspectionRoomUrls, l as getInspectionRoomId, m as resolveInspectorSettings, p as mergeInspectorSettings, r as INSPECTION_PROTOCOL_VERSION } from "./protocol-M3Zeun3o.mjs";
2
- import { a as assertEmbedDocuments, c as createPendingExportManager, i as createWebSocketTransport, n as inspectionRuntime, o as assertEmbedPanels, s as createEventRegistry, t as SDK_VERSION } from "./version-Bdi39PxU.mjs";
2
+ import { a as assertEmbedDocuments, c as createPendingExportManager, i as createWebSocketTransport, n as inspectionRuntime, o as assertEmbedPanels, s as createEventRegistry, t as SDK_VERSION } from "./version-BeGmL5w7.mjs";
3
3
 
4
4
  //#region src/openBrowser.ts
5
5
  async function openBrowser(url) {
package/dist/inspect.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import "./protocol-M3Zeun3o.mjs";
2
- import "./version-Bdi39PxU.mjs";
3
- import { n as createStatelyInspector, t as createInspector } from "./inspect-C2F95TDZ.mjs";
2
+ import "./version-BeGmL5w7.mjs";
3
+ import { n as createStatelyInspector, t as createInspector } from "./inspect-CGMew487.mjs";
4
4
 
5
5
  export { createInspector, createStatelyInspector };
@@ -378,7 +378,7 @@ function createWebSocketTransport(options) {
378
378
 
379
379
  //#endregion
380
380
  //#region src/version.ts
381
- const SDK_VERSION = "0.37.3";
381
+ const SDK_VERSION = "0.37.4";
382
382
  function inspectionRuntime() {
383
383
  if (typeof window !== "undefined") return "browser";
384
384
  if (typeof process !== "undefined" && process.versions?.node) return "node";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@statelyai/sdk",
3
- "version": "0.37.3",
3
+ "version": "0.37.4",
4
4
  "license": "MIT",
5
5
  "bin": {
6
6
  "stately-sdk": "./dist/bin.mjs"
@@ -74,7 +74,9 @@
74
74
  "./editor-host-protocol": {
75
75
  "types": "./dist/editorHostProtocol.d.mts",
76
76
  "import": "./dist/editorHostProtocol.mjs"
77
- }
77
+ },
78
+ "./xstate-v6.schema.json": "./schemas/xstate-v6.schema.json",
79
+ "./schemas/xstate-v6.schema.json": "./schemas/xstate-v6.schema.json"
78
80
  },
79
81
  "dependencies": {
80
82
  "@statelyai/graph": "^2.1.0"
@@ -82,19 +84,17 @@
82
84
  "devDependencies": {
83
85
  "@types/json-schema": "^7.0.15",
84
86
  "@types/ws": "^8.18.1",
87
+ "ajv": "8.20.0",
85
88
  "jsdom": "^27.4.0",
86
89
  "tsdown": "0.21.0-beta.2",
87
- "vitest": "^3.2.4",
88
- "xstate-v6": "npm:xstate@6.0.0-alpha.63",
89
90
  "typescript": "^5.9.3",
91
+ "vitest": "^3.2.4",
90
92
  "ws": "^8.19.0",
91
93
  "xstate": "^5.0.0",
92
- "@statelyai/api-contract": "0.5.6",
94
+ "xstate-v6": "npm:xstate@6.0.0-alpha.63",
95
+ "@statelyai/api-contract": "0.6.0",
93
96
  "@statelyai/graph-tools": "0.9.4"
94
97
  },
95
- "engines": {
96
- "node": ">=22.4"
97
- },
98
98
  "peerDependencies": {
99
99
  "ws": "^8.19.0"
100
100
  },
@@ -103,6 +103,9 @@
103
103
  "optional": true
104
104
  }
105
105
  },
106
+ "engines": {
107
+ "node": ">=22.4"
108
+ },
106
109
  "scripts": {
107
110
  "build": "tsdown",
108
111
  "test": "vitest run",
@@ -0,0 +1,674 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "XState v6 machine definition (MachineJSON)",
4
+ "description": "The JSON-serializable XState machine definition accepted by createMachineFromConfig. Expressions use reserved @ keys: @exprLang on the machine and @expr/@code with optional @lang in value slots.",
5
+ "$ref": "#/$defs/machine",
6
+ "$defs": {
7
+ "jsonSchema": {
8
+ "type": "object",
9
+ "additionalProperties": true
10
+ },
11
+ "eventPayloadSchema": {
12
+ "allOf": [
13
+ {
14
+ "$ref": "#/$defs/jsonSchema"
15
+ },
16
+ {
17
+ "not": {
18
+ "type": "object",
19
+ "properties": {
20
+ "properties": {
21
+ "type": "object",
22
+ "required": ["type"]
23
+ }
24
+ },
25
+ "required": ["properties"]
26
+ }
27
+ }
28
+ ]
29
+ },
30
+ "expression": {
31
+ "type": "object",
32
+ "properties": {
33
+ "@expr": {
34
+ "type": "string"
35
+ },
36
+ "@lang": {
37
+ "type": "string"
38
+ }
39
+ },
40
+ "required": ["@expr"],
41
+ "additionalProperties": false
42
+ },
43
+ "code": {
44
+ "type": "object",
45
+ "properties": {
46
+ "@code": {
47
+ "type": "string"
48
+ },
49
+ "@lang": {
50
+ "type": "string"
51
+ }
52
+ },
53
+ "required": ["@code"],
54
+ "additionalProperties": false
55
+ },
56
+ "resolvable": {
57
+ "oneOf": [
58
+ {
59
+ "$ref": "#/$defs/expression"
60
+ },
61
+ {
62
+ "$ref": "#/$defs/code"
63
+ }
64
+ ]
65
+ },
66
+ "condition": {
67
+ "oneOf": [
68
+ {
69
+ "$ref": "#/$defs/resolvable"
70
+ },
71
+ {
72
+ "$ref": "#/$defs/guardObject"
73
+ }
74
+ ]
75
+ },
76
+ "guardObject": {
77
+ "type": "object",
78
+ "properties": {
79
+ "type": {
80
+ "type": "string"
81
+ },
82
+ "params": {}
83
+ },
84
+ "required": ["type"],
85
+ "additionalProperties": false
86
+ },
87
+ "actionObject": {
88
+ "type": "object",
89
+ "properties": {
90
+ "type": {
91
+ "type": "string"
92
+ }
93
+ },
94
+ "required": ["type"],
95
+ "additionalProperties": true
96
+ },
97
+ "action": {
98
+ "oneOf": [
99
+ {
100
+ "$ref": "#/$defs/actionObject"
101
+ },
102
+ {
103
+ "$ref": "#/$defs/resolvable"
104
+ }
105
+ ]
106
+ },
107
+ "actionList": {
108
+ "type": "array",
109
+ "items": {
110
+ "$ref": "#/$defs/action"
111
+ }
112
+ },
113
+ "transitionObject": {
114
+ "type": "object",
115
+ "properties": {
116
+ "target": {
117
+ "oneOf": [
118
+ {
119
+ "type": "string"
120
+ },
121
+ {
122
+ "type": "array",
123
+ "items": {
124
+ "type": "string"
125
+ }
126
+ }
127
+ ]
128
+ },
129
+ "actions": {
130
+ "$ref": "#/$defs/actionList"
131
+ },
132
+ "context": {
133
+ "type": "object"
134
+ },
135
+ "matches": {
136
+ "type": "object"
137
+ },
138
+ "guard": {
139
+ "$ref": "#/$defs/condition"
140
+ },
141
+ "input": {},
142
+ "description": {
143
+ "type": "string"
144
+ },
145
+ "reenter": {
146
+ "type": "boolean"
147
+ },
148
+ "meta": {
149
+ "type": "object"
150
+ }
151
+ },
152
+ "additionalProperties": false
153
+ },
154
+ "transition": {
155
+ "oneOf": [
156
+ {
157
+ "$ref": "#/$defs/transitionObject"
158
+ },
159
+ {
160
+ "$ref": "#/$defs/resolvable"
161
+ }
162
+ ]
163
+ },
164
+ "transitionOrArray": {
165
+ "oneOf": [
166
+ {
167
+ "$ref": "#/$defs/transition"
168
+ },
169
+ {
170
+ "type": "array",
171
+ "items": {
172
+ "$ref": "#/$defs/transition"
173
+ }
174
+ }
175
+ ]
176
+ },
177
+ "transitionMap": {
178
+ "type": "object",
179
+ "additionalProperties": {
180
+ "$ref": "#/$defs/transitionOrArray"
181
+ }
182
+ },
183
+ "choiceBranch": {
184
+ "type": "object",
185
+ "properties": {
186
+ "when": {
187
+ "$ref": "#/$defs/condition"
188
+ },
189
+ "target": {
190
+ "oneOf": [
191
+ {
192
+ "type": "string"
193
+ },
194
+ {
195
+ "type": "array",
196
+ "items": {
197
+ "type": "string"
198
+ }
199
+ }
200
+ ]
201
+ },
202
+ "context": {
203
+ "type": "object"
204
+ },
205
+ "input": {},
206
+ "description": {
207
+ "type": "string"
208
+ },
209
+ "reenter": {
210
+ "type": "boolean"
211
+ },
212
+ "meta": {
213
+ "type": "object"
214
+ }
215
+ },
216
+ "required": ["target"],
217
+ "additionalProperties": false
218
+ },
219
+ "choice": {
220
+ "oneOf": [
221
+ {
222
+ "type": "array",
223
+ "items": {
224
+ "$ref": "#/$defs/choiceBranch"
225
+ }
226
+ },
227
+ {
228
+ "$ref": "#/$defs/resolvable"
229
+ }
230
+ ]
231
+ },
232
+ "invokeObject": {
233
+ "type": "object",
234
+ "properties": {
235
+ "id": {
236
+ "type": "string"
237
+ },
238
+ "registryKey": {
239
+ "type": "string"
240
+ },
241
+ "src": {
242
+ "type": "string"
243
+ },
244
+ "input": {},
245
+ "onDone": {
246
+ "$ref": "#/$defs/transitionOrArray"
247
+ },
248
+ "onError": {
249
+ "$ref": "#/$defs/transitionOrArray"
250
+ },
251
+ "onSnapshot": {
252
+ "$ref": "#/$defs/transitionOrArray"
253
+ },
254
+ "onTimeout": {
255
+ "$ref": "#/$defs/transitionOrArray"
256
+ },
257
+ "timeout": {
258
+ "$ref": "#/$defs/duration"
259
+ }
260
+ },
261
+ "required": ["src"],
262
+ "additionalProperties": false
263
+ },
264
+ "invoke": {
265
+ "oneOf": [
266
+ {
267
+ "$ref": "#/$defs/invokeObject"
268
+ },
269
+ {
270
+ "type": "array",
271
+ "items": {
272
+ "$ref": "#/$defs/invokeObject"
273
+ }
274
+ }
275
+ ]
276
+ },
277
+ "duration": {
278
+ "oneOf": [
279
+ {
280
+ "type": "number"
281
+ },
282
+ {
283
+ "type": "string"
284
+ },
285
+ {
286
+ "$ref": "#/$defs/resolvable"
287
+ }
288
+ ]
289
+ },
290
+ "initial": {
291
+ "oneOf": [
292
+ {
293
+ "type": "string"
294
+ },
295
+ {
296
+ "type": "object",
297
+ "properties": {
298
+ "target": {
299
+ "type": "string"
300
+ },
301
+ "input": {}
302
+ },
303
+ "required": ["target"],
304
+ "additionalProperties": false
305
+ }
306
+ ]
307
+ },
308
+ "actionDefinitions": {
309
+ "type": "object",
310
+ "additionalProperties": {
311
+ "oneOf": [
312
+ {
313
+ "$ref": "#/$defs/action"
314
+ },
315
+ {
316
+ "$ref": "#/$defs/actionList"
317
+ }
318
+ ]
319
+ }
320
+ },
321
+ "guardDefinitions": {
322
+ "type": "object",
323
+ "additionalProperties": {
324
+ "type": "object",
325
+ "properties": {
326
+ "when": {
327
+ "$ref": "#/$defs/condition"
328
+ }
329
+ },
330
+ "required": ["when"],
331
+ "additionalProperties": false
332
+ }
333
+ },
334
+ "delayDefinitions": {
335
+ "type": "object",
336
+ "additionalProperties": {
337
+ "oneOf": [
338
+ {
339
+ "type": "number"
340
+ },
341
+ {
342
+ "type": "string"
343
+ },
344
+ {
345
+ "type": "object",
346
+ "properties": {
347
+ "duration": {
348
+ "$ref": "#/$defs/duration"
349
+ }
350
+ },
351
+ "required": ["duration"],
352
+ "additionalProperties": false
353
+ }
354
+ ]
355
+ }
356
+ },
357
+ "schemas": {
358
+ "type": "object",
359
+ "properties": {
360
+ "context": {
361
+ "$ref": "#/$defs/jsonSchema"
362
+ },
363
+ "events": {
364
+ "type": "object",
365
+ "additionalProperties": {
366
+ "$ref": "#/$defs/eventPayloadSchema"
367
+ }
368
+ },
369
+ "actions": {
370
+ "type": "object",
371
+ "additionalProperties": {
372
+ "type": "object",
373
+ "properties": {
374
+ "params": {
375
+ "$ref": "#/$defs/jsonSchema"
376
+ }
377
+ },
378
+ "required": ["params"],
379
+ "additionalProperties": false
380
+ }
381
+ },
382
+ "guards": {
383
+ "type": "object",
384
+ "additionalProperties": {
385
+ "type": "object",
386
+ "properties": {
387
+ "params": {
388
+ "$ref": "#/$defs/jsonSchema"
389
+ }
390
+ },
391
+ "required": ["params"],
392
+ "additionalProperties": false
393
+ }
394
+ },
395
+ "actors": {
396
+ "type": "object",
397
+ "additionalProperties": {
398
+ "type": "object",
399
+ "properties": {
400
+ "input": {
401
+ "$ref": "#/$defs/jsonSchema"
402
+ },
403
+ "output": {
404
+ "$ref": "#/$defs/jsonSchema"
405
+ },
406
+ "emitted": {
407
+ "type": "object",
408
+ "additionalProperties": {
409
+ "$ref": "#/$defs/eventPayloadSchema"
410
+ }
411
+ }
412
+ },
413
+ "additionalProperties": false
414
+ }
415
+ },
416
+ "emitted": {
417
+ "type": "object",
418
+ "additionalProperties": {
419
+ "$ref": "#/$defs/eventPayloadSchema"
420
+ }
421
+ },
422
+ "input": {
423
+ "$ref": "#/$defs/jsonSchema"
424
+ },
425
+ "output": {
426
+ "$ref": "#/$defs/jsonSchema"
427
+ },
428
+ "meta": {
429
+ "$ref": "#/$defs/jsonSchema"
430
+ },
431
+ "tags": {
432
+ "$ref": "#/$defs/jsonSchema"
433
+ },
434
+ "children": {
435
+ "type": "object",
436
+ "additionalProperties": {
437
+ "$ref": "#/$defs/jsonSchema"
438
+ }
439
+ }
440
+ },
441
+ "additionalProperties": true
442
+ },
443
+ "stateNode": {
444
+ "type": "object",
445
+ "properties": {
446
+ "@exprLang": {
447
+ "type": "string"
448
+ },
449
+ "id": {
450
+ "type": "string"
451
+ },
452
+ "key": {
453
+ "type": "string"
454
+ },
455
+ "type": {
456
+ "type": "string",
457
+ "enum": [
458
+ "atomic",
459
+ "compound",
460
+ "parallel",
461
+ "final",
462
+ "history",
463
+ "choice"
464
+ ]
465
+ },
466
+ "initial": {
467
+ "$ref": "#/$defs/initial"
468
+ },
469
+ "states": {
470
+ "type": "object",
471
+ "additionalProperties": {
472
+ "$ref": "#/$defs/stateNode"
473
+ }
474
+ },
475
+ "on": {
476
+ "$ref": "#/$defs/transitionMap"
477
+ },
478
+ "onError": {
479
+ "$ref": "#/$defs/transitionOrArray"
480
+ },
481
+ "after": {
482
+ "$ref": "#/$defs/transitionMap"
483
+ },
484
+ "always": {
485
+ "$ref": "#/$defs/transitionOrArray"
486
+ },
487
+ "choice": {
488
+ "$ref": "#/$defs/choice"
489
+ },
490
+ "route": {
491
+ "oneOf": [
492
+ {
493
+ "type": "object",
494
+ "properties": {
495
+ "description": {
496
+ "type": "string"
497
+ },
498
+ "reenter": {
499
+ "type": "boolean"
500
+ },
501
+ "meta": {
502
+ "type": "object"
503
+ },
504
+ "guard": {
505
+ "type": "string"
506
+ },
507
+ "input": {
508
+ "type": "object"
509
+ }
510
+ },
511
+ "additionalProperties": false
512
+ },
513
+ {
514
+ "$ref": "#/$defs/resolvable"
515
+ }
516
+ ]
517
+ },
518
+ "invoke": {
519
+ "$ref": "#/$defs/invoke"
520
+ },
521
+ "entry": {
522
+ "oneOf": [
523
+ {
524
+ "$ref": "#/$defs/actionList"
525
+ },
526
+ {
527
+ "$ref": "#/$defs/action"
528
+ }
529
+ ]
530
+ },
531
+ "exit": {
532
+ "oneOf": [
533
+ {
534
+ "$ref": "#/$defs/actionList"
535
+ },
536
+ {
537
+ "$ref": "#/$defs/action"
538
+ }
539
+ ]
540
+ },
541
+ "timeout": {
542
+ "$ref": "#/$defs/duration"
543
+ },
544
+ "onTimeout": {
545
+ "$ref": "#/$defs/transitionOrArray"
546
+ },
547
+ "meta": {
548
+ "type": "object"
549
+ },
550
+ "description": {
551
+ "type": "string"
552
+ },
553
+ "history": {
554
+ "type": "string",
555
+ "enum": ["shallow", "deep"]
556
+ },
557
+ "target": {
558
+ "oneOf": [
559
+ {
560
+ "type": "string",
561
+ "minLength": 1
562
+ },
563
+ {
564
+ "type": "array",
565
+ "minItems": 1,
566
+ "items": {
567
+ "type": "string",
568
+ "minLength": 1
569
+ }
570
+ }
571
+ ]
572
+ },
573
+ "output": {},
574
+ "input": {},
575
+ "tags": {
576
+ "oneOf": [
577
+ {
578
+ "type": "string"
579
+ },
580
+ {
581
+ "type": "array",
582
+ "items": {
583
+ "type": "string"
584
+ }
585
+ }
586
+ ]
587
+ },
588
+ "context": {
589
+ "type": "object"
590
+ },
591
+ "version": {
592
+ "type": "string"
593
+ },
594
+ "internalEvents": {
595
+ "type": "array",
596
+ "items": {
597
+ "type": "string"
598
+ }
599
+ },
600
+ "schemas": {
601
+ "$ref": "#/$defs/schemas"
602
+ },
603
+ "actions": {
604
+ "$ref": "#/$defs/actionDefinitions"
605
+ },
606
+ "guards": {
607
+ "$ref": "#/$defs/guardDefinitions"
608
+ },
609
+ "actors": {
610
+ "type": "object"
611
+ },
612
+ "delays": {
613
+ "$ref": "#/$defs/delayDefinitions"
614
+ }
615
+ },
616
+ "allOf": [
617
+ {
618
+ "if": {
619
+ "properties": {
620
+ "type": {
621
+ "const": "history"
622
+ }
623
+ },
624
+ "required": ["type"]
625
+ },
626
+ "then": {
627
+ "required": ["target"]
628
+ }
629
+ },
630
+ {
631
+ "if": {
632
+ "required": ["history"]
633
+ },
634
+ "then": {
635
+ "required": ["target"]
636
+ }
637
+ }
638
+ ],
639
+ "additionalProperties": false
640
+ },
641
+ "machine": {
642
+ "$ref": "#/$defs/stateNode"
643
+ }
644
+ },
645
+ "$id": "https://stately.ai/schemas/xstate-v6.json",
646
+ "examples": [
647
+ {
648
+ "initial": "idle",
649
+ "context": {
650
+ "count": 0
651
+ },
652
+ "states": {
653
+ "idle": {
654
+ "on": {
655
+ "INC": {
656
+ "target": "done",
657
+ "actions": [
658
+ {
659
+ "type": "@xstate.assign",
660
+ "context": {
661
+ "count": 1
662
+ }
663
+ }
664
+ ]
665
+ }
666
+ }
667
+ },
668
+ "done": {
669
+ "type": "final"
670
+ }
671
+ }
672
+ }
673
+ ]
674
+ }