@oxy-hq/cli 0.1.0

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 (39) hide show
  1. package/README.md +163 -0
  2. package/dist/main.mjs +6688 -0
  3. package/dist/main.mjs.map +1 -0
  4. package/dist/mcp-VdontkUr.mjs +316 -0
  5. package/dist/mcp-VdontkUr.mjs.map +1 -0
  6. package/json-schemas/agent-test.json +104 -0
  7. package/json-schemas/agentic.json +406 -0
  8. package/json-schemas/app.json +1884 -0
  9. package/json-schemas/config.json +2215 -0
  10. package/json-schemas/flow-test.json +124 -0
  11. package/json-schemas/global-semantics.json +782 -0
  12. package/json-schemas/workflow.json +1907 -0
  13. package/package.json +65 -0
  14. package/skills/oxy-airway-pipelines/SKILL.md +338 -0
  15. package/skills/oxy-automations/SKILL.md +67 -0
  16. package/skills/oxy-cli/SKILL.md +134 -0
  17. package/skills/oxy-custom-apps/SKILL.md +330 -0
  18. package/skills/oxy-data-architecture/SKILL.md +225 -0
  19. package/skills/oxy-semantic-modeling/SKILL.md +216 -0
  20. package/template/.gitattributes +2 -0
  21. package/template/.github/scripts/ci-publish.sh +77 -0
  22. package/template/.github/scripts/discover-apps.sh +175 -0
  23. package/template/.github/scripts/publish-env.sh +55 -0
  24. package/template/.github/workflows/publish.yaml +653 -0
  25. package/template/.github/workflows/validate.yaml +264 -0
  26. package/template/.nvmrc +1 -0
  27. package/template/.oxyc-managed +297 -0
  28. package/template/README.md +414 -0
  29. package/template/_gitignore +32 -0
  30. package/template/apps/.gitkeep +0 -0
  31. package/template/config.yml +53 -0
  32. package/template/memory/.gitkeep +0 -0
  33. package/template/package.json +17 -0
  34. package/template/pipelines/.gitkeep +0 -0
  35. package/template/pnpm-workspace.yaml +32 -0
  36. package/template/scripts/dev.sh +443 -0
  37. package/template/semantics/topics/.gitkeep +0 -0
  38. package/template/semantics/views/.gitkeep +0 -0
  39. package/template/workflows/.gitkeep +0 -0
