flowspec2 1.0.0__py3-none-any.whl

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.
Files changed (92) hide show
  1. flowspec2/__init__.py +105 -0
  2. flowspec2/authoring/__init__.py +275 -0
  3. flowspec2/authoring/authoring-evidence-signature.schema.json +34 -0
  4. flowspec2/authoring/authoring-evidence.schema.json +455 -0
  5. flowspec2/authoring/authoring-operational-evidence.schema.json +160 -0
  6. flowspec2/authoring/benchmark.py +1409 -0
  7. flowspec2/authoring/corpus/await_correction.case.json +220 -0
  8. flowspec2/authoring/corpus/flowspec2.ctk.json +769 -0
  9. flowspec2/authoring/corpus/gated_derive.case.json +100 -0
  10. flowspec2/authoring/corpus/linear.case.json +55 -0
  11. flowspec2/authoring/corpus/manifest.json +31 -0
  12. flowspec2/authoring/corpus/subflow.case.json +66 -0
  13. flowspec2/authoring/corpus/terminal.case.json +94 -0
  14. flowspec2/authoring/corpus.py +307 -0
  15. flowspec2/authoring/ctk.py +836 -0
  16. flowspec2/authoring/detached_signature.py +120 -0
  17. flowspec2/authoring/evidence.py +311 -0
  18. flowspec2/authoring/evidence_signature.py +187 -0
  19. flowspec2/authoring/evidence_verification.py +229 -0
  20. flowspec2/authoring/gemini.py +215 -0
  21. flowspec2/authoring/operational-corpus.json +61 -0
  22. flowspec2/authoring/operational.py +956 -0
  23. flowspec2/authoring/operational_providers.py +167 -0
  24. flowspec2/authoring/presentation_review.py +1013 -0
  25. flowspec2/authoring/presentation_review_signature.py +305 -0
  26. flowspec2/authoring/projection.py +299 -0
  27. flowspec2/authoring/provider_prompt.py +83 -0
  28. flowspec2/backends/__init__.py +82 -0
  29. flowspec2/backends/http.py +189 -0
  30. flowspec2/checker.py +238 -0
  31. flowspec2/cli.py +789 -0
  32. flowspec2/cli_parser.py +345 -0
  33. flowspec2/clock.py +23 -0
  34. flowspec2/compat/__init__.py +47 -0
  35. flowspec2/compat/models.py +82 -0
  36. flowspec2/compat/open_workflow.py +616 -0
  37. flowspec2/compat/rasa.py +19 -0
  38. flowspec2/compat/rasa_export.py +876 -0
  39. flowspec2/compat/rasa_import.py +992 -0
  40. flowspec2/compat/rasa_shared.py +270 -0
  41. flowspec2/compat/schemas/open-workflow-conversation-1.schema.json +138 -0
  42. flowspec2/compat/schemas/vendor/open-workflow-1.0.3.LICENSE +201 -0
  43. flowspec2/compat/schemas/vendor/open-workflow-1.0.3.provenance.json +13 -0
  44. flowspec2/compat/schemas/vendor/open-workflow-1.0.3.workflow.yaml +1956 -0
  45. flowspec2/compat/tool_profiles.py +149 -0
  46. flowspec2/compat/yaml.py +147 -0
  47. flowspec2/compiler.py +957 -0
  48. flowspec2/compiler_contracts.py +17 -0
  49. flowspec2/compiler_resume_contracts.py +594 -0
  50. flowspec2/compiler_schema_relations.py +1830 -0
  51. flowspec2/compiler_tool_contracts.py +245 -0
  52. flowspec2/compiler_value_contracts.py +447 -0
  53. flowspec2/derive.py +32 -0
  54. flowspec2/diagnostics.py +94 -0
  55. flowspec2/domains.py +489 -0
  56. flowspec2/experimental/__init__.py +57 -0
  57. flowspec2/experimental/flowspec-3-draft.schema.json +923 -0
  58. flowspec2/experimental/v3-preview-loss-policy.json +161 -0
  59. flowspec2/experimental/v3_lowering.py +928 -0
  60. flowspec2/experimental/v3_preview.py +2460 -0
  61. flowspec2/flowspec-2.schema.json +635 -0
  62. flowspec2/interactive.py +300 -0
  63. flowspec2/ir.py +1459 -0
  64. flowspec2/json_codec.py +120 -0
  65. flowspec2/llm.py +366 -0
  66. flowspec2/models.py +121 -0
  67. flowspec2/nodes.py +1537 -0
  68. flowspec2/observability.py +151 -0
  69. flowspec2/predicates.py +89 -0
  70. flowspec2/profiles.py +118 -0
  71. flowspec2/py.typed +0 -0
  72. flowspec2/runtime.py +1059 -0
  73. flowspec2/schema.py +54 -0
  74. flowspec2/schema_contracts.py +203 -0
  75. flowspec2/semantic_derive_contracts.py +530 -0
  76. flowspec2/semantic_path_contracts.py +528 -0
  77. flowspec2/semantic_predicate_contracts.py +355 -0
  78. flowspec2/semantic_schema_contracts.py +137 -0
  79. flowspec2/semantic_source_contracts.py +21 -0
  80. flowspec2/semantic_state_contracts.py +450 -0
  81. flowspec2/semantic_support.py +40 -0
  82. flowspec2/semantics.py +410 -0
  83. flowspec2/state_migration.py +1034 -0
  84. flowspec2/subflows/__init__.py +1117 -0
  85. flowspec2/subflows/address.py +328 -0
  86. flowspec2/subflows/identification.py +1031 -0
  87. flowspec2/tools.py +1154 -0
  88. flowspec2-1.0.0.dist-info/METADATA +482 -0
  89. flowspec2-1.0.0.dist-info/RECORD +92 -0
  90. flowspec2-1.0.0.dist-info/WHEEL +4 -0
  91. flowspec2-1.0.0.dist-info/entry_points.txt +2 -0
  92. flowspec2-1.0.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,923 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://wllsena.github.io/flowspec2/schemas/flowspec-3-draft.json",
4
+ "title": "Experimental flowspec/3-draft authoring source",
5
+ "description": "Non-stable source preview. It is intentionally not a runtime compiler contract.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["schema", "flow", "version", "route", "steps"],
9
+ "properties": {
10
+ "schema": { "const": "flowspec/3-draft" },
11
+ "flow": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$" },
12
+ "version": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$" },
13
+ "service": { "$ref": "#/$defs/service" },
14
+ "route": { "$ref": "#/$defs/route" },
15
+ "config": { "$ref": "#/$defs/config" },
16
+ "steps": {
17
+ "type": "array",
18
+ "minItems": 1,
19
+ "items": { "$ref": "#/$defs/step" }
20
+ },
21
+ "v2_passthrough": { "$ref": "#/$defs/v2Passthrough" }
22
+ },
23
+ "$defs": {
24
+ "service": {
25
+ "type": "object",
26
+ "additionalProperties": false,
27
+ "properties": {
28
+ "id": { "type": "string" },
29
+ "service_code": { "type": "string" },
30
+ "knowledge_service_id": { "type": "string" },
31
+ "identification_required": { "type": "boolean" },
32
+ "slugs": {
33
+ "type": "array",
34
+ "items": { "type": "string" }
35
+ }
36
+ }
37
+ },
38
+ "route": {
39
+ "type": "object",
40
+ "additionalProperties": false,
41
+ "required": ["description"],
42
+ "properties": {
43
+ "description": { "type": "string", "minLength": 1 },
44
+ "trigger_phrases": {
45
+ "type": "array",
46
+ "items": { "type": "string" }
47
+ },
48
+ "entry_args_schema": { "type": "object" }
49
+ }
50
+ },
51
+ "config": {
52
+ "type": "object",
53
+ "additionalProperties": false,
54
+ "properties": {
55
+ "address_required": { "type": "boolean" },
56
+ "identification_required": { "type": "boolean" },
57
+ "max_attempts": { "type": "integer", "minimum": 1 }
58
+ }
59
+ },
60
+ "step": {
61
+ "oneOf": [
62
+ { "$ref": "#/$defs/collectStep" },
63
+ { "$ref": "#/$defs/useStep" },
64
+ { "$ref": "#/$defs/confirmStep" },
65
+ { "$ref": "#/$defs/deriveStep" },
66
+ { "$ref": "#/$defs/submitStep" },
67
+ { "$ref": "#/$defs/awaitStep" }
68
+ ]
69
+ },
70
+ "collectStep": {
71
+ "type": "object",
72
+ "additionalProperties": false,
73
+ "required": ["collect", "domain"],
74
+ "properties": {
75
+ "collect": { "$ref": "#/$defs/name" },
76
+ "id": { "$ref": "#/$defs/name" },
77
+ "domain": { "$ref": "#/$defs/domain" },
78
+ "persist": { "$ref": "#/$defs/persistence" },
79
+ "required": { "type": "boolean" },
80
+ "nullable": { "type": "boolean" },
81
+ "requires": {
82
+ "type": "array",
83
+ "uniqueItems": true,
84
+ "items": { "$ref": "#/$defs/slotReference" }
85
+ },
86
+ "prefill_sources": {
87
+ "type": "array",
88
+ "minItems": 1,
89
+ "uniqueItems": true,
90
+ "items": { "$ref": "#/$defs/name" }
91
+ },
92
+ "max_attempts": { "type": "integer", "minimum": 1 },
93
+ "on_exhaust": { "$ref": "#/$defs/exhaustion" },
94
+ "default": {},
95
+ "fill_only_when_asked": { "type": "boolean" },
96
+ "prompt": { "$ref": "#/$defs/prompt" },
97
+ "ui": { "$ref": "#/$defs/inputUi" },
98
+ "ask_when": { "$ref": "#/$defs/predicate" },
99
+ "skip_when": { "$ref": "#/$defs/predicate" },
100
+ "gate": { "$ref": "#/$defs/predicate" }
101
+ },
102
+ "allOf": [
103
+ {
104
+ "if": {
105
+ "properties": { "on_exhaust": { "const": "default" } },
106
+ "required": ["on_exhaust"]
107
+ },
108
+ "then": { "required": ["default"] },
109
+ "else": { "not": { "required": ["default"] } }
110
+ },
111
+ {
112
+ "if": {
113
+ "properties": { "nullable": { "const": true } },
114
+ "required": ["nullable"]
115
+ },
116
+ "then": {
117
+ "properties": { "required": { "const": true } },
118
+ "required": ["required"]
119
+ }
120
+ },
121
+ {
122
+ "if": { "required": ["prefill_sources"] },
123
+ "then": {
124
+ "properties": { "fill_only_when_asked": { "const": true } },
125
+ "required": ["fill_only_when_asked"]
126
+ }
127
+ },
128
+ {
129
+ "not": { "required": ["ask_when", "gate"] }
130
+ }
131
+ ]
132
+ },
133
+ "useStep": {
134
+ "type": "object",
135
+ "additionalProperties": false,
136
+ "required": ["use"],
137
+ "properties": {
138
+ "use": {
139
+ "type": "string",
140
+ "pattern": "^[a-z][a-z0-9_]*@[0-9]+$"
141
+ },
142
+ "with": {
143
+ "description": "Profile-validated subflow configuration payload.",
144
+ "type": "object",
145
+ "additionalProperties": true
146
+ }
147
+ }
148
+ },
149
+ "confirmStep": {
150
+ "type": "object",
151
+ "additionalProperties": false,
152
+ "required": ["confirm", "domain"],
153
+ "properties": {
154
+ "confirm": { "$ref": "#/$defs/name" },
155
+ "id": { "$ref": "#/$defs/name" },
156
+ "domain": { "$ref": "#/$defs/booleanDomain" },
157
+ "persist": { "$ref": "#/$defs/persistence" },
158
+ "required": { "type": "boolean" },
159
+ "nullable": { "type": "boolean" },
160
+ "requires": {
161
+ "type": "array",
162
+ "uniqueItems": true,
163
+ "items": { "$ref": "#/$defs/slotReference" }
164
+ },
165
+ "prefill_sources": {
166
+ "type": "array",
167
+ "minItems": 1,
168
+ "uniqueItems": true,
169
+ "items": { "$ref": "#/$defs/name" }
170
+ },
171
+ "max_attempts": { "type": "integer", "minimum": 1 },
172
+ "on_exhaust": { "$ref": "#/$defs/exhaustion" },
173
+ "default": {},
174
+ "fill_only_when_asked": { "type": "boolean" },
175
+ "prompt": { "$ref": "#/$defs/prompt" },
176
+ "ui": { "$ref": "#/$defs/inputUi" },
177
+ "ask_when": { "$ref": "#/$defs/predicate" },
178
+ "skip_when": { "$ref": "#/$defs/predicate" },
179
+ "gate": { "$ref": "#/$defs/predicate" },
180
+ "on_reject": {
181
+ "type": "object",
182
+ "additionalProperties": false,
183
+ "required": ["end"],
184
+ "properties": { "end": { "type": "string", "minLength": 1 } }
185
+ },
186
+ "correction_hub": { "const": true },
187
+ "correctable": {
188
+ "type": "array",
189
+ "minItems": 1,
190
+ "items": { "$ref": "#/$defs/slotReference" }
191
+ },
192
+ "on_confirm": { "$ref": "#/$defs/stepReference" }
193
+ },
194
+ "allOf": [
195
+ {
196
+ "if": {
197
+ "properties": { "on_exhaust": { "const": "default" } },
198
+ "required": ["on_exhaust"]
199
+ },
200
+ "then": { "required": ["default"] },
201
+ "else": { "not": { "required": ["default"] } }
202
+ },
203
+ {
204
+ "if": {
205
+ "properties": { "nullable": { "const": true } },
206
+ "required": ["nullable"]
207
+ },
208
+ "then": {
209
+ "properties": { "required": { "const": true } },
210
+ "required": ["required"]
211
+ }
212
+ },
213
+ {
214
+ "if": { "required": ["prefill_sources"] },
215
+ "then": {
216
+ "properties": { "fill_only_when_asked": { "const": true } },
217
+ "required": ["fill_only_when_asked"]
218
+ }
219
+ },
220
+ {
221
+ "not": { "required": ["ask_when", "gate"] }
222
+ },
223
+ {
224
+ "not": { "required": ["on_reject", "correction_hub"] }
225
+ },
226
+ {
227
+ "if": { "required": ["correction_hub"] },
228
+ "then": {
229
+ "required": ["correctable", "on_confirm"],
230
+ "not": {
231
+ "anyOf": [
232
+ { "required": ["ask_when"] },
233
+ { "required": ["skip_when"] },
234
+ { "required": ["gate"] },
235
+ { "required": ["on_reject"] }
236
+ ]
237
+ }
238
+ },
239
+ "else": {
240
+ "not": {
241
+ "anyOf": [
242
+ { "required": ["correctable"] },
243
+ { "required": ["on_confirm"] }
244
+ ]
245
+ }
246
+ }
247
+ },
248
+ {
249
+ "if": { "required": ["on_reject"] },
250
+ "then": {
251
+ "not": {
252
+ "anyOf": [
253
+ { "required": ["ask_when"] },
254
+ { "required": ["gate"] }
255
+ ]
256
+ }
257
+ }
258
+ },
259
+ {
260
+ "if": {
261
+ "not": {
262
+ "anyOf": [
263
+ { "required": ["on_reject"] },
264
+ { "required": ["correction_hub"] }
265
+ ]
266
+ }
267
+ },
268
+ "then": { "not": { "required": ["skip_when"] } }
269
+ }
270
+ ]
271
+ },
272
+ "deriveStep": {
273
+ "type": "object",
274
+ "additionalProperties": false,
275
+ "required": ["derive", "from", "lookup"],
276
+ "properties": {
277
+ "derive": { "$ref": "#/$defs/name" },
278
+ "id": { "$ref": "#/$defs/name" },
279
+ "from": {
280
+ "type": "array",
281
+ "minItems": 1,
282
+ "uniqueItems": true,
283
+ "items": { "$ref": "#/$defs/sourceReference" }
284
+ },
285
+ "lookup": {
286
+ "type": "object",
287
+ "additionalProperties": { "$ref": "#/$defs/jsonLiteral" }
288
+ },
289
+ "default": {
290
+ "oneOf": [
291
+ { "$ref": "#/$defs/sourceReference" },
292
+ { "$ref": "#/$defs/jsonLiteral" }
293
+ ]
294
+ }
295
+ }
296
+ },
297
+ "submitStep": {
298
+ "type": "object",
299
+ "additionalProperties": false,
300
+ "required": ["submit", "id", "idempotent", "outcomes"],
301
+ "properties": {
302
+ "submit": { "$ref": "#/$defs/name" },
303
+ "id": { "$ref": "#/$defs/name" },
304
+ "idempotent": { "type": "boolean" },
305
+ "input": {
306
+ "type": "object",
307
+ "propertyNames": { "$ref": "#/$defs/fieldName" },
308
+ "additionalProperties": { "$ref": "#/$defs/sourceReference" }
309
+ },
310
+ "outputs": {
311
+ "type": "object",
312
+ "propertyNames": { "$ref": "#/$defs/stateKey" },
313
+ "additionalProperties": { "$ref": "#/$defs/terminalResultReference" }
314
+ },
315
+ "outcomes": { "$ref": "#/$defs/outcomes" },
316
+ "empty_payload": { "$ref": "#/$defs/emptyPayload" }
317
+ }
318
+ },
319
+ "awaitStep": {
320
+ "type": "object",
321
+ "additionalProperties": false,
322
+ "required": ["await", "id", "resume_on", "ui"],
323
+ "properties": {
324
+ "await": { "enum": ["cta_url"] },
325
+ "id": { "$ref": "#/$defs/name" },
326
+ "resume_on": { "$ref": "#/$defs/fieldName" },
327
+ "prompt": { "$ref": "#/$defs/prompt" },
328
+ "ui": { "$ref": "#/$defs/ctaUi" },
329
+ "on_resume": { "$ref": "#/$defs/onResume" },
330
+ "timeout": { "$ref": "#/$defs/transition" },
331
+ "recovery": {
332
+ "type": "object",
333
+ "additionalProperties": false,
334
+ "properties": {
335
+ "abort": { "$ref": "#/$defs/transition" },
336
+ "resend": { "$ref": "#/$defs/transition" },
337
+ "switch": { "$ref": "#/$defs/transition" }
338
+ }
339
+ }
340
+ }
341
+ },
342
+ "domain": {
343
+ "oneOf": [
344
+ { "$ref": "#/$defs/categoricalDomain" },
345
+ { "$ref": "#/$defs/booleanDomain" },
346
+ {
347
+ "type": "object",
348
+ "additionalProperties": false,
349
+ "required": ["type"],
350
+ "properties": {
351
+ "type": { "const": "free_text" },
352
+ "optional": { "type": "boolean" }
353
+ }
354
+ },
355
+ {
356
+ "type": "object",
357
+ "additionalProperties": false,
358
+ "required": ["type"],
359
+ "properties": {
360
+ "type": { "enum": ["brazilian_tax_id", "email", "name"] }
361
+ }
362
+ },
363
+ {
364
+ "type": "object",
365
+ "additionalProperties": false,
366
+ "required": ["type"],
367
+ "properties": {
368
+ "type": { "const": "integer" },
369
+ "minimum": { "type": "number" },
370
+ "maximum": { "type": "number" }
371
+ }
372
+ },
373
+ {
374
+ "type": "object",
375
+ "additionalProperties": false,
376
+ "required": ["type"],
377
+ "properties": {
378
+ "type": { "const": "number" },
379
+ "minimum": { "type": "number" },
380
+ "maximum": { "type": "number" }
381
+ }
382
+ }
383
+ ]
384
+ },
385
+ "categoricalDomain": {
386
+ "type": "object",
387
+ "additionalProperties": false,
388
+ "required": ["type", "options"],
389
+ "properties": {
390
+ "type": { "const": "categorical" },
391
+ "options": {
392
+ "type": "array",
393
+ "items": { "$ref": "#/$defs/categoricalOption" }
394
+ },
395
+ "accepts_null": { "const": true },
396
+ "null_aliases": {
397
+ "type": "array",
398
+ "minItems": 1,
399
+ "uniqueItems": true,
400
+ "items": { "type": "string", "minLength": 1 }
401
+ },
402
+ "normalize": { "$ref": "#/$defs/categoricalNormalization" }
403
+ },
404
+ "allOf": [
405
+ {
406
+ "if": { "required": ["null_aliases"] },
407
+ "then": { "required": ["accepts_null"] }
408
+ },
409
+ {
410
+ "anyOf": [
411
+ { "properties": { "options": { "minItems": 1 } } },
412
+ { "required": ["accepts_null"] }
413
+ ]
414
+ }
415
+ ]
416
+ },
417
+ "booleanDomain": {
418
+ "type": "object",
419
+ "additionalProperties": false,
420
+ "required": ["type", "options"],
421
+ "properties": {
422
+ "type": { "const": "bool" },
423
+ "options": {
424
+ "type": "array",
425
+ "minItems": 2,
426
+ "maxItems": 2,
427
+ "prefixItems": [
428
+ {
429
+ "allOf": [
430
+ { "$ref": "#/$defs/booleanOption" },
431
+ { "properties": { "value": { "const": true } } }
432
+ ]
433
+ },
434
+ {
435
+ "allOf": [
436
+ { "$ref": "#/$defs/booleanOption" },
437
+ { "properties": { "value": { "const": false } } }
438
+ ]
439
+ }
440
+ ],
441
+ "items": false
442
+ },
443
+ "normalize": { "$ref": "#/$defs/booleanNormalization" }
444
+ }
445
+ },
446
+ "categoricalOption": {
447
+ "type": "object",
448
+ "additionalProperties": false,
449
+ "required": ["value", "label"],
450
+ "properties": {
451
+ "value": { "type": "string", "minLength": 1 },
452
+ "label": { "type": "string", "minLength": 1 },
453
+ "aliases": {
454
+ "type": "array",
455
+ "uniqueItems": true,
456
+ "items": { "type": "string", "minLength": 1 }
457
+ },
458
+ "description": { "type": "string" }
459
+ }
460
+ },
461
+ "booleanOption": {
462
+ "type": "object",
463
+ "additionalProperties": false,
464
+ "required": ["value", "label"],
465
+ "properties": {
466
+ "value": { "type": "boolean" },
467
+ "label": { "type": "string", "minLength": 1 },
468
+ "aliases": {
469
+ "type": "array",
470
+ "uniqueItems": true,
471
+ "items": { "type": "string", "minLength": 1 }
472
+ },
473
+ "description": { "type": "string" }
474
+ }
475
+ },
476
+ "categoricalNormalization": {
477
+ "type": "object",
478
+ "additionalProperties": false,
479
+ "properties": {
480
+ "accent_fold": { "type": "boolean" },
481
+ "number_words": { "type": "boolean" }
482
+ }
483
+ },
484
+ "booleanNormalization": {
485
+ "type": "object",
486
+ "additionalProperties": false,
487
+ "properties": {
488
+ "accent_fold": { "type": "boolean" },
489
+ "affirmation": { "type": "boolean" },
490
+ "emoji_veto": { "type": "boolean" }
491
+ },
492
+ "allOf": [
493
+ {
494
+ "if": {
495
+ "properties": { "emoji_veto": { "const": true } },
496
+ "required": ["emoji_veto"]
497
+ },
498
+ "then": {
499
+ "properties": { "affirmation": { "const": true } },
500
+ "required": ["affirmation"]
501
+ }
502
+ }
503
+ ]
504
+ },
505
+ "prompt": {
506
+ "type": "object",
507
+ "additionalProperties": false,
508
+ "required": ["text"],
509
+ "properties": {
510
+ "text": { "type": "string" },
511
+ "verbatim": { "type": "boolean" },
512
+ "extract_hint": { "type": "string" }
513
+ }
514
+ },
515
+ "inputUi": {
516
+ "oneOf": [
517
+ { "$ref": "#/$defs/buttonsUi" },
518
+ { "$ref": "#/$defs/listUi" },
519
+ { "$ref": "#/$defs/flowUi" }
520
+ ]
521
+ },
522
+ "buttonsUi": {
523
+ "type": "object",
524
+ "additionalProperties": false,
525
+ "required": ["kind", "field"],
526
+ "properties": {
527
+ "kind": { "const": "buttons" },
528
+ "field": { "$ref": "#/$defs/fieldName" },
529
+ "options_when": {
530
+ "type": "array",
531
+ "minItems": 1,
532
+ "uniqueItems": true,
533
+ "items": {
534
+ "type": "object",
535
+ "additionalProperties": false,
536
+ "required": ["value", "gate"],
537
+ "properties": {
538
+ "value": { "$ref": "#/$defs/choiceValue" },
539
+ "gate": { "$ref": "#/$defs/predicate" }
540
+ }
541
+ }
542
+ }
543
+ }
544
+ },
545
+ "listUi": {
546
+ "type": "object",
547
+ "additionalProperties": false,
548
+ "required": ["kind", "field"],
549
+ "properties": {
550
+ "kind": { "const": "list" },
551
+ "field": { "$ref": "#/$defs/fieldName" },
552
+ "options_when": {
553
+ "type": "array",
554
+ "minItems": 1,
555
+ "uniqueItems": true,
556
+ "items": {
557
+ "type": "object",
558
+ "additionalProperties": false,
559
+ "required": ["value", "gate"],
560
+ "properties": {
561
+ "value": { "$ref": "#/$defs/choiceValue" },
562
+ "gate": { "$ref": "#/$defs/predicate" }
563
+ }
564
+ }
565
+ }
566
+ }
567
+ },
568
+ "flowUi": {
569
+ "type": "object",
570
+ "additionalProperties": false,
571
+ "required": ["kind", "field", "meta_flow_ref"],
572
+ "properties": {
573
+ "kind": { "const": "flow" },
574
+ "field": { "$ref": "#/$defs/fieldName" },
575
+ "meta_flow_ref": { "type": "string", "minLength": 1 },
576
+ "prefill_from": {
577
+ "type": "array",
578
+ "uniqueItems": true,
579
+ "items": { "$ref": "#/$defs/slotReference" }
580
+ }
581
+ }
582
+ },
583
+ "ctaUi": {
584
+ "type": "object",
585
+ "additionalProperties": false,
586
+ "required": ["kind", "field", "out_of_band", "next_step"],
587
+ "properties": {
588
+ "kind": { "const": "cta_url" },
589
+ "field": { "$ref": "#/$defs/fieldName" },
590
+ "out_of_band": { "const": true },
591
+ "next_step": { "$ref": "#/$defs/stepReference" }
592
+ }
593
+ },
594
+ "predicate": {
595
+ "type": "object",
596
+ "minProperties": 1,
597
+ "maxProperties": 1,
598
+ "additionalProperties": false,
599
+ "properties": {
600
+ "in": {
601
+ "type": "array",
602
+ "prefixItems": [
603
+ { "$ref": "#/$defs/predicateReference" },
604
+ {
605
+ "type": "array",
606
+ "items": { "$ref": "#/$defs/jsonScalar" }
607
+ }
608
+ ],
609
+ "items": false,
610
+ "minItems": 2,
611
+ "maxItems": 2
612
+ },
613
+ "eq": {
614
+ "type": "array",
615
+ "prefixItems": [
616
+ { "$ref": "#/$defs/operand" },
617
+ { "$ref": "#/$defs/operand" }
618
+ ],
619
+ "items": false,
620
+ "minItems": 2,
621
+ "maxItems": 2
622
+ },
623
+ "ne": {
624
+ "type": "array",
625
+ "prefixItems": [
626
+ { "$ref": "#/$defs/operand" },
627
+ { "$ref": "#/$defs/operand" }
628
+ ],
629
+ "items": false,
630
+ "minItems": 2,
631
+ "maxItems": 2
632
+ },
633
+ "is_present": { "$ref": "#/$defs/predicateReference" },
634
+ "and": {
635
+ "type": "array",
636
+ "minItems": 1,
637
+ "items": { "$ref": "#/$defs/predicate" }
638
+ },
639
+ "or": {
640
+ "type": "array",
641
+ "minItems": 1,
642
+ "items": { "$ref": "#/$defs/predicate" }
643
+ },
644
+ "not": { "$ref": "#/$defs/predicate" }
645
+ }
646
+ },
647
+ "operand": {
648
+ "oneOf": [
649
+ { "$ref": "#/$defs/predicateReference" },
650
+ { "$ref": "#/$defs/jsonScalar" }
651
+ ]
652
+ },
653
+ "predicateReference": {
654
+ "oneOf": [
655
+ { "$ref": "#/$defs/slotReference" },
656
+ { "$ref": "#/$defs/deriveReference" },
657
+ { "$ref": "#/$defs/configReference" },
658
+ { "$ref": "#/$defs/payloadReference" },
659
+ { "$ref": "#/$defs/internalReference" },
660
+ { "$ref": "#/$defs/addressReference" }
661
+ ]
662
+ },
663
+ "sourceReference": {
664
+ "oneOf": [
665
+ { "$ref": "#/$defs/slotReference" },
666
+ { "$ref": "#/$defs/deriveReference" }
667
+ ]
668
+ },
669
+ "slotReference": {
670
+ "type": "object",
671
+ "additionalProperties": false,
672
+ "required": ["$slot"],
673
+ "properties": { "$slot": { "$ref": "#/$defs/stateKey" } }
674
+ },
675
+ "deriveReference": {
676
+ "type": "object",
677
+ "additionalProperties": false,
678
+ "required": ["$derive"],
679
+ "properties": { "$derive": { "$ref": "#/$defs/stateKey" } }
680
+ },
681
+ "terminalResultReference": {
682
+ "type": "object",
683
+ "additionalProperties": false,
684
+ "required": ["$result"],
685
+ "properties": { "$result": { "$ref": "#/$defs/objectAccessPath" } }
686
+ },
687
+ "enrichmentResultReference": {
688
+ "type": "object",
689
+ "additionalProperties": false,
690
+ "required": ["$result"],
691
+ "properties": { "$result": { "$ref": "#/$defs/arrayAccessPath" } }
692
+ },
693
+ "stepReference": {
694
+ "type": "object",
695
+ "additionalProperties": false,
696
+ "required": ["$step"],
697
+ "properties": { "$step": { "$ref": "#/$defs/name" } }
698
+ },
699
+ "configReference": {
700
+ "type": "object",
701
+ "additionalProperties": false,
702
+ "required": ["$config"],
703
+ "properties": { "$config": { "$ref": "#/$defs/objectAccessPath" } }
704
+ },
705
+ "payloadReference": {
706
+ "type": "object",
707
+ "additionalProperties": false,
708
+ "required": ["$payload"],
709
+ "properties": { "$payload": { "$ref": "#/$defs/objectAccessPath" } }
710
+ },
711
+ "internalReference": {
712
+ "type": "object",
713
+ "additionalProperties": false,
714
+ "required": ["$internal"],
715
+ "properties": { "$internal": { "$ref": "#/$defs/objectAccessPath" } }
716
+ },
717
+ "addressReference": {
718
+ "type": "object",
719
+ "additionalProperties": false,
720
+ "required": ["$address"],
721
+ "properties": { "$address": { "$ref": "#/$defs/objectAccessPath" } }
722
+ },
723
+ "tokenReference": {
724
+ "type": "object",
725
+ "additionalProperties": false,
726
+ "required": ["$token"],
727
+ "properties": { "$token": { "$ref": "#/$defs/arrayAccessPath" } }
728
+ },
729
+ "onResume": {
730
+ "type": "object",
731
+ "additionalProperties": false,
732
+ "properties": {
733
+ "set": { "$ref": "#/$defs/tokenBindingMap" },
734
+ "enrich": { "$ref": "#/$defs/enrichment" }
735
+ }
736
+ },
737
+ "enrichment": {
738
+ "type": "object",
739
+ "additionalProperties": false,
740
+ "required": ["tool"],
741
+ "properties": {
742
+ "tool": { "$ref": "#/$defs/name" },
743
+ "optional": { "type": "boolean" },
744
+ "input": { "$ref": "#/$defs/tokenBindingMap" },
745
+ "set": { "$ref": "#/$defs/resultBindingMap" }
746
+ }
747
+ },
748
+ "transition": {
749
+ "type": "object",
750
+ "additionalProperties": false,
751
+ "required": ["goto"],
752
+ "properties": {
753
+ "goto": {
754
+ "oneOf": [
755
+ { "const": "END" },
756
+ { "$ref": "#/$defs/stepReference" }
757
+ ]
758
+ },
759
+ "set": { "$ref": "#/$defs/literalMap" }
760
+ }
761
+ },
762
+ "tokenBindingMap": {
763
+ "type": "object",
764
+ "propertyNames": { "$ref": "#/$defs/stateKey" },
765
+ "additionalProperties": {
766
+ "oneOf": [
767
+ { "$ref": "#/$defs/tokenReference" },
768
+ { "$ref": "#/$defs/jsonLiteral" }
769
+ ]
770
+ }
771
+ },
772
+ "resultBindingMap": {
773
+ "type": "object",
774
+ "propertyNames": { "$ref": "#/$defs/stateKey" },
775
+ "additionalProperties": {
776
+ "oneOf": [
777
+ { "$ref": "#/$defs/enrichmentResultReference" },
778
+ { "$ref": "#/$defs/jsonLiteral" }
779
+ ]
780
+ }
781
+ },
782
+ "literalMap": {
783
+ "type": "object",
784
+ "propertyNames": { "$ref": "#/$defs/stateKey" },
785
+ "additionalProperties": { "$ref": "#/$defs/jsonValue" }
786
+ },
787
+ "outcomes": {
788
+ "type": "object",
789
+ "additionalProperties": false,
790
+ "required": ["success", "retryable", "fatal"],
791
+ "properties": {
792
+ "success": {
793
+ "type": "object",
794
+ "additionalProperties": false,
795
+ "properties": {
796
+ "set": { "$ref": "#/$defs/literalMap" },
797
+ "reset_next": { "type": "boolean" }
798
+ }
799
+ },
800
+ "retryable": {
801
+ "type": "object",
802
+ "additionalProperties": false,
803
+ "properties": {
804
+ "preserve_state": { "type": "boolean" }
805
+ }
806
+ },
807
+ "fatal": {
808
+ "type": "object",
809
+ "additionalProperties": false,
810
+ "properties": {
811
+ "reset_next": { "type": "boolean" }
812
+ }
813
+ }
814
+ }
815
+ },
816
+ "emptyPayload": {
817
+ "type": "object",
818
+ "additionalProperties": false,
819
+ "properties": {
820
+ "never_saved": { "enum": ["reset", "ignore"] },
821
+ "in_progress": { "enum": ["reset", "ignore"] }
822
+ }
823
+ },
824
+ "v2Passthrough": {
825
+ "description": "Ordered, policy-classified source fragments emitted only by v2 migration.",
826
+ "type": "object",
827
+ "additionalProperties": false,
828
+ "required": ["contract", "entries"],
829
+ "properties": {
830
+ "contract": { "const": "flowspec2/v3-preview-loss-policy@1" },
831
+ "entries": {
832
+ "type": "array",
833
+ "minItems": 1,
834
+ "uniqueItems": true,
835
+ "items": { "$ref": "#/$defs/lossEntry" }
836
+ }
837
+ }
838
+ },
839
+ "lossEntry": {
840
+ "type": "object",
841
+ "additionalProperties": false,
842
+ "required": ["source_path", "category", "disposition", "source_fragment"],
843
+ "properties": {
844
+ "source_path": { "$ref": "#/$defs/jsonPointer" },
845
+ "category": {
846
+ "type": "string",
847
+ "pattern": "^[a-z][a-z0-9_]*$"
848
+ },
849
+ "disposition": { "enum": ["compatibility_only", "excluded"] },
850
+ "source_fragment": { "$ref": "#/$defs/passthroughValue" }
851
+ }
852
+ },
853
+ "passthroughValue": {
854
+ "oneOf": [
855
+ { "$ref": "#/$defs/jsonScalar" },
856
+ {
857
+ "type": "array",
858
+ "items": { "$ref": "#/$defs/passthroughValue" }
859
+ },
860
+ {
861
+ "type": "object",
862
+ "additionalProperties": { "$ref": "#/$defs/passthroughValue" }
863
+ }
864
+ ]
865
+ },
866
+ "jsonLiteral": {
867
+ "oneOf": [
868
+ { "$ref": "#/$defs/jsonScalar" },
869
+ {
870
+ "type": "array",
871
+ "items": { "$ref": "#/$defs/jsonLiteral" }
872
+ },
873
+ {
874
+ "type": "object",
875
+ "propertyNames": {
876
+ "not": {
877
+ "pattern": "^\\$(?:slot|derive|result|step|token|config|payload|internal|address)$"
878
+ }
879
+ },
880
+ "additionalProperties": { "$ref": "#/$defs/jsonLiteral" }
881
+ }
882
+ ]
883
+ },
884
+ "jsonValue": {
885
+ "oneOf": [
886
+ { "$ref": "#/$defs/jsonScalar" },
887
+ {
888
+ "type": "array",
889
+ "items": { "$ref": "#/$defs/jsonValue" }
890
+ },
891
+ {
892
+ "type": "object",
893
+ "additionalProperties": { "$ref": "#/$defs/jsonValue" }
894
+ }
895
+ ]
896
+ },
897
+ "jsonScalar": { "type": ["string", "number", "boolean", "null"] },
898
+ "choiceValue": { "type": ["string", "boolean"] },
899
+ "name": { "$ref": "#/$defs/stateKey" },
900
+ "stateKey": {
901
+ "type": "string",
902
+ "pattern": "^[a-z][a-z0-9_]*$"
903
+ },
904
+ "fieldName": {
905
+ "type": "string",
906
+ "pattern": "^[A-Za-z][A-Za-z0-9_]*$"
907
+ },
908
+ "objectAccessPath": {
909
+ "type": "string",
910
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*(?:\\.[A-Za-z_][A-Za-z0-9_]*)*$"
911
+ },
912
+ "arrayAccessPath": {
913
+ "type": "string",
914
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*(?:\\.(?:[A-Za-z_][A-Za-z0-9_]*|0|[1-9][0-9]*))*$"
915
+ },
916
+ "jsonPointer": {
917
+ "type": "string",
918
+ "pattern": "^(?:/(?:[^~/]|~[01])*)+$"
919
+ },
920
+ "persistence": { "enum": ["data", "internal"] },
921
+ "exhaustion": { "enum": ["reask", "skip", "default", "handoff", "END"] }
922
+ }
923
+ }