@@ -0,0 +1,1907 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "Automation",
4
+ "type": "object",
5
+ "required": [
6
+ "tasks"
7
+ ],
8
+ "properties": {
9
+ "consistency_prompt": {
10
+ "description": "Global consistency evaluation prompt for all agent tasks in this automation. This can be overridden per-task via AgentTask.consistency_prompt",
11
+ "type": [
12
+ "string",
13
+ "null"
14
+ ]
15
+ },
16
+ "description": {
17
+ "default": "",
18
+ "type": "string"
19
+ },
20
+ "retrieval": {
21
+ "default": null,
22
+ "anyOf": [
23
+ {
24
+ "$ref": "#/definitions/RouteRetrievalConfig"
25
+ },
26
+ {
27
+ "type": "null"
28
+ }
29
+ ]
30
+ },
31
+ "tasks": {
32
+ "type": "array",
33
+ "items": {
34
+ "$ref": "#/definitions/Task"
35
+ }
36
+ },
37
+ "variables": {
38
+ "type": "object",
39
+ "additionalProperties": {
40
+ "$ref": "#/definitions/SchemaObject"
41
+ }
42
+ }
43
+ },
44
+ "definitions": {
45
+ "AppTaskMode": {
46
+ "description": "Where a task is executed when used inside an app with interactive controls. `client` (default) — the frontend re-runs the SQL directly in DuckDB WASM on every control change; no server round-trip required. `server` — the server executes the task on every control change (required for tasks that query external databases like Snowflake or BigQuery).",
47
+ "type": "string",
48
+ "enum": [
49
+ "client",
50
+ "server"
51
+ ]
52
+ },
53
+ "Condition": {
54
+ "type": "object",
55
+ "required": [
56
+ "if",
57
+ "tasks"
58
+ ],
59
+ "properties": {
60
+ "if": {
61
+ "type": "string"
62
+ },
63
+ "tasks": {
64
+ "type": "array",
65
+ "items": {
66
+ "$ref": "#/definitions/Task"
67
+ }
68
+ }
69
+ }
70
+ },
71
+ "ExportFormat": {
72
+ "type": "string",
73
+ "enum": [
74
+ "sql",
75
+ "csv",
76
+ "json",
77
+ "txt",
78
+ "docx"
79
+ ]
80
+ },
81
+ "InstanceType": {
82
+ "description": "The possible types of values in JSON Schema documents.\n\nSee [JSON Schema 4.2.1. Instance Data Model](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-4.2.1).",
83
+ "type": "string",
84
+ "enum": [
85
+ "null",
86
+ "boolean",
87
+ "object",
88
+ "array",
89
+ "number",
90
+ "string",
91
+ "integer"
92
+ ]
93
+ },
94
+ "LookerSortField": {
95
+ "description": "A sort field for a Looker query with explicit field name and direction.",
96
+ "type": "object",
97
+ "required": [
98
+ "field"
99
+ ],
100
+ "properties": {
101
+ "direction": {
102
+ "default": "asc",
103
+ "type": "string"
104
+ },
105
+ "field": {
106
+ "type": "string"
107
+ }
108
+ }
109
+ },
110
+ "LoopValues": {
111
+ "anyOf": [
112
+ {
113
+ "type": "string"
114
+ },
115
+ {
116
+ "type": "array",
117
+ "items": true
118
+ }
119
+ ]
120
+ },
121
+ "OrderType": {
122
+ "type": "string",
123
+ "enum": [
124
+ "asc",
125
+ "desc"
126
+ ]
127
+ },
128
+ "PersistToSecret": {
129
+ "description": "Persist a field of an `http_request` JSON response back into a project secret.\n\nThis is the rotating-OAuth-token path: the QuickBooks token-refresh response returns a new `refresh_token`, which we write back to the secret store so the next run starts from the latest value (mirrors the Airway Intuit source).",
130
+ "type": "object",
131
+ "required": [
132
+ "from",
133
+ "name"
134
+ ],
135
+ "properties": {
136
+ "from": {
137
+ "description": "JSON pointer into the parsed response body, e.g. `/refresh_token`.",
138
+ "type": "string"
139
+ },
140
+ "name": {
141
+ "description": "Project secret name to upsert with the extracted value.",
142
+ "type": "string"
143
+ }
144
+ }
145
+ },
146
+ "RouteRetrievalConfig": {
147
+ "type": "object",
148
+ "properties": {
149
+ "exclude": {
150
+ "description": "List of prompts that exclude this document / route for retrieval",
151
+ "default": [],
152
+ "type": "array",
153
+ "items": {
154
+ "type": "string"
155
+ }
156
+ },
157
+ "include": {
158
+ "description": "List of prompts that include this document / route for retrieval",
159
+ "default": [],
160
+ "type": "array",
161
+ "items": {
162
+ "type": "string"
163
+ }
164
+ }
165
+ }
166
+ },
167
+ "Schema": {
168
+ "description": "A JSON Schema.",
169
+ "anyOf": [
170
+ {
171
+ "description": "A trivial boolean JSON Schema.\n\nThe schema `true` matches everything (always passes validation), whereas the schema `false` matches nothing (always fails validation).",
172
+ "type": "boolean"
173
+ },
174
+ {
175
+ "description": "A JSON Schema object.",
176
+ "allOf": [
177
+ {
178
+ "$ref": "#/definitions/SchemaObject"
179
+ }
180
+ ]
181
+ }
182
+ ]
183
+ },
184
+ "SchemaObject": {
185
+ "description": "A JSON Schema object.",
186
+ "type": "object",
187
+ "properties": {
188
+ "$id": {
189
+ "description": "The `$id` keyword.\n\nSee [JSON Schema 8.2.2. The \"$id\" Keyword](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-8.2.2).",
190
+ "type": [
191
+ "string",
192
+ "null"
193
+ ]
194
+ },
195
+ "$ref": {
196
+ "description": "The `$ref` keyword.\n\nSee [JSON Schema 8.2.4.1. Direct References with \"$ref\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-8.2.4.1).",
197
+ "type": [
198
+ "string",
199
+ "null"
200
+ ]
201
+ },
202
+ "additionalItems": {
203
+ "description": "The `additionalItems` keyword.\n\nSee [JSON Schema 9.3.1.2. \"additionalItems\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.1.2).",
204
+ "anyOf": [
205
+ {
206
+ "$ref": "#/definitions/Schema"
207
+ },
208
+ {
209
+ "type": "null"
210
+ }
211
+ ]
212
+ },
213
+ "additionalProperties": {
214
+ "description": "The `additionalProperties` keyword.\n\nSee [JSON Schema 9.3.2.3. \"additionalProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.3).",
215
+ "anyOf": [
216
+ {
217
+ "$ref": "#/definitions/Schema"
218
+ },
219
+ {
220
+ "type": "null"
221
+ }
222
+ ]
223
+ },
224
+ "allOf": {
225
+ "description": "The `allOf` keyword.\n\nSee [JSON Schema 9.2.1.1. \"allOf\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.1.1).",
226
+ "type": [
227
+ "array",
228
+ "null"
229
+ ],
230
+ "items": {
231
+ "$ref": "#/definitions/Schema"
232
+ }
233
+ },
234
+ "anyOf": {
235
+ "description": "The `anyOf` keyword.\n\nSee [JSON Schema 9.2.1.2. \"anyOf\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.1.2).",
236
+ "type": [
237
+ "array",
238
+ "null"
239
+ ],
240
+ "items": {
241
+ "$ref": "#/definitions/Schema"
242
+ }
243
+ },
244
+ "const": {
245
+ "description": "The `const` keyword.\n\nSee [JSON Schema Validation 6.1.3. \"const\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.1.3)"
246
+ },
247
+ "contains": {
248
+ "description": "The `contains` keyword.\n\nSee [JSON Schema 9.3.1.4. \"contains\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.1.4).",
249
+ "anyOf": [
250
+ {
251
+ "$ref": "#/definitions/Schema"
252
+ },
253
+ {
254
+ "type": "null"
255
+ }
256
+ ]
257
+ },
258
+ "default": {
259
+ "description": "The `default` keyword.\n\nSee [JSON Schema Validation 9.2. \"default\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.2)."
260
+ },
261
+ "deprecated": {
262
+ "description": "The `deprecated` keyword.\n\nSee [JSON Schema Validation 9.3. \"deprecated\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.3).",
263
+ "type": "boolean"
264
+ },
265
+ "description": {
266
+ "description": "The `description` keyword.\n\nSee [JSON Schema Validation 9.1. \"title\" and \"description\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.1).",
267
+ "type": [
268
+ "string",
269
+ "null"
270
+ ]
271
+ },
272
+ "else": {
273
+ "description": "The `else` keyword.\n\nSee [JSON Schema 9.2.2.3. \"else\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.2.3).",
274
+ "anyOf": [
275
+ {
276
+ "$ref": "#/definitions/Schema"
277
+ },
278
+ {
279
+ "type": "null"
280
+ }
281
+ ]
282
+ },
283
+ "enum": {
284
+ "description": "The `enum` keyword.\n\nSee [JSON Schema Validation 6.1.2. \"enum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.1.2)",
285
+ "type": [
286
+ "array",
287
+ "null"
288
+ ],
289
+ "items": true
290
+ },
291
+ "examples": {
292
+ "description": "The `examples` keyword.\n\nSee [JSON Schema Validation 9.5. \"examples\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.5).",
293
+ "type": "array",
294
+ "items": true
295
+ },
296
+ "exclusiveMaximum": {
297
+ "description": "The `exclusiveMaximum` keyword.\n\nSee [JSON Schema Validation 6.2.3. \"exclusiveMaximum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.3).",
298
+ "type": [
299
+ "number",
300
+ "null"
301
+ ],
302
+ "format": "double"
303
+ },
304
+ "exclusiveMinimum": {
305
+ "description": "The `exclusiveMinimum` keyword.\n\nSee [JSON Schema Validation 6.2.5. \"exclusiveMinimum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.5).",
306
+ "type": [
307
+ "number",
308
+ "null"
309
+ ],
310
+ "format": "double"
311
+ },
312
+ "format": {
313
+ "description": "The `format` keyword.\n\nSee [JSON Schema Validation 7. A Vocabulary for Semantic Content With \"format\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-7).",
314
+ "type": [
315
+ "string",
316
+ "null"
317
+ ]
318
+ },
319
+ "if": {
320
+ "description": "The `if` keyword.\n\nSee [JSON Schema 9.2.2.1. \"if\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.2.1).",
321
+ "anyOf": [
322
+ {
323
+ "$ref": "#/definitions/Schema"
324
+ },
325
+ {
326
+ "type": "null"
327
+ }
328
+ ]
329
+ },
330
+ "items": {
331
+ "description": "The `items` keyword.\n\nSee [JSON Schema 9.3.1.1. \"items\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.1.1).",
332
+ "anyOf": [
333
+ {
334
+ "$ref": "#/definitions/SingleOrVec_for_Schema"
335
+ },
336
+ {
337
+ "type": "null"
338
+ }
339
+ ]
340
+ },
341
+ "maxItems": {
342
+ "description": "The `maxItems` keyword.\n\nSee [JSON Schema Validation 6.4.1. \"maxItems\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.4.1).",
343
+ "type": [
344
+ "integer",
345
+ "null"
346
+ ],
347
+ "format": "uint32",
348
+ "minimum": 0.0
349
+ },
350
+ "maxLength": {
351
+ "description": "The `maxLength` keyword.\n\nSee [JSON Schema Validation 6.3.1. \"maxLength\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.3.1).",
352
+ "type": [
353
+ "integer",
354
+ "null"
355
+ ],
356
+ "format": "uint32",
357
+ "minimum": 0.0
358
+ },
359
+ "maxProperties": {
360
+ "description": "The `maxProperties` keyword.\n\nSee [JSON Schema Validation 6.5.1. \"maxProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.5.1).",
361
+ "type": [
362
+ "integer",
363
+ "null"
364
+ ],
365
+ "format": "uint32",
366
+ "minimum": 0.0
367
+ },
368
+ "maximum": {
369
+ "description": "The `maximum` keyword.\n\nSee [JSON Schema Validation 6.2.2. \"maximum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.2).",
370
+ "type": [
371
+ "number",
372
+ "null"
373
+ ],
374
+ "format": "double"
375
+ },
376
+ "minItems": {
377
+ "description": "The `minItems` keyword.\n\nSee [JSON Schema Validation 6.4.2. \"minItems\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.4.2).",
378
+ "type": [
379
+ "integer",
380
+ "null"
381
+ ],
382
+ "format": "uint32",
383
+ "minimum": 0.0
384
+ },
385
+ "minLength": {
386
+ "description": "The `minLength` keyword.\n\nSee [JSON Schema Validation 6.3.2. \"minLength\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.3.2).",
387
+ "type": [
388
+ "integer",
389
+ "null"
390
+ ],
391
+ "format": "uint32",
392
+ "minimum": 0.0
393
+ },
394
+ "minProperties": {
395
+ "description": "The `minProperties` keyword.\n\nSee [JSON Schema Validation 6.5.2. \"minProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.5.2).",
396
+ "type": [
397
+ "integer",
398
+ "null"
399
+ ],
400
+ "format": "uint32",
401
+ "minimum": 0.0
402
+ },
403
+ "minimum": {
404
+ "description": "The `minimum` keyword.\n\nSee [JSON Schema Validation 6.2.4. \"minimum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.4).",
405
+ "type": [
406
+ "number",
407
+ "null"
408
+ ],
409
+ "format": "double"
410
+ },
411
+ "multipleOf": {
412
+ "description": "The `multipleOf` keyword.\n\nSee [JSON Schema Validation 6.2.1. \"multipleOf\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.1).",
413
+ "type": [
414
+ "number",
415
+ "null"
416
+ ],
417
+ "format": "double"
418
+ },
419
+ "not": {
420
+ "description": "The `not` keyword.\n\nSee [JSON Schema 9.2.1.4. \"not\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.1.4).",
421
+ "anyOf": [
422
+ {
423
+ "$ref": "#/definitions/Schema"
424
+ },
425
+ {
426
+ "type": "null"
427
+ }
428
+ ]
429
+ },
430
+ "oneOf": {
431
+ "description": "The `oneOf` keyword.\n\nSee [JSON Schema 9.2.1.3. \"oneOf\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.1.3).",
432
+ "type": [
433
+ "array",
434
+ "null"
435
+ ],
436
+ "items": {
437
+ "$ref": "#/definitions/Schema"
438
+ }
439
+ },
440
+ "pattern": {
441
+ "description": "The `pattern` keyword.\n\nSee [JSON Schema Validation 6.3.3. \"pattern\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.3.3).",
442
+ "type": [
443
+ "string",
444
+ "null"
445
+ ]
446
+ },
447
+ "patternProperties": {
448
+ "description": "The `patternProperties` keyword.\n\nSee [JSON Schema 9.3.2.2. \"patternProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.2).",
449
+ "type": "object",
450
+ "additionalProperties": {
451
+ "$ref": "#/definitions/Schema"
452
+ }
453
+ },
454
+ "properties": {
455
+ "description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).",
456
+ "type": "object",
457
+ "additionalProperties": {
458
+ "$ref": "#/definitions/Schema"
459
+ }
460
+ },
461
+ "propertyNames": {
462
+ "description": "The `propertyNames` keyword.\n\nSee [JSON Schema 9.3.2.5. \"propertyNames\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.5).",
463
+ "anyOf": [
464
+ {
465
+ "$ref": "#/definitions/Schema"
466
+ },
467
+ {
468
+ "type": "null"
469
+ }
470
+ ]
471
+ },
472
+ "readOnly": {
473
+ "description": "The `readOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).",
474
+ "type": "boolean"
475
+ },
476
+ "required": {
477
+ "description": "The `required` keyword.\n\nSee [JSON Schema Validation 6.5.3. \"required\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.5.3).",
478
+ "type": "array",
479
+ "items": {
480
+ "type": "string"
481
+ },
482
+ "uniqueItems": true
483
+ },
484
+ "then": {
485
+ "description": "The `then` keyword.\n\nSee [JSON Schema 9.2.2.2. \"then\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.2.2).",
486
+ "anyOf": [
487
+ {
488
+ "$ref": "#/definitions/Schema"
489
+ },
490
+ {
491
+ "type": "null"
492
+ }
493
+ ]
494
+ },
495
+ "title": {
496
+ "description": "The `title` keyword.\n\nSee [JSON Schema Validation 9.1. \"title\" and \"description\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.1).",
497
+ "type": [
498
+ "string",
499
+ "null"
500
+ ]
501
+ },
502
+ "type": {
503
+ "description": "The `type` keyword.\n\nSee [JSON Schema Validation 6.1.1. \"type\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.1.1) and [JSON Schema 4.2.1. Instance Data Model](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-4.2.1).",
504
+ "anyOf": [
505
+ {
506
+ "$ref": "#/definitions/SingleOrVec_for_InstanceType"
507
+ },
508
+ {
509
+ "type": "null"
510
+ }
511
+ ]
512
+ },
513
+ "uniqueItems": {
514
+ "description": "The `uniqueItems` keyword.\n\nSee [JSON Schema Validation 6.4.3. \"uniqueItems\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.4.3).",
515
+ "type": [
516
+ "boolean",
517
+ "null"
518
+ ]
519
+ },
520
+ "writeOnly": {
521
+ "description": "The `writeOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).",
522
+ "type": "boolean"
523
+ }
524
+ },
525
+ "additionalProperties": true
526
+ },
527
+ "SemanticFilter": {
528
+ "anyOf": [
529
+ {
530
+ "type": "object",
531
+ "required": [
532
+ "field",
533
+ "op",
534
+ "value"
535
+ ],
536
+ "properties": {
537
+ "field": {
538
+ "description": "The measure/dimension to apply the filter on. Must by full name: <view_name>.<field_name>",
539
+ "type": "string"
540
+ },
541
+ "op": {
542
+ "type": "string",
543
+ "enum": [
544
+ "eq"
545
+ ]
546
+ },
547
+ "value": {
548
+ "description": "The value to compare. Can be a string, number, boolean, or null.",
549
+ "type": [
550
+ "string",
551
+ "number",
552
+ "boolean",
553
+ "null"
554
+ ]
555
+ }
556
+ }
557
+ },
558
+ {
559
+ "type": "object",
560
+ "required": [
561
+ "field",
562
+ "op",
563
+ "value"
564
+ ],
565
+ "properties": {
566
+ "field": {
567
+ "description": "The measure/dimension to apply the filter on. Must by full name: <view_name>.<field_name>",
568
+ "type": "string"
569
+ },
570
+ "op": {
571
+ "type": "string",
572
+ "enum": [
573
+ "neq"
574
+ ]
575
+ },
576
+ "value": {
577
+ "description": "The value to compare. Can be a string, number, boolean, or null.",
578
+ "type": [
579
+ "string",
580
+ "number",
581
+ "boolean",
582
+ "null"
583
+ ]
584
+ }
585
+ }
586
+ },
587
+ {
588
+ "type": "object",
589
+ "required": [
590
+ "field",
591
+ "op",
592
+ "value"
593
+ ],
594
+ "properties": {
595
+ "field": {
596
+ "description": "The measure/dimension to apply the filter on. Must by full name: <view_name>.<field_name>",
597
+ "type": "string"
598
+ },
599
+ "op": {
600
+ "type": "string",
601
+ "enum": [
602
+ "gt"
603
+ ]
604
+ },
605
+ "value": {
606
+ "description": "The value to compare. Can be a string, number, boolean, or null.",
607
+ "type": [
608
+ "string",
609
+ "number",
610
+ "boolean",
611
+ "null"
612
+ ]
613
+ }
614
+ }
615
+ },
616
+ {
617
+ "type": "object",
618
+ "required": [
619
+ "field",
620
+ "op",
621
+ "value"
622
+ ],
623
+ "properties": {
624
+ "field": {
625
+ "description": "The measure/dimension to apply the filter on. Must by full name: <view_name>.<field_name>",
626
+ "type": "string"
627
+ },
628
+ "op": {
629
+ "type": "string",
630
+ "enum": [
631
+ "gte"
632
+ ]
633
+ },
634
+ "value": {
635
+ "description": "The value to compare. Can be a string, number, boolean, or null.",
636
+ "type": [
637
+ "string",
638
+ "number",
639
+ "boolean",
640
+ "null"
641
+ ]
642
+ }
643
+ }
644
+ },
645
+ {
646
+ "type": "object",
647
+ "required": [
648
+ "field",
649
+ "op",
650
+ "value"
651
+ ],
652
+ "properties": {
653
+ "field": {
654
+ "description": "The measure/dimension to apply the filter on. Must by full name: <view_name>.<field_name>",
655
+ "type": "string"
656
+ },
657
+ "op": {
658
+ "type": "string",
659
+ "enum": [
660
+ "lt"
661
+ ]
662
+ },
663
+ "value": {
664
+ "description": "The value to compare. Can be a string, number, boolean, or null.",
665
+ "type": [
666
+ "string",
667
+ "number",
668
+ "boolean",
669
+ "null"
670
+ ]
671
+ }
672
+ }
673
+ },
674
+ {
675
+ "type": "object",
676
+ "required": [
677
+ "field",
678
+ "op",
679
+ "value"
680
+ ],
681
+ "properties": {
682
+ "field": {
683
+ "description": "The measure/dimension to apply the filter on. Must by full name: <view_name>.<field_name>",
684
+ "type": "string"
685
+ },
686
+ "op": {
687
+ "type": "string",
688
+ "enum": [
689
+ "lte"
690
+ ]
691
+ },
692
+ "value": {
693
+ "description": "The value to compare. Can be a string, number, boolean, or null.",
694
+ "type": [
695
+ "string",
696
+ "number",
697
+ "boolean",
698
+ "null"
699
+ ]
700
+ }
701
+ }
702
+ },
703
+ {
704
+ "type": "object",
705
+ "required": [
706
+ "field",
707
+ "op",
708
+ "values"
709
+ ],
710
+ "properties": {
711
+ "field": {
712
+ "description": "The measure/dimension to apply the filter on. Must by full name: <view_name>.<field_name>",
713
+ "type": "string"
714
+ },
715
+ "op": {
716
+ "type": "string",
717
+ "enum": [
718
+ "in"
719
+ ]
720
+ },
721
+ "values": {
722
+ "description": "Array of values to filter by. Each value can be a string, number, boolean, or null.",
723
+ "type": [
724
+ "array"
725
+ ],
726
+ "items": {
727
+ "type": [
728
+ "string",
729
+ "number",
730
+ "boolean",
731
+ "null"
732
+ ]
733
+ }
734
+ }
735
+ }
736
+ },
737
+ {
738
+ "type": "object",
739
+ "required": [
740
+ "field",
741
+ "op",
742
+ "values"
743
+ ],
744
+ "properties": {
745
+ "field": {
746
+ "description": "The measure/dimension to apply the filter on. Must by full name: <view_name>.<field_name>",
747
+ "type": "string"
748
+ },
749
+ "op": {
750
+ "type": "string",
751
+ "enum": [
752
+ "not_in"
753
+ ]
754
+ },
755
+ "values": {
756
+ "description": "Array of values to filter by. Each value can be a string, number, boolean, or null.",
757
+ "type": [
758
+ "array"
759
+ ],
760
+ "items": {
761
+ "type": [
762
+ "string",
763
+ "number",
764
+ "boolean",
765
+ "null"
766
+ ]
767
+ }
768
+ }
769
+ }
770
+ },
771
+ {
772
+ "type": "object",
773
+ "required": [
774
+ "field",
775
+ "from",
776
+ "op",
777
+ "to"
778
+ ],
779
+ "properties": {
780
+ "field": {
781
+ "description": "The measure/dimension to apply the filter on. Must by full name: <view_name>.<field_name>",
782
+ "type": "string"
783
+ },
784
+ "from": {
785
+ "description": "Start of the date range. Can be a string (ISO date or relative like 'today', '7 days ago'), number (timestamp).",
786
+ "type": [
787
+ "string",
788
+ "number",
789
+ "boolean",
790
+ "null"
791
+ ]
792
+ },
793
+ "op": {
794
+ "type": "string",
795
+ "enum": [
796
+ "in_date_range"
797
+ ]
798
+ },
799
+ "to": {
800
+ "description": "End of the date range. Can be a string (ISO date or relative like 'today', '7 days ago'), number (timestamp).",
801
+ "type": [
802
+ "string",
803
+ "number",
804
+ "boolean",
805
+ "null"
806
+ ]
807
+ }
808
+ }
809
+ },
810
+ {
811
+ "type": "object",
812
+ "required": [
813
+ "field",
814
+ "from",
815
+ "op",
816
+ "to"
817
+ ],
818
+ "properties": {
819
+ "field": {
820
+ "description": "The measure/dimension to apply the filter on. Must by full name: <view_name>.<field_name>",
821
+ "type": "string"
822
+ },
823
+ "from": {
824
+ "description": "Start of the date range. Can be a string (ISO date or relative like 'today', '7 days ago'), number (timestamp).",
825
+ "type": [
826
+ "string",
827
+ "number",
828
+ "boolean",
829
+ "null"
830
+ ]
831
+ },
832
+ "op": {
833
+ "type": "string",
834
+ "enum": [
835
+ "not_in_date_range"
836
+ ]
837
+ },
838
+ "to": {
839
+ "description": "End of the date range. Can be a string (ISO date or relative like 'today', '7 days ago'), number (timestamp).",
840
+ "type": [
841
+ "string",
842
+ "number",
843
+ "boolean",
844
+ "null"
845
+ ]
846
+ }
847
+ }
848
+ }
849
+ ]
850
+ },
851
+ "SemanticFilterType": {
852
+ "description": "Enum representing different filter types with their appropriate value types",
853
+ "oneOf": [
854
+ {
855
+ "description": "Scalar comparison filter (eq, neq, gt, gte, lt, lte)",
856
+ "type": "object",
857
+ "required": [
858
+ "op",
859
+ "value"
860
+ ],
861
+ "properties": {
862
+ "op": {
863
+ "type": "string",
864
+ "enum": [
865
+ "eq"
866
+ ]
867
+ },
868
+ "value": {
869
+ "description": "The value to compare. Can be a string, number, boolean, or null.",
870
+ "type": [
871
+ "string",
872
+ "number",
873
+ "boolean",
874
+ "null"
875
+ ]
876
+ }
877
+ }
878
+ },
879
+ {
880
+ "description": "Scalar comparison filter (eq, neq, gt, gte, lt, lte)",
881
+ "type": "object",
882
+ "required": [
883
+ "op",
884
+ "value"
885
+ ],
886
+ "properties": {
887
+ "op": {
888
+ "type": "string",
889
+ "enum": [
890
+ "neq"
891
+ ]
892
+ },
893
+ "value": {
894
+ "description": "The value to compare. Can be a string, number, boolean, or null.",
895
+ "type": [
896
+ "string",
897
+ "number",
898
+ "boolean",
899
+ "null"
900
+ ]
901
+ }
902
+ }
903
+ },
904
+ {
905
+ "description": "Scalar comparison filter (eq, neq, gt, gte, lt, lte)",
906
+ "type": "object",
907
+ "required": [
908
+ "op",
909
+ "value"
910
+ ],
911
+ "properties": {
912
+ "op": {
913
+ "type": "string",
914
+ "enum": [
915
+ "gt"
916
+ ]
917
+ },
918
+ "value": {
919
+ "description": "The value to compare. Can be a string, number, boolean, or null.",
920
+ "type": [
921
+ "string",
922
+ "number",
923
+ "boolean",
924
+ "null"
925
+ ]
926
+ }
927
+ }
928
+ },
929
+ {
930
+ "description": "Scalar comparison filter (eq, neq, gt, gte, lt, lte)",
931
+ "type": "object",
932
+ "required": [
933
+ "op",
934
+ "value"
935
+ ],
936
+ "properties": {
937
+ "op": {
938
+ "type": "string",
939
+ "enum": [
940
+ "gte"
941
+ ]
942
+ },
943
+ "value": {
944
+ "description": "The value to compare. Can be a string, number, boolean, or null.",
945
+ "type": [
946
+ "string",
947
+ "number",
948
+ "boolean",
949
+ "null"
950
+ ]
951
+ }
952
+ }
953
+ },
954
+ {
955
+ "description": "Scalar comparison filter (eq, neq, gt, gte, lt, lte)",
956
+ "type": "object",
957
+ "required": [
958
+ "op",
959
+ "value"
960
+ ],
961
+ "properties": {
962
+ "op": {
963
+ "type": "string",
964
+ "enum": [
965
+ "lt"
966
+ ]
967
+ },
968
+ "value": {
969
+ "description": "The value to compare. Can be a string, number, boolean, or null.",
970
+ "type": [
971
+ "string",
972
+ "number",
973
+ "boolean",
974
+ "null"
975
+ ]
976
+ }
977
+ }
978
+ },
979
+ {
980
+ "description": "Scalar comparison filter (eq, neq, gt, gte, lt, lte)",
981
+ "type": "object",
982
+ "required": [
983
+ "op",
984
+ "value"
985
+ ],
986
+ "properties": {
987
+ "op": {
988
+ "type": "string",
989
+ "enum": [
990
+ "lte"
991
+ ]
992
+ },
993
+ "value": {
994
+ "description": "The value to compare. Can be a string, number, boolean, or null.",
995
+ "type": [
996
+ "string",
997
+ "number",
998
+ "boolean",
999
+ "null"
1000
+ ]
1001
+ }
1002
+ }
1003
+ },
1004
+ {
1005
+ "description": "Array-based filter (in, not_in)",
1006
+ "type": "object",
1007
+ "required": [
1008
+ "op",
1009
+ "values"
1010
+ ],
1011
+ "properties": {
1012
+ "op": {
1013
+ "type": "string",
1014
+ "enum": [
1015
+ "in"
1016
+ ]
1017
+ },
1018
+ "values": {
1019
+ "description": "Array of values to filter by. Each value can be a string, number, boolean, or null.",
1020
+ "type": [
1021
+ "array"
1022
+ ],
1023
+ "items": {
1024
+ "type": [
1025
+ "string",
1026
+ "number",
1027
+ "boolean",
1028
+ "null"
1029
+ ]
1030
+ }
1031
+ }
1032
+ }
1033
+ },
1034
+ {
1035
+ "description": "Array-based filter (in, not_in)",
1036
+ "type": "object",
1037
+ "required": [
1038
+ "op",
1039
+ "values"
1040
+ ],
1041
+ "properties": {
1042
+ "op": {
1043
+ "type": "string",
1044
+ "enum": [
1045
+ "not_in"
1046
+ ]
1047
+ },
1048
+ "values": {
1049
+ "description": "Array of values to filter by. Each value can be a string, number, boolean, or null.",
1050
+ "type": [
1051
+ "array"
1052
+ ],
1053
+ "items": {
1054
+ "type": [
1055
+ "string",
1056
+ "number",
1057
+ "boolean",
1058
+ "null"
1059
+ ]
1060
+ }
1061
+ }
1062
+ }
1063
+ },
1064
+ {
1065
+ "description": "Date range filter (in_date_range, not_in_date_range)",
1066
+ "type": "object",
1067
+ "required": [
1068
+ "from",
1069
+ "op",
1070
+ "to"
1071
+ ],
1072
+ "properties": {
1073
+ "from": {
1074
+ "description": "Start of the date range. Can be a string (ISO date or relative like 'today', '7 days ago'), number (timestamp).",
1075
+ "type": [
1076
+ "string",
1077
+ "number",
1078
+ "boolean",
1079
+ "null"
1080
+ ]
1081
+ },
1082
+ "op": {
1083
+ "type": "string",
1084
+ "enum": [
1085
+ "in_date_range"
1086
+ ]
1087
+ },
1088
+ "to": {
1089
+ "description": "End of the date range. Can be a string (ISO date or relative like 'today', '7 days ago'), number (timestamp).",
1090
+ "type": [
1091
+ "string",
1092
+ "number",
1093
+ "boolean",
1094
+ "null"
1095
+ ]
1096
+ }
1097
+ }
1098
+ },
1099
+ {
1100
+ "description": "Date range filter (in_date_range, not_in_date_range)",
1101
+ "type": "object",
1102
+ "required": [
1103
+ "from",
1104
+ "op",
1105
+ "to"
1106
+ ],
1107
+ "properties": {
1108
+ "from": {
1109
+ "description": "Start of the date range. Can be a string (ISO date or relative like 'today', '7 days ago'), number (timestamp).",
1110
+ "type": [
1111
+ "string",
1112
+ "number",
1113
+ "boolean",
1114
+ "null"
1115
+ ]
1116
+ },
1117
+ "op": {
1118
+ "type": "string",
1119
+ "enum": [
1120
+ "not_in_date_range"
1121
+ ]
1122
+ },
1123
+ "to": {
1124
+ "description": "End of the date range. Can be a string (ISO date or relative like 'today', '7 days ago'), number (timestamp).",
1125
+ "type": [
1126
+ "string",
1127
+ "number",
1128
+ "boolean",
1129
+ "null"
1130
+ ]
1131
+ }
1132
+ }
1133
+ }
1134
+ ]
1135
+ },
1136
+ "SemanticQueryOrder": {
1137
+ "type": "object",
1138
+ "required": [
1139
+ "direction",
1140
+ "field"
1141
+ ],
1142
+ "properties": {
1143
+ "direction": {
1144
+ "type": "string"
1145
+ },
1146
+ "field": {
1147
+ "type": "string"
1148
+ }
1149
+ }
1150
+ },
1151
+ "SingleOrVec_for_InstanceType": {
1152
+ "description": "A type which can be serialized as a single item, or multiple items.\n\nIn some contexts, a `Single` may be semantically distinct from a `Vec` containing only item.",
1153
+ "anyOf": [
1154
+ {
1155
+ "$ref": "#/definitions/InstanceType"
1156
+ },
1157
+ {
1158
+ "type": "array",
1159
+ "items": {
1160
+ "$ref": "#/definitions/InstanceType"
1161
+ }
1162
+ }
1163
+ ]
1164
+ },
1165
+ "SingleOrVec_for_Schema": {
1166
+ "description": "A type which can be serialized as a single item, or multiple items.\n\nIn some contexts, a `Single` may be semantically distinct from a `Vec` containing only item.",
1167
+ "anyOf": [
1168
+ {
1169
+ "$ref": "#/definitions/Schema"
1170
+ },
1171
+ {
1172
+ "type": "array",
1173
+ "items": {
1174
+ "$ref": "#/definitions/Schema"
1175
+ }
1176
+ }
1177
+ ]
1178
+ },
1179
+ "Task": {
1180
+ "type": "object",
1181
+ "oneOf": [
1182
+ {
1183
+ "type": "object",
1184
+ "required": [
1185
+ "agent_ref",
1186
+ "prompt",
1187
+ "type"
1188
+ ],
1189
+ "properties": {
1190
+ "agent_ref": {
1191
+ "type": "string"
1192
+ },
1193
+ "consistency_prompt": {
1194
+ "description": "Custom consistency evaluation prompt for this specific task Overrides automation-level consistency_prompt if specified",
1195
+ "type": [
1196
+ "string",
1197
+ "null"
1198
+ ]
1199
+ },
1200
+ "consistency_run": {
1201
+ "default": 1,
1202
+ "type": "integer",
1203
+ "format": "uint",
1204
+ "minimum": 0.0
1205
+ },
1206
+ "export": {
1207
+ "anyOf": [
1208
+ {
1209
+ "$ref": "#/definitions/TaskExport"
1210
+ },
1211
+ {
1212
+ "type": "null"
1213
+ }
1214
+ ]
1215
+ },
1216
+ "prompt": {
1217
+ "type": "string"
1218
+ },
1219
+ "retry": {
1220
+ "default": 1,
1221
+ "type": "integer",
1222
+ "format": "uint",
1223
+ "minimum": 0.0
1224
+ },
1225
+ "type": {
1226
+ "type": "string",
1227
+ "enum": [
1228
+ "agent"
1229
+ ]
1230
+ },
1231
+ "variables": {
1232
+ "type": [
1233
+ "object",
1234
+ "null"
1235
+ ],
1236
+ "additionalProperties": true
1237
+ }
1238
+ }
1239
+ },
1240
+ {
1241
+ "type": "object",
1242
+ "anyOf": [
1243
+ {
1244
+ "type": "object",
1245
+ "required": [
1246
+ "sql_file"
1247
+ ],
1248
+ "properties": {
1249
+ "sql_file": {
1250
+ "type": "string"
1251
+ }
1252
+ }
1253
+ },
1254
+ {
1255
+ "type": "object",
1256
+ "required": [
1257
+ "sql_query"
1258
+ ],
1259
+ "properties": {
1260
+ "sql_query": {
1261
+ "type": "string"
1262
+ }
1263
+ }
1264
+ }
1265
+ ],
1266
+ "required": [
1267
+ "database",
1268
+ "type"
1269
+ ],
1270
+ "properties": {
1271
+ "database": {
1272
+ "type": "string"
1273
+ },
1274
+ "dry_run_limit": {
1275
+ "type": [
1276
+ "integer",
1277
+ "null"
1278
+ ],
1279
+ "format": "uint64",
1280
+ "minimum": 0.0
1281
+ },
1282
+ "export": {
1283
+ "anyOf": [
1284
+ {
1285
+ "$ref": "#/definitions/TaskExport"
1286
+ },
1287
+ {
1288
+ "type": "null"
1289
+ }
1290
+ ]
1291
+ },
1292
+ "type": {
1293
+ "type": "string",
1294
+ "enum": [
1295
+ "execute_sql"
1296
+ ]
1297
+ },
1298
+ "variables": {
1299
+ "default": null,
1300
+ "type": [
1301
+ "object",
1302
+ "null"
1303
+ ],
1304
+ "additionalProperties": {
1305
+ "type": "string"
1306
+ }
1307
+ }
1308
+ }
1309
+ },
1310
+ {
1311
+ "type": "object",
1312
+ "required": [
1313
+ "type"
1314
+ ],
1315
+ "properties": {
1316
+ "dimensions": {
1317
+ "description": "List of dimensions to include in the query. Format: <view_name>.<dimension_name>",
1318
+ "type": "array",
1319
+ "items": {
1320
+ "type": "string"
1321
+ }
1322
+ },
1323
+ "export": {
1324
+ "anyOf": [
1325
+ {
1326
+ "$ref": "#/definitions/TaskExport"
1327
+ },
1328
+ {
1329
+ "type": "null"
1330
+ }
1331
+ ]
1332
+ },
1333
+ "filters": {
1334
+ "type": "array",
1335
+ "items": {
1336
+ "$ref": "#/definitions/SemanticFilter"
1337
+ }
1338
+ },
1339
+ "limit": {
1340
+ "type": [
1341
+ "integer",
1342
+ "null"
1343
+ ],
1344
+ "format": "uint64",
1345
+ "minimum": 0.0
1346
+ },
1347
+ "measures": {
1348
+ "description": "List of measures to include in the query. Format: <view_name>.<measure_name>",
1349
+ "type": "array",
1350
+ "items": {
1351
+ "type": "string"
1352
+ }
1353
+ },
1354
+ "offset": {
1355
+ "type": [
1356
+ "integer",
1357
+ "null"
1358
+ ],
1359
+ "format": "uint64",
1360
+ "minimum": 0.0
1361
+ },
1362
+ "orders": {
1363
+ "type": "array",
1364
+ "items": {
1365
+ "$ref": "#/definitions/SemanticQueryOrder"
1366
+ }
1367
+ },
1368
+ "time_dimensions": {
1369
+ "description": "List of time dimensions with granularity and date range. Can only use with dimensions of type time or datetime. Format: <view_name>.<dimension_name>",
1370
+ "type": "array",
1371
+ "items": {
1372
+ "$ref": "#/definitions/TimeDimension"
1373
+ }
1374
+ },
1375
+ "topic": {
1376
+ "default": null,
1377
+ "type": [
1378
+ "string",
1379
+ "null"
1380
+ ]
1381
+ },
1382
+ "type": {
1383
+ "type": "string",
1384
+ "enum": [
1385
+ "semantic_query"
1386
+ ]
1387
+ },
1388
+ "variables": {
1389
+ "description": "Variables to resolve in semantic model expressions. Use {{variables.variable_name}} syntax in semantic definitions.",
1390
+ "type": [
1391
+ "object",
1392
+ "null"
1393
+ ],
1394
+ "additionalProperties": true
1395
+ }
1396
+ }
1397
+ },
1398
+ {
1399
+ "type": "object",
1400
+ "required": [
1401
+ "fields",
1402
+ "integration",
1403
+ "topic",
1404
+ "type"
1405
+ ],
1406
+ "properties": {
1407
+ "export": {
1408
+ "anyOf": [
1409
+ {
1410
+ "$ref": "#/definitions/TaskExport"
1411
+ },
1412
+ {
1413
+ "type": "null"
1414
+ }
1415
+ ]
1416
+ },
1417
+ "fields": {
1418
+ "description": "Fields to select. Field name must be full name format {view}.{field_name}. No aggregation or any other syntax.",
1419
+ "type": "array",
1420
+ "items": {
1421
+ "type": "string"
1422
+ }
1423
+ },
1424
+ "integration": {
1425
+ "type": "string"
1426
+ },
1427
+ "limit": {
1428
+ "description": "Maximum number of rows to return.",
1429
+ "type": [
1430
+ "integer",
1431
+ "null"
1432
+ ],
1433
+ "format": "uint64",
1434
+ "minimum": 0.0
1435
+ },
1436
+ "sorts": {
1437
+ "description": "Fields to sort by with direction (asc/desc).",
1438
+ "type": [
1439
+ "object",
1440
+ "null"
1441
+ ],
1442
+ "additionalProperties": {
1443
+ "$ref": "#/definitions/OrderType"
1444
+ }
1445
+ },
1446
+ "topic": {
1447
+ "type": "string"
1448
+ },
1449
+ "type": {
1450
+ "type": "string",
1451
+ "enum": [
1452
+ "omni_query"
1453
+ ]
1454
+ }
1455
+ }
1456
+ },
1457
+ {
1458
+ "description": "Task configuration for executing a Looker query within an automation.",
1459
+ "type": "object",
1460
+ "required": [
1461
+ "explore",
1462
+ "fields",
1463
+ "integration",
1464
+ "model",
1465
+ "type"
1466
+ ],
1467
+ "properties": {
1468
+ "explore": {
1469
+ "description": "The explore name within the model",
1470
+ "type": "string"
1471
+ },
1472
+ "export": {
1473
+ "description": "Optional export configuration for query results",
1474
+ "anyOf": [
1475
+ {
1476
+ "$ref": "#/definitions/TaskExport"
1477
+ },
1478
+ {
1479
+ "type": "null"
1480
+ }
1481
+ ]
1482
+ },
1483
+ "fields": {
1484
+ "description": "Fields to select. Field name must be full name format {view}.{field_name}.",
1485
+ "type": "array",
1486
+ "items": {
1487
+ "type": "string"
1488
+ }
1489
+ },
1490
+ "filter_expression": {
1491
+ "description": "Looker filter expression for complex conditions.",
1492
+ "type": [
1493
+ "string",
1494
+ "null"
1495
+ ]
1496
+ },
1497
+ "filters": {
1498
+ "description": "Filter conditions as field name to Looker filter expression mappings.",
1499
+ "type": [
1500
+ "object",
1501
+ "null"
1502
+ ],
1503
+ "additionalProperties": {
1504
+ "type": "string"
1505
+ }
1506
+ },
1507
+ "integration": {
1508
+ "description": "Name of the Looker integration to use",
1509
+ "type": "string"
1510
+ },
1511
+ "limit": {
1512
+ "description": "Maximum number of rows to return.",
1513
+ "type": [
1514
+ "integer",
1515
+ "null"
1516
+ ],
1517
+ "format": "int64"
1518
+ },
1519
+ "model": {
1520
+ "description": "The LookML model name",
1521
+ "type": "string"
1522
+ },
1523
+ "sorts": {
1524
+ "description": "Fields to sort by using Looker syntax: 'view.field asc' or 'view.field desc'.",
1525
+ "type": [
1526
+ "array",
1527
+ "null"
1528
+ ],
1529
+ "items": {
1530
+ "$ref": "#/definitions/LookerSortField"
1531
+ }
1532
+ },
1533
+ "type": {
1534
+ "type": "string",
1535
+ "enum": [
1536
+ "looker_query"
1537
+ ]
1538
+ }
1539
+ }
1540
+ },
1541
+ {
1542
+ "type": "object",
1543
+ "required": [
1544
+ "tasks",
1545
+ "type",
1546
+ "values"
1547
+ ],
1548
+ "properties": {
1549
+ "concurrency": {
1550
+ "default": 1,
1551
+ "type": "integer",
1552
+ "format": "uint",
1553
+ "minimum": 0.0
1554
+ },
1555
+ "tasks": {
1556
+ "type": "array",
1557
+ "items": {
1558
+ "$ref": "#/definitions/Task"
1559
+ }
1560
+ },
1561
+ "type": {
1562
+ "type": "string",
1563
+ "enum": [
1564
+ "loop_sequential"
1565
+ ]
1566
+ },
1567
+ "values": {
1568
+ "$ref": "#/definitions/LoopValues"
1569
+ }
1570
+ }
1571
+ },
1572
+ {
1573
+ "type": "object",
1574
+ "required": [
1575
+ "template",
1576
+ "type"
1577
+ ],
1578
+ "properties": {
1579
+ "export": {
1580
+ "anyOf": [
1581
+ {
1582
+ "$ref": "#/definitions/TaskExport"
1583
+ },
1584
+ {
1585
+ "type": "null"
1586
+ }
1587
+ ]
1588
+ },
1589
+ "template": {
1590
+ "type": "string"
1591
+ },
1592
+ "type": {
1593
+ "type": "string",
1594
+ "enum": [
1595
+ "formatter"
1596
+ ]
1597
+ }
1598
+ }
1599
+ },
1600
+ {
1601
+ "type": "object",
1602
+ "required": [
1603
+ "src",
1604
+ "type"
1605
+ ],
1606
+ "properties": {
1607
+ "export": {
1608
+ "anyOf": [
1609
+ {
1610
+ "$ref": "#/definitions/TaskExport"
1611
+ },
1612
+ {
1613
+ "type": "null"
1614
+ }
1615
+ ]
1616
+ },
1617
+ "src": {
1618
+ "type": "string"
1619
+ },
1620
+ "type": {
1621
+ "type": "string",
1622
+ "enum": [
1623
+ "workflow"
1624
+ ]
1625
+ },
1626
+ "variables": {
1627
+ "type": [
1628
+ "object",
1629
+ "null"
1630
+ ],
1631
+ "additionalProperties": true
1632
+ }
1633
+ }
1634
+ },
1635
+ {
1636
+ "type": "object",
1637
+ "required": [
1638
+ "conditions",
1639
+ "type"
1640
+ ],
1641
+ "properties": {
1642
+ "conditions": {
1643
+ "type": "array",
1644
+ "items": {
1645
+ "$ref": "#/definitions/Condition"
1646
+ }
1647
+ },
1648
+ "else": {
1649
+ "default": null,
1650
+ "type": [
1651
+ "array",
1652
+ "null"
1653
+ ],
1654
+ "items": {
1655
+ "$ref": "#/definitions/Task"
1656
+ }
1657
+ },
1658
+ "type": {
1659
+ "type": "string",
1660
+ "enum": [
1661
+ "conditional"
1662
+ ]
1663
+ }
1664
+ }
1665
+ },
1666
+ {
1667
+ "description": "`type: http_request` — make an outbound HTTP request from a workflow.\n\nThe reusable primitive behind the QuickBooks JE-posting automation (and the stop-gap for Oxy Functions' `ctx.fetch`). Templated fields render against the prior-step render context; `{{ secrets.NAME }}` resolves declared `secrets`. Egress is constrained (private/loopback/link-local hosts are always denied; `allow_hosts`, when set, is an additional allowlist).",
1668
+ "type": "object",
1669
+ "required": [
1670
+ "type",
1671
+ "url"
1672
+ ],
1673
+ "properties": {
1674
+ "allow_hosts": {
1675
+ "description": "Allowed target hostnames (in addition to the always-on private-IP deny). Empty means \"any public host\"; set it to lock a task to specific APIs.",
1676
+ "default": [],
1677
+ "type": "array",
1678
+ "items": {
1679
+ "type": "string"
1680
+ }
1681
+ },
1682
+ "body": {
1683
+ "description": "Raw request body (Jinja-templated). Mutually exclusive with `form`.",
1684
+ "default": null,
1685
+ "type": [
1686
+ "string",
1687
+ "null"
1688
+ ]
1689
+ },
1690
+ "expected_status": {
1691
+ "description": "Accepted HTTP status codes. Empty → any 2xx is accepted; anything else fails the task.",
1692
+ "default": [],
1693
+ "type": "array",
1694
+ "items": {
1695
+ "type": "integer",
1696
+ "format": "uint16",
1697
+ "minimum": 0.0
1698
+ }
1699
+ },
1700
+ "form": {
1701
+ "description": "Form fields serialized as `application/x-www-form-urlencoded` (values templated).",
1702
+ "default": null,
1703
+ "type": [
1704
+ "object",
1705
+ "null"
1706
+ ],
1707
+ "additionalProperties": {
1708
+ "type": "string"
1709
+ }
1710
+ },
1711
+ "headers": {
1712
+ "description": "Request headers; values are Jinja-templated and may reference `{{ secrets.X }}`.",
1713
+ "default": {},
1714
+ "type": "object",
1715
+ "additionalProperties": {
1716
+ "type": "string"
1717
+ }
1718
+ },
1719
+ "method": {
1720
+ "description": "HTTP method (GET/POST/PUT/PATCH/DELETE). Defaults to POST.",
1721
+ "default": "POST",
1722
+ "type": "string"
1723
+ },
1724
+ "persist_to_secret": {
1725
+ "description": "Optionally write a field of the JSON response back into a project secret.",
1726
+ "default": null,
1727
+ "anyOf": [
1728
+ {
1729
+ "$ref": "#/definitions/PersistToSecret"
1730
+ },
1731
+ {
1732
+ "type": "null"
1733
+ }
1734
+ ]
1735
+ },
1736
+ "secrets": {
1737
+ "description": "Project secret names to resolve into the `{{ secrets.NAME }}` template scope.",
1738
+ "default": [],
1739
+ "type": "array",
1740
+ "items": {
1741
+ "type": "string"
1742
+ }
1743
+ },
1744
+ "timeout_secs": {
1745
+ "description": "Request timeout in seconds (1–120). Defaults to 30.",
1746
+ "default": 30,
1747
+ "type": "integer",
1748
+ "format": "uint64",
1749
+ "minimum": 0.0
1750
+ },
1751
+ "type": {
1752
+ "type": "string",
1753
+ "enum": [
1754
+ "http_request"
1755
+ ]
1756
+ },
1757
+ "url": {
1758
+ "description": "Request URL (Jinja-templated).",
1759
+ "type": "string"
1760
+ }
1761
+ }
1762
+ },
1763
+ {
1764
+ "description": "Run an airway ELT pipeline as an automation step.\n\nUnlike the other I/O task types this is **not** executed by `step_executor` — it is delegated as a `TaskSpec::Airway`, reusing the existing airway run path (secret resolution, Airhouse credential minting, backfill windowing, run-scoped state). See `StepKind::Airway`.\n\nA step completes only once the pipeline's end-of-load fold has committed, so a following `execute_sql` step reads a queryable table rather than a half-folded one.",
1765
+ "type": "object",
1766
+ "required": [
1767
+ "pipeline",
1768
+ "type"
1769
+ ],
1770
+ "properties": {
1771
+ "pipeline": {
1772
+ "description": "Workspace-relative path to the `.airway.yml` pipeline spec.",
1773
+ "type": "string"
1774
+ },
1775
+ "resources": {
1776
+ "description": "Explicit subset of the spec's resources (tables) to run. Omitted or empty runs the whole pipeline.",
1777
+ "default": null,
1778
+ "type": [
1779
+ "array",
1780
+ "null"
1781
+ ],
1782
+ "items": {
1783
+ "type": "string"
1784
+ }
1785
+ },
1786
+ "type": {
1787
+ "type": "string",
1788
+ "enum": [
1789
+ "airway"
1790
+ ]
1791
+ }
1792
+ }
1793
+ },
1794
+ {
1795
+ "type": "object",
1796
+ "required": [
1797
+ "type"
1798
+ ],
1799
+ "properties": {
1800
+ "type": {
1801
+ "type": "string",
1802
+ "enum": [
1803
+ "Unknown"
1804
+ ]
1805
+ }
1806
+ }
1807
+ }
1808
+ ],
1809
+ "required": [
1810
+ "name"
1811
+ ],
1812
+ "properties": {
1813
+ "cache": {
1814
+ "anyOf": [
1815
+ {
1816
+ "$ref": "#/definitions/TaskCache"
1817
+ },
1818
+ {
1819
+ "type": "null"
1820
+ }
1821
+ ]
1822
+ },
1823
+ "mode": {
1824
+ "description": "Execution mode when this task is used inside a data app. Defaults to `client`.",
1825
+ "default": "client",
1826
+ "allOf": [
1827
+ {
1828
+ "$ref": "#/definitions/AppTaskMode"
1829
+ }
1830
+ ]
1831
+ },
1832
+ "name": {
1833
+ "description": "Unique name for the task within the workflow. Format: alphanumeric and underscores only, starting with a letter.",
1834
+ "type": "string"
1835
+ }
1836
+ }
1837
+ },
1838
+ "TaskCache": {
1839
+ "type": "object",
1840
+ "required": [
1841
+ "path"
1842
+ ],
1843
+ "properties": {
1844
+ "enabled": {
1845
+ "default": false,
1846
+ "type": "boolean"
1847
+ },
1848
+ "path": {
1849
+ "type": "string"
1850
+ }
1851
+ }
1852
+ },
1853
+ "TaskExport": {
1854
+ "type": "object",
1855
+ "required": [
1856
+ "format",
1857
+ "path"
1858
+ ],
1859
+ "properties": {
1860
+ "format": {
1861
+ "$ref": "#/definitions/ExportFormat"
1862
+ },
1863
+ "path": {
1864
+ "type": "string"
1865
+ }
1866
+ }
1867
+ },
1868
+ "TimeDimension": {
1869
+ "description": "Time dimension for temporal queries with granularity and date range",
1870
+ "type": "object",
1871
+ "required": [
1872
+ "dimension"
1873
+ ],
1874
+ "properties": {
1875
+ "dimension": {
1876
+ "description": "Dimension name in format: <view_name>.<dimension_name>",
1877
+ "type": "string"
1878
+ },
1879
+ "granularity": {
1880
+ "description": "Time granularity for grouping (year, month, day, etc.)",
1881
+ "anyOf": [
1882
+ {
1883
+ "$ref": "#/definitions/TimeGranularity"
1884
+ },
1885
+ {
1886
+ "type": "null"
1887
+ }
1888
+ ]
1889
+ }
1890
+ }
1891
+ },
1892
+ "TimeGranularity": {
1893
+ "description": "Time granularity options for time dimension queries",
1894
+ "type": "string",
1895
+ "enum": [
1896
+ "year",
1897
+ "quarter",
1898
+ "month",
1899
+ "week",
1900
+ "day",
1901
+ "hour",
1902
+ "minute",
1903
+ "second"
1904
+ ]
1905
+ }
1906
+ }
1907
+ }