autoair 0.1.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 (731) hide show
  1. autoair/__init__.py +3 -0
  2. autoair/_compat.py +96 -0
  3. autoair/_fs.py +46 -0
  4. autoair/_subprocess.py +50 -0
  5. autoair/admin.py +238 -0
  6. autoair/ai/__init__.py +99 -0
  7. autoair/ai/access.py +261 -0
  8. autoair/ai/agent.py +451 -0
  9. autoair/ai/assist.py +599 -0
  10. autoair/ai/assistants/__init__.py +11 -0
  11. autoair/ai/assistants/admin_tools.py +582 -0
  12. autoair/ai/assistants/airflow_actions.py +584 -0
  13. autoair/ai/assistants/chat.py +372 -0
  14. autoair/ai/assistants/compaction.py +203 -0
  15. autoair/ai/assistants/deploy_message.py +157 -0
  16. autoair/ai/assistants/dev_tools.py +280 -0
  17. autoair/ai/assistants/fs_sandbox.py +242 -0
  18. autoair/ai/assistants/mcp_client.py +455 -0
  19. autoair/ai/assistants/project_rules.py +154 -0
  20. autoair/ai/assistants/sources.py +147 -0
  21. autoair/ai/assistants/threads.py +301 -0
  22. autoair/ai/assistants/troubleshoot.py +1034 -0
  23. autoair/ai/assistants/upgrade.py +213 -0
  24. autoair/ai/audit_log.py +286 -0
  25. autoair/ai/availability.py +28 -0
  26. autoair/ai/chunking.py +170 -0
  27. autoair/ai/config.py +1058 -0
  28. autoair/ai/corpus.py +205 -0
  29. autoair/ai/events.py +332 -0
  30. autoair/ai/findings.py +274 -0
  31. autoair/ai/generator.py +396 -0
  32. autoair/ai/guardrails.py +593 -0
  33. autoair/ai/knowledge/airflow3-best-practices.md +65 -0
  34. autoair/ai/knowledge/dagspec-authoring.md +51 -0
  35. autoair/ai/knowledge.py +342 -0
  36. autoair/ai/llm.py +690 -0
  37. autoair/ai/memory.py +270 -0
  38. autoair/ai/models.py +501 -0
  39. autoair/ai/net.py +270 -0
  40. autoair/ai/problems.py +154 -0
  41. autoair/ai/prompts.py +620 -0
  42. autoair/ai/proxy.py +179 -0
  43. autoair/ai/query.py +106 -0
  44. autoair/ai/rag.py +802 -0
  45. autoair/ai/rerank.py +212 -0
  46. autoair/ai/research/__init__.py +13 -0
  47. autoair/ai/research/local.py +495 -0
  48. autoair/ai/research/online.py +279 -0
  49. autoair/ai/research/tools.py +346 -0
  50. autoair/ai/rules.py +984 -0
  51. autoair/ai/service.py +184 -0
  52. autoair/ai/testing.py +209 -0
  53. autoair/ai/toolbox.py +308 -0
  54. autoair/ai/tools.py +59 -0
  55. autoair/ai/tuning.py +307 -0
  56. autoair/ai/usage.py +127 -0
  57. autoair/ai/user_llm.py +395 -0
  58. autoair/ai/writers.py +889 -0
  59. autoair/api/app.py +678 -0
  60. autoair/api/deps.py +46 -0
  61. autoair/api/errors.py +18 -0
  62. autoair/api/features.py +43 -0
  63. autoair/api/git_token.py +115 -0
  64. autoair/api/platform.py +320 -0
  65. autoair/api/routers/__init__.py +0 -0
  66. autoair/api/routers/admin.py +602 -0
  67. autoair/api/routers/admin_ai.py +116 -0
  68. autoair/api/routers/admin_features.py +182 -0
  69. autoair/api/routers/ai.py +1301 -0
  70. autoair/api/routers/ai_assistants.py +1249 -0
  71. autoair/api/routers/ai_mount.py +126 -0
  72. autoair/api/routers/airflow.py +594 -0
  73. autoair/api/routers/catalog.py +167 -0
  74. autoair/api/routers/collab.py +27 -0
  75. autoair/api/routers/config.py +84 -0
  76. autoair/api/routers/deploy_target.py +273 -0
  77. autoair/api/routers/icons.py +124 -0
  78. autoair/api/routers/interchange.py +266 -0
  79. autoair/api/routers/kb.py +259 -0
  80. autoair/api/routers/lsp.py +64 -0
  81. autoair/api/routers/lsp_ws.py +125 -0
  82. autoair/api/routers/marketplace.py +43 -0
  83. autoair/api/routers/meta.py +279 -0
  84. autoair/api/routers/ops.py +115 -0
  85. autoair/api/routers/review.py +56 -0
  86. autoair/api/routers/runs.py +163 -0
  87. autoair/api/routers/specs.py +1328 -0
  88. autoair/api/routers/templates.py +195 -0
  89. autoair/api/routers/tools.py +105 -0
  90. autoair/api/routers/vcs.py +315 -0
  91. autoair/audit.py +218 -0
  92. autoair/auth.py +287 -0
  93. autoair/catalog/__init__.py +51 -0
  94. autoair/catalog/discovery.py +590 -0
  95. autoair/catalog/importer.py +148 -0
  96. autoair/catalog/introspection.py +311 -0
  97. autoair/catalog/metadata.py +595 -0
  98. autoair/catalog/models.py +225 -0
  99. autoair/catalog/providers.py +137 -0
  100. autoair/catalog/schema_check.py +108 -0
  101. autoair/catalog/service.py +1606 -0
  102. autoair/catalog/static.py +1138 -0
  103. autoair/cli.py +774 -0
  104. autoair/codegen/__init__.py +53 -0
  105. autoair/codegen/body.py +46 -0
  106. autoair/codegen/builder.py +780 -0
  107. autoair/codegen/context.py +552 -0
  108. autoair/codegen/dagfactory.py +168 -0
  109. autoair/codegen/features.py +63 -0
  110. autoair/codegen/format.py +57 -0
  111. autoair/codegen/timedeltas.py +44 -0
  112. autoair/codegen/yaml_dag.py +527 -0
  113. autoair/collab.py +289 -0
  114. autoair/collab_sync.py +594 -0
  115. autoair/config_reference.py +284 -0
  116. autoair/config_sources.py +581 -0
  117. autoair/deploy_setup.py +384 -0
  118. autoair/feature_overrides.py +142 -0
  119. autoair/gateway/__init__.py +783 -0
  120. autoair/governance.py +356 -0
  121. autoair/iam/__init__.py +15 -0
  122. autoair/iam/config.py +196 -0
  123. autoair/iam/deps.py +317 -0
  124. autoair/iam/fab.py +65 -0
  125. autoair/iam/login.py +270 -0
  126. autoair/iam/model.py +280 -0
  127. autoair/iam/proposals.py +252 -0
  128. autoair/iam/resolver.py +249 -0
  129. autoair/iam/sso.py +363 -0
  130. autoair/icons.py +575 -0
  131. autoair/importer/__init__.py +0 -0
  132. autoair/importer/bulk.py +280 -0
  133. autoair/importer/code_sync.py +247 -0
  134. autoair/importer/python_dag.py +783 -0
  135. autoair/kb/__init__.py +14 -0
  136. autoair/kb/bundle.py +319 -0
  137. autoair/kb/chunk.py +76 -0
  138. autoair/kb/cli.py +266 -0
  139. autoair/kb/components.py +209 -0
  140. autoair/kb/config.py +495 -0
  141. autoair/kb/fetch.py +397 -0
  142. autoair/kb/ingest.py +598 -0
  143. autoair/kb/mcp.py +114 -0
  144. autoair/kb/models.py +260 -0
  145. autoair/kb/parse.py +530 -0
  146. autoair/kb/scheduler.py +84 -0
  147. autoair/kb/service.py +571 -0
  148. autoair/kb/sources.py +756 -0
  149. autoair/kb/state.py +171 -0
  150. autoair/kb/stores/__init__.py +106 -0
  151. autoair/kb/stores/base.py +142 -0
  152. autoair/kb/stores/elasticsearch.py +575 -0
  153. autoair/kb/stores/local.py +522 -0
  154. autoair/kb/stores/pgvector.py +395 -0
  155. autoair/loader/__init__.py +66 -0
  156. autoair/logging_setup.py +87 -0
  157. autoair/lsp/__init__.py +284 -0
  158. autoair/lsp/airflow_context.py +81 -0
  159. autoair/lsp/config.py +73 -0
  160. autoair/lsp/proxy.py +747 -0
  161. autoair/lsp/shell.py +128 -0
  162. autoair/lsp/validate.py +558 -0
  163. autoair/marketplace.py +329 -0
  164. autoair/mcp/__init__.py +41 -0
  165. autoair/mcp/availability.py +40 -0
  166. autoair/mcp/git_token.py +92 -0
  167. autoair/mcp/http.py +121 -0
  168. autoair/mcp/iam.py +297 -0
  169. autoair/mcp/models.py +175 -0
  170. autoair/mcp/server.py +1782 -0
  171. autoair/mcp/store.py +84 -0
  172. autoair/merge.py +330 -0
  173. autoair/net/__init__.py +1 -0
  174. autoair/net/tls.py +284 -0
  175. autoair/persistence/__init__.py +59 -0
  176. autoair/persistence/config.py +115 -0
  177. autoair/persistence/db.py +336 -0
  178. autoair/persistence/documents.py +227 -0
  179. autoair/persistence/migrations.py +139 -0
  180. autoair/persistence/protocols.py +102 -0
  181. autoair/persistence/schema.py +191 -0
  182. autoair/persistence/sql.py +829 -0
  183. autoair/plugin.py +86 -0
  184. autoair/policy_rules.py +312 -0
  185. autoair/py.typed +0 -0
  186. autoair/registry/__init__.py +171 -0
  187. autoair/rendering.py +27 -0
  188. autoair/resources/__init__.py +0 -0
  189. autoair/resources/airflow-dag-yaml-2026-10-30.schema.json +417 -0
  190. autoair/resources/logos/airbyte.png +0 -0
  191. autoair/resources/logos/alibabacloud-oss.png +0 -0
  192. autoair/resources/logos/amazon-appflow-light.png +0 -0
  193. autoair/resources/logos/amazon-athena-light-bg-4x.png +0 -0
  194. autoair/resources/logos/amazon-bedrock-light-bg-4x.png +0 -0
  195. autoair/resources/logos/amazon-chime-light-bg.png +0 -0
  196. autoair/resources/logos/amazon-cloudwatch-light-bg-4x.png +0 -0
  197. autoair/resources/logos/amazon-comprehend-light-bg-4x.png +0 -0
  198. autoair/resources/logos/amazon-dynamodb-light-bg-4x.png +0 -0
  199. autoair/resources/logos/amazon-ec2-light-bg-4x.png +0 -0
  200. autoair/resources/logos/amazon-elastic-container-registry-light-bg-4x.png +0 -0
  201. autoair/resources/logos/amazon-elastic-container-service-light-bg-4x.png +0 -0
  202. autoair/resources/logos/amazon-elastic-kubernetes-service-light-bg-4x.png +0 -0
  203. autoair/resources/logos/amazon-elasticache-light-bg-4x.png +0 -0
  204. autoair/resources/logos/amazon-emr-light-bg-4x.png +0 -0
  205. autoair/resources/logos/amazon-eventbridge-64.png +0 -0
  206. autoair/resources/logos/amazon-kinesis-analytics-light-bg-4x.png +0 -0
  207. autoair/resources/logos/amazon-kinesis-data-firehose-light-bg-4x.png +0 -0
  208. autoair/resources/logos/amazon-mwaa.png +0 -0
  209. autoair/resources/logos/amazon-neptune-64.png +0 -0
  210. autoair/resources/logos/amazon-opensearch-light-bg-4x.png +0 -0
  211. autoair/resources/logos/amazon-quicksight-light-bg-4x.png +0 -0
  212. autoair/resources/logos/amazon-rds-light-bg-4x.png +0 -0
  213. autoair/resources/logos/amazon-redshift-light-bg-4x.png +0 -0
  214. autoair/resources/logos/amazon-s3-glacier-light-bg-4x.png +0 -0
  215. autoair/resources/logos/amazon-sagemaker-light-bg-4x.png +0 -0
  216. autoair/resources/logos/amazon-simple-email-service-ses-light-bg-4x.png +0 -0
  217. autoair/resources/logos/amazon-simple-notification-service-sns-light-bg-4x.png +0 -0
  218. autoair/resources/logos/amazon-simple-queue-service-sqs-light-bg-4x.png +0 -0
  219. autoair/resources/logos/amazon-simple-storage-service-s3-light-bg-4x.png +0 -0
  220. autoair/resources/logos/amazon-verified-permissions.png +0 -0
  221. autoair/resources/logos/apache-beam.png +0 -0
  222. autoair/resources/logos/apache-impala.png +0 -0
  223. autoair/resources/logos/apache-tinkerpop.png +0 -0
  224. autoair/resources/logos/arangodb.svg +1 -0
  225. autoair/resources/logos/asana.svg +1 -0
  226. autoair/resources/logos/aws-batch-light-bg-4x.png +0 -0
  227. autoair/resources/logos/aws-cloud-alt-light-bg-4x.png +0 -0
  228. autoair/resources/logos/aws-cloudformation-light-bg-4x.png +0 -0
  229. autoair/resources/logos/aws-database-migration-service-64-5x.png +0 -0
  230. autoair/resources/logos/aws-datasync-light-bg-4x.png +0 -0
  231. autoair/resources/logos/aws-glue-databrew-64.png +0 -0
  232. autoair/resources/logos/aws-glue-light-bg-4x.png +0 -0
  233. autoair/resources/logos/aws-lambda-light-bg-4x.png +0 -0
  234. autoair/resources/logos/aws-secrets-manager-light-bg-4x.png +0 -0
  235. autoair/resources/logos/aws-step-functions-light-bg-4x.png +0 -0
  236. autoair/resources/logos/aws-sts-light-bg-4x.png +0 -0
  237. autoair/resources/logos/aws-systems-manager-light-bg-4x.png +0 -0
  238. autoair/resources/logos/azure-cosmos-db.svg +11 -0
  239. autoair/resources/logos/azure-data-factory.svg +1 -0
  240. autoair/resources/logos/azure-files.svg +8 -0
  241. autoair/resources/logos/bash.svg +1 -0
  242. autoair/resources/logos/bigquery.png +0 -0
  243. autoair/resources/logos/blob-storage.svg +9 -0
  244. autoair/resources/logos/cassandra-3.png +0 -0
  245. autoair/resources/logos/celery.png +0 -0
  246. autoair/resources/logos/clickhouse.png +0 -0
  247. autoair/resources/logos/cloud-bigtable.png +0 -0
  248. autoair/resources/logos/cloud-build.png +0 -0
  249. autoair/resources/logos/cloud-dataflow.png +0 -0
  250. autoair/resources/logos/cloud-dataproc.png +0 -0
  251. autoair/resources/logos/cloud-datastore.png +0 -0
  252. autoair/resources/logos/cloud-functions.png +0 -0
  253. autoair/resources/logos/cloud-logging-sink.png +0 -0
  254. autoair/resources/logos/cloud-looker.png +0 -0
  255. autoair/resources/logos/cloud-memorystore.png +0 -0
  256. autoair/resources/logos/cloud-nlp.png +0 -0
  257. autoair/resources/logos/cloud-pubsub.png +0 -0
  258. autoair/resources/logos/cloud-spanner.png +0 -0
  259. autoair/resources/logos/cloud-speech-to-text.png +0 -0
  260. autoair/resources/logos/cloud-sql.png +0 -0
  261. autoair/resources/logos/cloud-storage.png +0 -0
  262. autoair/resources/logos/cloud-tasks.png +0 -0
  263. autoair/resources/logos/cloud-text-to-speech.png +0 -0
  264. autoair/resources/logos/cloud-translation-api.png +0 -0
  265. autoair/resources/logos/cloud-video-intelligence-api.png +0 -0
  266. autoair/resources/logos/cloud-vision-api.png +0 -0
  267. autoair/resources/logos/cloudant.png +0 -0
  268. autoair/resources/logos/compute-engine.png +0 -0
  269. autoair/resources/logos/container-instances.svg +9 -0
  270. autoair/resources/logos/data-lake-storage.svg +37 -0
  271. autoair/resources/logos/databricks.png +0 -0
  272. autoair/resources/logos/datadog.png +0 -0
  273. autoair/resources/logos/dbt.png +0 -0
  274. autoair/resources/logos/dingding.png +0 -0
  275. autoair/resources/logos/discord.png +0 -0
  276. autoair/resources/logos/docker-swarm.png +0 -0
  277. autoair/resources/logos/docker.png +0 -0
  278. autoair/resources/logos/drill.png +0 -0
  279. autoair/resources/logos/druid-1.png +0 -0
  280. autoair/resources/logos/elasticsearch.png +0 -0
  281. autoair/resources/logos/exasol.png +0 -0
  282. autoair/resources/logos/facebook-ads.png +0 -0
  283. autoair/resources/logos/flinkonk8s.png +0 -0
  284. autoair/resources/logos/ftp.png +0 -0
  285. autoair/resources/logos/git.svg +1 -0
  286. autoair/resources/logos/github.svg +3 -0
  287. autoair/resources/logos/gitlab.svg +1 -0
  288. autoair/resources/logos/glyph-agent.svg +1 -0
  289. autoair/resources/logos/glyph-branch.svg +1 -0
  290. autoair/resources/logos/glyph-calendar.svg +1 -0
  291. autoair/resources/logos/glyph-clock.svg +1 -0
  292. autoair/resources/logos/glyph-document.svg +1 -0
  293. autoair/resources/logos/glyph-embedding.svg +1 -0
  294. autoair/resources/logos/glyph-empty.svg +1 -0
  295. autoair/resources/logos/glyph-hourglass.svg +1 -0
  296. autoair/resources/logos/glyph-human.svg +1 -0
  297. autoair/resources/logos/glyph-latest.svg +1 -0
  298. autoair/resources/logos/glyph-link.svg +1 -0
  299. autoair/resources/logos/glyph-llm.svg +1 -0
  300. autoair/resources/logos/glyph-quality.svg +1 -0
  301. autoair/resources/logos/glyph-rerank.svg +1 -0
  302. autoair/resources/logos/glyph-retrieval.svg +1 -0
  303. autoair/resources/logos/glyph-schema-compare.svg +1 -0
  304. autoair/resources/logos/glyph-smooth.svg +1 -0
  305. autoair/resources/logos/glyph-sql-ai.svg +1 -0
  306. autoair/resources/logos/glyph-sync.svg +1 -0
  307. autoair/resources/logos/glyph-terminal.svg +1 -0
  308. autoair/resources/logos/glyph-transfer.svg +1 -0
  309. autoair/resources/logos/glyph-trigger.svg +1 -0
  310. autoair/resources/logos/google-ads.png +0 -0
  311. autoair/resources/logos/google-analytics.png +0 -0
  312. autoair/resources/logos/google-api-python-client.png +0 -0
  313. autoair/resources/logos/google-calendar.png +0 -0
  314. autoair/resources/logos/google-campaign-manager.png +0 -0
  315. autoair/resources/logos/google-cloud-generic.png +0 -0
  316. autoair/resources/logos/google-cloud-secret-manager.png +0 -0
  317. autoair/resources/logos/google-cloud.png +0 -0
  318. autoair/resources/logos/google-data-fusion.png +0 -0
  319. autoair/resources/logos/google-data-loss-prevention.png +0 -0
  320. autoair/resources/logos/google-dataprep.png +0 -0
  321. autoair/resources/logos/google-deployment-manager.png +0 -0
  322. autoair/resources/logos/google-display-and-video-360.png +0 -0
  323. autoair/resources/logos/google-drive.png +0 -0
  324. autoair/resources/logos/google-firestore.png +0 -0
  325. autoair/resources/logos/google-search-ads360.png +0 -0
  326. autoair/resources/logos/google-spreadsheet.png +0 -0
  327. autoair/resources/logos/google.png +0 -0
  328. autoair/resources/logos/grpc.png +0 -0
  329. autoair/resources/logos/hadoop.png +0 -0
  330. autoair/resources/logos/hashicorp-vault.png +0 -0
  331. autoair/resources/logos/hive.png +0 -0
  332. autoair/resources/logos/http.png +0 -0
  333. autoair/resources/logos/iceberg.png +0 -0
  334. autoair/resources/logos/imap.png +0 -0
  335. autoair/resources/logos/influxdb.svg +1 -0
  336. autoair/resources/logos/informatica.png +0 -0
  337. autoair/resources/logos/jdbc.png +0 -0
  338. autoair/resources/logos/jenkins.png +0 -0
  339. autoair/resources/logos/jira.png +0 -0
  340. autoair/resources/logos/kafka.svg +22 -0
  341. autoair/resources/logos/key-management-service.png +0 -0
  342. autoair/resources/logos/keycloak.svg +1 -0
  343. autoair/resources/logos/kubernetes-engine.png +0 -0
  344. autoair/resources/logos/kubernetes.png +0 -0
  345. autoair/resources/logos/kylin.png +0 -0
  346. autoair/resources/logos/livy.png +0 -0
  347. autoair/resources/logos/manifest.json +329 -0
  348. autoair/resources/logos/microsoft-azure-batch.png +0 -0
  349. autoair/resources/logos/microsoft-azure-data-explorer.png +0 -0
  350. autoair/resources/logos/microsoft-azure-fileshare.png +0 -0
  351. autoair/resources/logos/microsoft-azure.png +0 -0
  352. autoair/resources/logos/microsoft-graph-api.png +0 -0
  353. autoair/resources/logos/microsoft-sql-server.png +0 -0
  354. autoair/resources/logos/mongodb.png +0 -0
  355. autoair/resources/logos/mysql.png +0 -0
  356. autoair/resources/logos/neo4j.svg +1 -0
  357. autoair/resources/logos/odbc.png +0 -0
  358. autoair/resources/logos/openai.png +0 -0
  359. autoair/resources/logos/openfaas.png +0 -0
  360. autoair/resources/logos/openlineage.svg +47 -0
  361. autoair/resources/logos/opensearch.png +0 -0
  362. autoair/resources/logos/opsgenie.png +0 -0
  363. autoair/resources/logos/oracle.png +0 -0
  364. autoair/resources/logos/pagerduty.png +0 -0
  365. autoair/resources/logos/papermill.png +0 -0
  366. autoair/resources/logos/pig.png +0 -0
  367. autoair/resources/logos/pinecone.png +0 -0
  368. autoair/resources/logos/pinot.png +0 -0
  369. autoair/resources/logos/postgres.png +0 -0
  370. autoair/resources/logos/prestodb.png +0 -0
  371. autoair/resources/logos/python.svg +1 -0
  372. autoair/resources/logos/qdrant.svg +45 -0
  373. autoair/resources/logos/redis.png +0 -0
  374. autoair/resources/logos/salesforce.png +0 -0
  375. autoair/resources/logos/samba.png +0 -0
  376. autoair/resources/logos/segment.png +0 -0
  377. autoair/resources/logos/service-bus.svg +1 -0
  378. autoair/resources/logos/sftp.png +0 -0
  379. autoair/resources/logos/singularity.png +0 -0
  380. autoair/resources/logos/slack.png +0 -0
  381. autoair/resources/logos/smtp.png +0 -0
  382. autoair/resources/logos/snowflake.png +0 -0
  383. autoair/resources/logos/spark-on-kubernetes.png +0 -0
  384. autoair/resources/logos/spark.png +0 -0
  385. autoair/resources/logos/sql.png +0 -0
  386. autoair/resources/logos/sqlite.png +0 -0
  387. autoair/resources/logos/ssh.png +0 -0
  388. autoair/resources/logos/tableau.png +0 -0
  389. autoair/resources/logos/telegram.png +0 -0
  390. autoair/resources/logos/teradata.png +0 -0
  391. autoair/resources/logos/trino-og.png +0 -0
  392. autoair/resources/logos/vertica.png +0 -0
  393. autoair/resources/logos/vespa.svg +1 -0
  394. autoair/resources/logos/weaviate.png +0 -0
  395. autoair/resources/logos/winrm.png +0 -0
  396. autoair/resources/logos/yandex-cloud.png +0 -0
  397. autoair/resources/logos/ydb.png +0 -0
  398. autoair/resources/logos/zendesk.png +0 -0
  399. autoair/runner/__init__.py +244 -0
  400. autoair/runner/_child.py +415 -0
  401. autoair/scaffold/__init__.py +83 -0
  402. autoair/scaffold/custom-node/cookiecutter.json +10 -0
  403. autoair/scaffold/custom-node/{{cookiecutter.project_slug}}/README.md +48 -0
  404. autoair/scaffold/custom-node/{{cookiecutter.project_slug}}/pyproject.toml +25 -0
  405. autoair/scaffold/custom-node/{{cookiecutter.project_slug}}/src/{{cookiecutter.package_name}}/__init__.py +5 -0
  406. autoair/scaffold/custom-node/{{cookiecutter.project_slug}}/src/{{cookiecutter.package_name}}/handler.py +72 -0
  407. autoair/scaffold/custom-node/{{cookiecutter.project_slug}}/tests/test_handler.py +63 -0
  408. autoair/secret_mask.py +116 -0
  409. autoair/sections.py +1313 -0
  410. autoair/server.py +243 -0
  411. autoair/settings.py +662 -0
  412. autoair/spec/__init__.py +113 -0
  413. autoair/spec/env_mapping.py +146 -0
  414. autoair/spec/migrations.py +42 -0
  415. autoair/spec/models.py +962 -0
  416. autoair/static/plugin/AdminPanel-DkTNOG-N.js +3348 -0
  417. autoair/static/plugin/AiAssistDialogs-DaXfKsmn.js +435 -0
  418. autoair/static/plugin/AiCodeEditor-CaALp60X.js +15 -0
  419. autoair/static/plugin/AiCodeEditorImpl-ioqYzJXB.js +51 -0
  420. autoair/static/plugin/AiDialogs-DKcg_jPN.js +304 -0
  421. autoair/static/plugin/AiFindings-QMOlgWLO.js +260 -0
  422. autoair/static/plugin/AiFindingsDialog-B_p7fGXp.js +292 -0
  423. autoair/static/plugin/AiKnowledgeDialog-DakN1XqN.js +350 -0
  424. autoair/static/plugin/AiModelDialog-DFOSsgvS.js +305 -0
  425. autoair/static/plugin/AiStream-Bg5_fjGS.js +386 -0
  426. autoair/static/plugin/AiWriterDialog-8LOAmIWj.js +331 -0
  427. autoair/static/plugin/AirflowPickers-BDtRZzPc.js +171 -0
  428. autoair/static/plugin/AirflowTab-CgyrHICC.js +407 -0
  429. autoair/static/plugin/AnalyzeButton-B1F_O8x5.js +30 -0
  430. autoair/static/plugin/AuditTab-CRj__33M.js +75 -0
  431. autoair/static/plugin/Autocomplete-B_F7RRQ0.js +110 -0
  432. autoair/static/plugin/BackfillDialog-Dsw7Qvxy.js +217 -0
  433. autoair/static/plugin/BulkImportDialog-BXnOYQuV.js +441 -0
  434. autoair/static/plugin/ChatMessageView-Da9ponIE.js +722 -0
  435. autoair/static/plugin/ChatPanel-DxOFbbMF.js +547 -0
  436. autoair/static/plugin/ClearRunDialog-CWqTsV7H.js +149 -0
  437. autoair/static/plugin/CodeEditor-Bt4qBEqe.js +2624 -0
  438. autoair/static/plugin/CodeModeView-DAW5PYyu.js +460 -0
  439. autoair/static/plugin/CodeTab-ClhTK8cr.js +424 -0
  440. autoair/static/plugin/CodeView-Ctzcu166.js +89 -0
  441. autoair/static/plugin/ConfigDialog-Z1IM_mFp.js +266 -0
  442. autoair/static/plugin/ConflictDialog-jyOcYxXc.js +416 -0
  443. autoair/static/plugin/DeleteDagDialog-DdrEaPpq.js +79 -0
  444. autoair/static/plugin/DeployDialog-Btws3gWE.js +449 -0
  445. autoair/static/plugin/DialogShell-A9nq4Mub.js +44 -0
  446. autoair/static/plugin/DiffSummary-tHfNtXUV.js +156 -0
  447. autoair/static/plugin/DiffView-Hmv9hnOT.js +907 -0
  448. autoair/static/plugin/DuplicateDialog-DuOaL-u-.js +58 -0
  449. autoair/static/plugin/ExecutionTab-DtnHDHO7.js +269 -0
  450. autoair/static/plugin/GitTokenField-DZaMLiDX.js +100 -0
  451. autoair/static/plugin/IconPicker-BWLxAWnS.js +483 -0
  452. autoair/static/plugin/ImportDialog-BandLZS1.js +385 -0
  453. autoair/static/plugin/JsonBlock-DmsQhoaC.js +28 -0
  454. autoair/static/plugin/LatestVersionSelect-D_xvgQ20.js +74 -0
  455. autoair/static/plugin/Markdown-DvpQsfRf.js +7898 -0
  456. autoair/static/plugin/NewConnectionDialog-Buf7Ao30.js +380 -0
  457. autoair/static/plugin/OpenDialog-BVEf8PTb.js +197 -0
  458. autoair/static/plugin/OperatorParams-BH4AQBYr.js +3497 -0
  459. autoair/static/plugin/OperatorTemplateEditor-BNs0UtYx.js +1112 -0
  460. autoair/static/plugin/OperatorTemplateInputsDialog-C_UpCLc7.js +199 -0
  461. autoair/static/plugin/PromoteDialog-B4U-UfsV.js +164 -0
  462. autoair/static/plugin/RawCodeView-WcMnekRh.js +461 -0
  463. autoair/static/plugin/RunsTab-CXteAqeT.js +201 -0
  464. autoair/static/plugin/SaveOperatorTemplateDialog-DCvtCReh.js +240 -0
  465. autoair/static/plugin/SaveTemplateDialog-Dd0SEGw2.js +113 -0
  466. autoair/static/plugin/SchemaForm-IQwjq7WV.js +19 -0
  467. autoair/static/plugin/SchemaFormImpl-UYTxiUZZ.js +17196 -0
  468. autoair/static/plugin/SpecDiffReview-CLwxKrWC.js +120 -0
  469. autoair/static/plugin/StateBadge-C23Kcrqm.js +13 -0
  470. autoair/static/plugin/StorageDialog-Syiy1ds0.js +383 -0
  471. autoair/static/plugin/THIRD_PARTY_LICENSES.md +5276 -0
  472. autoair/static/plugin/TaskTab-D5OOtt9m.js +277 -0
  473. autoair/static/plugin/TemplatesDialog-KyCx2Lbs.js +638 -0
  474. autoair/static/plugin/TestTaskDialog-CMHpak9t.js +413 -0
  475. autoair/static/plugin/Tip-BV6tQO7D.js +25 -0
  476. autoair/static/plugin/TriggerDialog-CVfbb15L.js +177 -0
  477. autoair/static/plugin/TroubleshootDialog-BR3zKfci.js +1046 -0
  478. autoair/static/plugin/UnmanagedDialog-BMa8F2hP.js +126 -0
  479. autoair/static/plugin/UpgradeDialog-DTI7lyK8.js +247 -0
  480. autoair/static/plugin/VersionsTab-D00PBdzY.js +546 -0
  481. autoair/static/plugin/access-BYFVFh6C.js +19 -0
  482. autoair/static/plugin/actions-BSzclKY-.js +4364 -0
  483. autoair/static/plugin/actions-DOu-JDEn.js +529 -0
  484. autoair/static/plugin/ai-C2Qbmkyi.js +200 -0
  485. autoair/static/plugin/assets/layout.worker-DW7MC31Q.js +22 -0
  486. autoair/static/plugin/builder-sja5r6wu.js +8963 -0
  487. autoair/static/plugin/canonical-Bh_uW3MF.js +21 -0
  488. autoair/static/plugin/capabilities-M652otPM.js +22 -0
  489. autoair/static/plugin/code-C_OnDrz4.js +730 -0
  490. autoair/static/plugin/dates-DoB8lXtr.js +15 -0
  491. autoair/static/plugin/dist-B9vMWY4f.js +292 -0
  492. autoair/static/plugin/dist-BYiD08Lh.js +469 -0
  493. autoair/static/plugin/dist-D7fwIwda.js +14090 -0
  494. autoair/static/plugin/elk-api-DWiB7VoS.js +198 -0
  495. autoair/static/plugin/factories-BkHO63YE.js +62 -0
  496. autoair/static/plugin/fields-Bb1ft4N_.js +480 -0
  497. autoair/static/plugin/formSchema-CyhpMmtJ.js +216 -0
  498. autoair/static/plugin/gitToken-UHJSMULO.js +30 -0
  499. autoair/static/plugin/hooks-DMiMZMal.js +28 -0
  500. autoair/static/plugin/i18n-0FawidLE.js +7728 -0
  501. autoair/static/plugin/i18nInstance-CZahk5l_.js +47 -0
  502. autoair/static/plugin/icon.svg +1 -0
  503. autoair/static/plugin/icons-Cguzgt0W.js +51 -0
  504. autoair/static/plugin/insertables-BkOYGjXW.js +231 -0
  505. autoair/static/plugin/jinja-BQHzM2Lo.js +976 -0
  506. autoair/static/plugin/layout-CSet5pC4.js +122 -0
  507. autoair/static/plugin/lazy-BI37_zIU.js +24 -0
  508. autoair/static/plugin/lspClient-DDyn5PQg.js +2669 -0
  509. autoair/static/plugin/lu-Dqbh7tTF.js +5693 -0
  510. autoair/static/plugin/main.js +14149 -0
  511. autoair/static/plugin/markdown-BIEso4Rr.js +12 -0
  512. autoair/static/plugin/nodes-DkZYxwBr.js +806 -0
  513. autoair/static/plugin/operatorTemplateEditor-CoAfT66u.js +205 -0
  514. autoair/static/plugin/operatorTemplates-BMgJ1yxU.js +127 -0
  515. autoair/static/plugin/params-CbDYxai1.js +71 -0
  516. autoair/static/plugin/problemMessages-BXpQzZRH.js +240 -0
  517. autoair/static/plugin/react-jsx-runtime-Cai7-eku.js +11 -0
  518. autoair/static/plugin/react-query.gen-3vmdtzZa.js +1267 -0
  519. autoair/static/plugin/rolldown-runtime-CEFd7nDs.js +30 -0
  520. autoair/static/plugin/runOverlay-DnylM9km.js +75 -0
  521. autoair/static/plugin/runState-CPs3Px8Z.js +223 -0
  522. autoair/static/plugin/sdk.gen-R6qA-95C.js +1225 -0
  523. autoair/static/plugin/setup-Bc69nXao.js +50 -0
  524. autoair/static/plugin/shallow-qr53gA9I.js +30 -0
  525. autoair/static/plugin/shell-DvIl0hZL.js +4142 -0
  526. autoair/static/plugin/store-C65x8y4g.js +96 -0
  527. autoair/static/plugin/store-CUj0Iblx.js +29 -0
  528. autoair/static/plugin/store-D-qOX0Ro.js +206 -0
  529. autoair/static/plugin/toaster-DVl7jXAF.js +34 -0
  530. autoair/static/plugin/useIsDark-csNHztsa.js +2926 -0
  531. autoair/static/plugin/useMutation-BeWnS0xv.js +292 -0
  532. autoair/static/plugin/useQuery-BaLDBBtv.js +647 -0
  533. autoair/static/plugin/useRunOverlaySync-QcIzHjJF.js +36 -0
  534. autoair/static/plugin/useTranslation-BklDu29n.js +153 -0
  535. autoair/static/standalone/THIRD_PARTY_LICENSES.md +7260 -0
  536. autoair/static/standalone/assets/AdminPanel-DMyBDxqU.js +1 -0
  537. autoair/static/standalone/assets/AiAssistDialogs-eYCvacx1.js +1 -0
  538. autoair/static/standalone/assets/AiCodeEditor-TMNsnvCM.js +2 -0
  539. autoair/static/standalone/assets/AiCodeEditorImpl-BDN-4cTi.js +1 -0
  540. autoair/static/standalone/assets/AiDialogs-B4Rvt95n.js +1 -0
  541. autoair/static/standalone/assets/AiFindings-Dqie-srv.js +1 -0
  542. autoair/static/standalone/assets/AiFindingsDialog-6VByiWza.js +1 -0
  543. autoair/static/standalone/assets/AiKnowledgeDialog-VsIhSeow.js +1 -0
  544. autoair/static/standalone/assets/AiModelDialog-XCeTU6Xi.js +1 -0
  545. autoair/static/standalone/assets/AiStream-B-YqipiU.js +11 -0
  546. autoair/static/standalone/assets/AiWriterDialog-BJFfPO_D.js +2 -0
  547. autoair/static/standalone/assets/AirflowPickers-BDgK95W4.js +2 -0
  548. autoair/static/standalone/assets/AirflowTab-DGZA3-hP.js +7 -0
  549. autoair/static/standalone/assets/AnalyzeButton-zNw48hoj.js +1 -0
  550. autoair/static/standalone/assets/AuditTab-9jdf3LeB.js +1 -0
  551. autoair/static/standalone/assets/Autocomplete-JnxGF0Pa.js +1 -0
  552. autoair/static/standalone/assets/BackfillDialog-aZ77WztH.js +1 -0
  553. autoair/static/standalone/assets/BulkImportDialog-B6zNzpve.js +3 -0
  554. autoair/static/standalone/assets/ChatMessageView-FGhfBXlP.js +5 -0
  555. autoair/static/standalone/assets/ChatPanel-BEMNgOAE.js +1 -0
  556. autoair/static/standalone/assets/ClearRunDialog-K0CrdR8I.js +1 -0
  557. autoair/static/standalone/assets/CodeEditor-NlGY3iKd.js +33 -0
  558. autoair/static/standalone/assets/CodeTab-yDNvy1I2.js +3 -0
  559. autoair/static/standalone/assets/CodeView-BihhWpbO.js +1 -0
  560. autoair/static/standalone/assets/ConfigDialog-BElXSWRP.js +1 -0
  561. autoair/static/standalone/assets/ConflictDialog-BcJrkr0d.js +1 -0
  562. autoair/static/standalone/assets/DeleteDagDialog-34M_-VDs.js +1 -0
  563. autoair/static/standalone/assets/DeployDialog-Bmxlp79L.js +1 -0
  564. autoair/static/standalone/assets/DialogShell-C5r6WtvG.js +1 -0
  565. autoair/static/standalone/assets/DiffSummary-Zr39j8nA.js +1 -0
  566. autoair/static/standalone/assets/DiffView-CP_QhU9M.js +1 -0
  567. autoair/static/standalone/assets/DuplicateDialog-BO_phlbI.js +1 -0
  568. autoair/static/standalone/assets/GitTokenField-Bru3t4Tf.js +1 -0
  569. autoair/static/standalone/assets/ImportDialog-DkfJwld0.js +2 -0
  570. autoair/static/standalone/assets/JsonBlock-SiTWUrMM.js +1 -0
  571. autoair/static/standalone/assets/LatestVersionSelect-kFrIaZ3a.js +1 -0
  572. autoair/static/standalone/assets/Markdown-BK2CS7tZ.js +32 -0
  573. autoair/static/standalone/assets/NewConnectionDialog-B-6ruvWB.js +1 -0
  574. autoair/static/standalone/assets/OpenDialog-BO3haTDj.js +1 -0
  575. autoair/static/standalone/assets/OperatorParams-DX2f9vNw.js +10 -0
  576. autoair/static/standalone/assets/OperatorTemplateEditor-BWZYgyZu.js +1 -0
  577. autoair/static/standalone/assets/OperatorTemplateInputsDialog-M4zEDHzt.js +1 -0
  578. autoair/static/standalone/assets/PromoteDialog-D-cTrCf7.js +1 -0
  579. autoair/static/standalone/assets/RunsTab-DxGoFXRL.js +1 -0
  580. autoair/static/standalone/assets/SaveOperatorTemplateDialog-BNf4XRQ-.js +1 -0
  581. autoair/static/standalone/assets/SaveTemplateDialog-C8JI9s3R.js +1 -0
  582. autoair/static/standalone/assets/SchemaForm-B7wfZc-P.js +2 -0
  583. autoair/static/standalone/assets/SchemaFormImpl-B23l5mdo.js +64 -0
  584. autoair/static/standalone/assets/SpecDiffReview-BLSHJmaf.js +1 -0
  585. autoair/static/standalone/assets/StateBadge-CvctBkY8.js +1 -0
  586. autoair/static/standalone/assets/StorageDialog-Xj4UQ74B.js +1 -0
  587. autoair/static/standalone/assets/TaskTab-Cnij22Ss.js +2 -0
  588. autoair/static/standalone/assets/TemplatesDialog-B9Hf9mJf.js +3 -0
  589. autoair/static/standalone/assets/TestTaskDialog-PTkninKV.js +1 -0
  590. autoair/static/standalone/assets/TriggerDialog-BGFOiZN6.js +1 -0
  591. autoair/static/standalone/assets/TroubleshootDialog-Cd8xoBkI.js +1 -0
  592. autoair/static/standalone/assets/UnmanagedDialog-Dd_1OQTI.js +1 -0
  593. autoair/static/standalone/assets/UpgradeDialog-C4fclcyt.js +1 -0
  594. autoair/static/standalone/assets/VersionsTab-Dl0rLLuG.js +1 -0
  595. autoair/static/standalone/assets/access-BvpiRteA.js +1 -0
  596. autoair/static/standalone/assets/actions-B_vLX9xD.js +21 -0
  597. autoair/static/standalone/assets/actions-Cqvs60Hb.js +4 -0
  598. autoair/static/standalone/assets/ai-BCD4blVb.js +1 -0
  599. autoair/static/standalone/assets/alert-Boq3W9Fi.js +1 -0
  600. autoair/static/standalone/assets/badge--je1KJr6.js +1 -0
  601. autoair/static/standalone/assets/box-BpnnstkW.js +1 -0
  602. autoair/static/standalone/assets/builder-Bn6CtTVl.js +7 -0
  603. autoair/static/standalone/assets/checkbox-IkAfgwI8.js +1 -0
  604. autoair/static/standalone/assets/close-button-D8lsZ7QE.js +1 -0
  605. autoair/static/standalone/assets/code-BDeW6XpG.js +1 -0
  606. autoair/static/standalone/assets/code-T5thzruT.js +21 -0
  607. autoair/static/standalone/assets/collapsible-73Gu0IlX.js +1 -0
  608. autoair/static/standalone/assets/collapsible.anatomy-QQ8IWoFw.js +1 -0
  609. autoair/static/standalone/assets/config-DYB7bQuD.js +1 -0
  610. autoair/static/standalone/assets/create-slot-recipe-context-CxwVeayd.js +1 -0
  611. autoair/static/standalone/assets/dates-DBqwDcgn.js +1 -0
  612. autoair/static/standalone/assets/dialog-CyKdt4em.js +1 -0
  613. autoair/static/standalone/assets/dist-B474Y4vK.js +1 -0
  614. autoair/static/standalone/assets/dist-Bgv7KlII.js +2 -0
  615. autoair/static/standalone/assets/dist-CyCIcyrd.js +22 -0
  616. autoair/static/standalone/assets/dist-Dth53M4h.js +1 -0
  617. autoair/static/standalone/assets/elk-api-Z7C9yahg.js +1 -0
  618. autoair/static/standalone/assets/equal-D9QoywGU.js +1 -0
  619. autoair/static/standalone/assets/factories-BzDuz5AM.js +12 -0
  620. autoair/static/standalone/assets/factory-BXGO0l9w.js +1 -0
  621. autoair/static/standalone/assets/field-C7PgRyDv.js +1 -0
  622. autoair/static/standalone/assets/field-DNEZExv2.js +1 -0
  623. autoair/static/standalone/assets/fields-C2BsJi9Z.js +1 -0
  624. autoair/static/standalone/assets/flex-XuFAO4Ld.js +1 -0
  625. autoair/static/standalone/assets/for-D1p-wqCI.js +1 -0
  626. autoair/static/standalone/assets/form-DpMFg957.js +1 -0
  627. autoair/static/standalone/assets/formSchema-BVrFgQOe.js +9 -0
  628. autoair/static/standalone/assets/get-styles-CJc5zX7t.js +1 -0
  629. autoair/static/standalone/assets/gitToken-DQDKcdbD.js +1 -0
  630. autoair/static/standalone/assets/grid-CGi9dkBZ.js +1 -0
  631. autoair/static/standalone/assets/group-DZriCpkQ.js +1 -0
  632. autoair/static/standalone/assets/h-stack-i12rBci4.js +1 -0
  633. autoair/static/standalone/assets/heading-b6kMcEi8.js +1 -0
  634. autoair/static/standalone/assets/hooks-CS0jhiGr.js +1 -0
  635. autoair/static/standalone/assets/i18n-Beg4GSgz.js +3 -0
  636. autoair/static/standalone/assets/i18nInstance-DuAUdJZQ.js +1 -0
  637. autoair/static/standalone/assets/icons-TFnRbPpO.js +1 -0
  638. autoair/static/standalone/assets/index-DLioOiRN.css +1 -0
  639. autoair/static/standalone/assets/index-DaMECbok.js +60 -0
  640. autoair/static/standalone/assets/input-BWtzB-ze.js +1 -0
  641. autoair/static/standalone/assets/input-group-BqDpLxpu.js +1 -0
  642. autoair/static/standalone/assets/jinja-Cr9Vy0eN.js +2 -0
  643. autoair/static/standalone/assets/layout-DTftl6J2.js +2 -0
  644. autoair/static/standalone/assets/layout.worker-DnS1sQOV.js +22 -0
  645. autoair/static/standalone/assets/lazy-5XqlXuj6.js +2 -0
  646. autoair/static/standalone/assets/link-L09BNSez.js +1 -0
  647. autoair/static/standalone/assets/lspClient-CDN3BzWl.js +57 -0
  648. autoair/static/standalone/assets/lu-CWw9TCTb.js +1 -0
  649. autoair/static/standalone/assets/markdown-DMf2gzhr.js +2 -0
  650. autoair/static/standalone/assets/memo-XmL7YvR1.js +1 -0
  651. autoair/static/standalone/assets/native-select-BthkwD_X.js +1 -0
  652. autoair/static/standalone/assets/navigate-Bzz39k5L.js +1 -0
  653. autoair/static/standalone/assets/number-CPyQBOKo.js +1 -0
  654. autoair/static/standalone/assets/operatorTemplateEditor-BINV8RNh.js +1 -0
  655. autoair/static/standalone/assets/operatorTemplates-DMyo3BNi.js +1 -0
  656. autoair/static/standalone/assets/params-CerEUOtF.js +1 -0
  657. autoair/static/standalone/assets/popover.anatomy-DVci8hMb.js +1 -0
  658. autoair/static/standalone/assets/preload-helper-CRzLMJPS.js +1 -0
  659. autoair/static/standalone/assets/press-CSEQog_o.js +1 -0
  660. autoair/static/standalone/assets/problemMessages-Co0NoWxc.js +1 -0
  661. autoair/static/standalone/assets/progress-DoXzIeqs.js +1 -0
  662. autoair/static/standalone/assets/radio-group-RbfXJZB3.js +1 -0
  663. autoair/static/standalone/assets/radio-group.machine-DFjBiYjF.js +1 -0
  664. autoair/static/standalone/assets/react-query.gen-Dq5qsG96.js +1 -0
  665. autoair/static/standalone/assets/render-strategy-BOALSe0p.js +1 -0
  666. autoair/static/standalone/assets/resize-observer-ytL3XWdn.js +1 -0
  667. autoair/static/standalone/assets/rolldown-runtime-C0FnF6B9.js +1 -0
  668. autoair/static/standalone/assets/runOverlay-D4x1nfUg.js +1 -0
  669. autoair/static/standalone/assets/runState-DIKBRGrv.js +1 -0
  670. autoair/static/standalone/assets/sdk.gen-Gw52B__2.js +6 -0
  671. autoair/static/standalone/assets/segment-group-DPnmqhjf.js +1 -0
  672. autoair/static/standalone/assets/segment-group.anatomy-jUinQ1jW.js +1 -0
  673. autoair/static/standalone/assets/separator-B9IZTHNG.js +1 -0
  674. autoair/static/standalone/assets/setup-CENVi_oI.js +1 -0
  675. autoair/static/standalone/assets/shallow-CDRXdFb2.js +1 -0
  676. autoair/static/standalone/assets/shell-CKFBo7tG.js +28 -0
  677. autoair/static/standalone/assets/simple-grid-Bb5WfO1x.js +1 -0
  678. autoair/static/standalone/assets/stack-Td53-syC.js +1 -0
  679. autoair/static/standalone/assets/store-D8dgj_pf.js +1 -0
  680. autoair/static/standalone/assets/switch-aDL_eQZK.js +1 -0
  681. autoair/static/standalone/assets/table-DNamAymJ.js +1 -0
  682. autoair/static/standalone/assets/text-CIyPfXsM.js +1 -0
  683. autoair/static/standalone/assets/textarea-DX87rZvx.js +1 -0
  684. autoair/static/standalone/assets/toaster-CFjXuhko.js +1 -0
  685. autoair/static/standalone/assets/use-field-context-B5Yr58zQ.js +1 -0
  686. autoair/static/standalone/assets/useIsDark-CRFU48KL.js +2 -0
  687. autoair/static/standalone/assets/useMutation-B8Wgn5DU.js +1 -0
  688. autoair/static/standalone/assets/useQuery-2ixmv-7W.js +1 -0
  689. autoair/static/standalone/assets/useTranslation-Dzok3Gzo.js +1 -0
  690. autoair/static/standalone/assets/visually-hidden-D7cnxjj8.js +1 -0
  691. autoair/static/standalone/assets/wrap-4VaFdUeF.js +1 -0
  692. autoair/static/standalone/icon.svg +1 -0
  693. autoair/static/standalone/index.html +103 -0
  694. autoair/storage/__init__.py +56 -0
  695. autoair/storage/base.py +327 -0
  696. autoair/storage/config.py +797 -0
  697. autoair/storage/credentials.py +170 -0
  698. autoair/storage/files.py +321 -0
  699. autoair/storage/git/__init__.py +24 -0
  700. autoair/storage/git/azure.py +314 -0
  701. autoair/storage/git/bitbucket.py +271 -0
  702. autoair/storage/git/config.py +114 -0
  703. autoair/storage/git/gitea.py +195 -0
  704. autoair/storage/git/github.py +410 -0
  705. autoair/storage/git/gitlab.py +296 -0
  706. autoair/storage/git/local_git.py +381 -0
  707. autoair/storage/git/provider.py +125 -0
  708. autoair/storage/git/target.py +786 -0
  709. autoair/storage/local.py +205 -0
  710. autoair/storage/object.py +115 -0
  711. autoair/storage/render.py +65 -0
  712. autoair/storage/request_token.py +356 -0
  713. autoair/telemetry.py +76 -0
  714. autoair/templates/__init__.py +541 -0
  715. autoair/templates/builtin.py +434 -0
  716. autoair/validation/__init__.py +1494 -0
  717. autoair/validation/dagbag_check.py +87 -0
  718. autoair/validation/jinja.py +187 -0
  719. autoair/validation/llm.py +66 -0
  720. autoair/validation/opa.py +170 -0
  721. autoair/validation/policy_rules.py +297 -0
  722. autoair/validation/pool.py +423 -0
  723. autoair/validation/pylint.py +98 -0
  724. autoair/validation/raw.py +350 -0
  725. autoair/validation/shell.py +127 -0
  726. autoair-0.1.0.dist-info/METADATA +287 -0
  727. autoair-0.1.0.dist-info/RECORD +731 -0
  728. autoair-0.1.0.dist-info/WHEEL +4 -0
  729. autoair-0.1.0.dist-info/entry_points.txt +6 -0
  730. autoair-0.1.0.dist-info/licenses/LICENSE +202 -0
  731. autoair-0.1.0.dist-info/licenses/NOTICE +20 -0
autoair/__init__.py ADDED
@@ -0,0 +1,3 @@
1
+ """AutoAir — type-safe, extensible no-code DAG builder for Apache Airflow 3."""
2
+
3
+ __version__ = "0.1.0"
autoair/_compat.py ADDED
@@ -0,0 +1,96 @@
1
+ """Airflow version detection and import shims (Airflow >= 3.0)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from functools import lru_cache
6
+ from typing import Any
7
+
8
+
9
+ @lru_cache(maxsize=1)
10
+ def airflow_version() -> tuple[int, int, int] | None:
11
+ """Installed Airflow version, or ``None`` when Airflow is not importable."""
12
+ try:
13
+ from importlib.metadata import version
14
+
15
+ raw = version("apache-airflow-core")
16
+ except Exception:
17
+ try:
18
+ from importlib.metadata import version
19
+
20
+ raw = version("apache-airflow")
21
+ except Exception:
22
+ return None
23
+ parts: list[int] = []
24
+ for piece in raw.split(".")[:3]:
25
+ digits = "".join(ch for ch in piece if ch.isdigit())
26
+ parts.append(int(digits or 0))
27
+ while len(parts) < 3:
28
+ parts.append(0)
29
+ return parts[0], parts[1], parts[2]
30
+
31
+
32
+ def airflow_version_str() -> str | None:
33
+ v = airflow_version()
34
+ return ".".join(map(str, v)) if v else None
35
+
36
+
37
+ def supports_react_apps() -> bool:
38
+ """``react_apps`` / ``external_views`` plugin attributes were added in Airflow 3.1."""
39
+ v = airflow_version()
40
+ return v is not None and v >= (3, 1, 0)
41
+
42
+
43
+ def dagbag_class() -> Any:
44
+ """``DagBag`` moved to ``airflow.dag_processing.dagbag`` in Airflow 3.2."""
45
+ try:
46
+ from airflow.dag_processing.dagbag import DagBag
47
+ except ImportError:
48
+ from airflow.models.dagbag import DagBag
49
+ return DagBag
50
+
51
+
52
+ def base_operator_classes() -> tuple[type, ...]:
53
+ """Operator base classes (in Airflow 3 every operator derives from the Task SDK one)."""
54
+ try:
55
+ from airflow.sdk import BaseOperator
56
+ except ImportError:
57
+ return ()
58
+ return (BaseOperator,)
59
+
60
+
61
+ # Where Task SDK symbols live per Airflow version. Timetables moved into ``airflow.sdk``
62
+ # in 3.2; deadline classes appeared in 3.1 under ``airflow.sdk.definitions.deadline``.
63
+ # Entries: symbol -> [(min_version, module)], newest first.
64
+ _SYMBOL_LOCATIONS: dict[str, list[tuple[tuple[int, int, int], str]]] = {
65
+ **{
66
+ name: [((3, 2, 0), "airflow.sdk"), ((3, 0, 0), module)]
67
+ for name, module in {
68
+ "CronTriggerTimetable": "airflow.timetables.trigger",
69
+ "DeltaTriggerTimetable": "airflow.timetables.trigger",
70
+ "MultipleCronTriggerTimetable": "airflow.timetables.trigger",
71
+ "CronDataIntervalTimetable": "airflow.timetables.interval",
72
+ "DeltaDataIntervalTimetable": "airflow.timetables.interval",
73
+ "EventsTimetable": "airflow.timetables.events",
74
+ "AssetOrTimeSchedule": "airflow.timetables.assets",
75
+ }.items()
76
+ },
77
+ **{
78
+ name: [((3, 2, 0), "airflow.sdk"), ((3, 1, 0), "airflow.sdk.definitions.deadline")]
79
+ for name in ("DeadlineAlert", "DeadlineReference", "AsyncCallback")
80
+ },
81
+ "AssetTriggeredTimetable": [
82
+ ((3, 4, 0), "airflow.sdk"),
83
+ ((3, 0, 0), "airflow.timetables.simple"),
84
+ ],
85
+ }
86
+
87
+ LATEST_KNOWN: tuple[int, int, int] = (3, 4, 0)
88
+
89
+
90
+ def sdk_symbol_module(name: str, version: tuple[int, int, int] | None = None) -> str:
91
+ """Module to import an authoring symbol from for the given (or installed) Airflow."""
92
+ version = version or airflow_version() or LATEST_KNOWN
93
+ for min_version, module in _SYMBOL_LOCATIONS.get(name, []):
94
+ if version >= min_version:
95
+ return module
96
+ return "airflow.sdk"
autoair/_fs.py ADDED
@@ -0,0 +1,46 @@
1
+ """Small filesystem helpers shared by the state stores (templates, icons, settings)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import contextlib
6
+ import os
7
+ import tempfile
8
+ from pathlib import Path
9
+ from typing import Any
10
+
11
+
12
+ def atomic_write_bytes(path: Path, data: bytes) -> None:
13
+ """Write ``path`` so readers see the old or the new content, never a torn file
14
+ (temp file in the same folder + ``os.replace``)."""
15
+ path.parent.mkdir(parents=True, exist_ok=True)
16
+ fd, tmp = tempfile.mkstemp(dir=path.parent, prefix=f".{path.name}.", suffix=".tmp")
17
+ try:
18
+ with os.fdopen(fd, "wb") as fh:
19
+ fh.write(data)
20
+ os.replace(tmp, path)
21
+ except BaseException:
22
+ with contextlib.suppress(OSError):
23
+ os.unlink(tmp)
24
+ raise
25
+
26
+
27
+ def atomic_write_text(path: Path, text: str) -> None:
28
+ atomic_write_bytes(path, text.encode("utf-8"))
29
+
30
+
31
+ def _is_local(fs: Any) -> bool:
32
+ protocol = fs.protocol if isinstance(fs.protocol, (tuple, list)) else (fs.protocol,)
33
+ return "file" in protocol or "local" in protocol
34
+
35
+
36
+ def fs_write_bytes(fs: Any, path: str, data: bytes) -> None:
37
+ """Write through an fsspec filesystem: atomically on local disks (object stores
38
+ replace objects atomically on their own)."""
39
+ if _is_local(fs):
40
+ atomic_write_bytes(Path(path), data)
41
+ return
42
+ fs.makedirs(path.rsplit("/", 1)[0], exist_ok=True)
43
+ fs.pipe_file(path, data)
44
+
45
+
46
+ __all__ = ["atomic_write_bytes", "atomic_write_text", "fs_write_bytes"]
autoair/_subprocess.py ADDED
@@ -0,0 +1,50 @@
1
+ """Environment for child processes that execute user-authored DAG code.
2
+
3
+ Import checks, Python DAG imports and test runs execute code written in the builder (or
4
+ uploaded) on the AutoAir host. Those processes need Airflow's configuration, but never
5
+ AutoAir's own credentials (git tokens, LLM API keys, the collaboration HMAC key...),
6
+ which DAG authors must not be able to read from ``os.environ``.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import os
12
+ import re
13
+ from collections.abc import Mapping
14
+ from functools import lru_cache
15
+
16
+ from autoair.sections import SandboxSettings, active
17
+
18
+
19
+ @lru_cache(maxsize=8)
20
+ def _secret_names(
21
+ patterns: tuple[str, ...], exact: frozenset[str]
22
+ ) -> tuple[tuple[re.Pattern[str], ...], frozenset[str]]:
23
+ return tuple(re.compile(p, re.I) for p in patterns if p), exact
24
+
25
+
26
+ def is_secret_name(name: str) -> bool:
27
+ """``AUTOAIR_*`` settings holding secrets (nested ones included, e.g.
28
+ ``AUTOAIR_STORAGE__GIT__TOKEN``; ``AUTOAIR_SANDBOX__SECRET_ENV_PATTERN``) and provider
29
+ keys read by SDKs directly (``AUTOAIR_SANDBOX__SCRUB_ENV``)."""
30
+ cfg = active(SandboxSettings)
31
+ patterns, exact = _secret_names(
32
+ (cfg.secret_env_pattern, *cfg.secret_env_patterns_extra),
33
+ frozenset(n.upper() for n in (*cfg.scrub_env, *cfg.scrub_env_extra)),
34
+ )
35
+ upper = name.upper()
36
+ return upper in exact or (
37
+ upper.startswith("AUTOAIR_") and any(p.search(upper) for p in patterns)
38
+ )
39
+
40
+
41
+ def user_code_env(
42
+ extra: Mapping[str, str] | None = None, base: Mapping[str, str] | None = None
43
+ ) -> dict[str, str]:
44
+ """``base`` (default ``os.environ``) without AutoAir secrets, plus ``extra``."""
45
+ env = {k: v for k, v in (os.environ if base is None else base).items() if not is_secret_name(k)}
46
+ env.update(extra or {})
47
+ return env
48
+
49
+
50
+ __all__ = ["is_secret_name", "user_code_env"]
autoair/admin.py ADDED
@@ -0,0 +1,238 @@
1
+ """Admin panel back end: users seen, AI usage, pending proposals, cache and database status.
2
+
3
+ The routes live in :mod:`autoair.api.routers.admin`; this module holds the logic so it is
4
+ shared by the API and tests, and works on both state backends (files / SQL database).
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import contextlib
10
+ import csv
11
+ import datetime
12
+ import hashlib
13
+ import io
14
+ import json
15
+ import logging
16
+ import threading
17
+ import time
18
+ from collections.abc import Iterable
19
+ from typing import Any
20
+
21
+ from pydantic import BaseModel, Field
22
+
23
+ from autoair.audit import AuditRecord
24
+ from autoair.persistence import document_store
25
+ from autoair.persistence.documents import DocumentStore
26
+
27
+ log = logging.getLogger("autoair.admin")
28
+
29
+ USER_SEEN_INTERVAL = 300.0 # seconds between two "seen" writes for one user and process
30
+ USAGE_SCAN_LIMIT = 20000 # AI audit records aggregated on the file backend
31
+
32
+
33
+ class SeenUser(BaseModel):
34
+ user: str
35
+ roles: list[str] = Field(default_factory=list, description="AutoAir roles when last seen.")
36
+ permissions: int = Field(default=0, description="Number of AutoAir permissions held.")
37
+ auth: str | None = None
38
+ last_seen: str | None = None
39
+ actions: int = Field(default=0, description="Audit records (recent window).")
40
+ last_action: str | None = None
41
+ last_action_at: str | None = None
42
+
43
+
44
+ class UsageRow(BaseModel):
45
+ user: str | None
46
+ provider: str | None = None
47
+ model: str | None = None
48
+ requests: int = 0
49
+ input_tokens: int = 0
50
+ output_tokens: int = 0
51
+ cost_usd: float | None = None
52
+ errors: int = 0
53
+
54
+
55
+ # --------------------------------------------------------------------------- users seen
56
+
57
+
58
+ def users_store(settings: Any) -> DocumentStore:
59
+ return document_store(settings, "users_seen", file_url=str(settings.state_dir / "users"))
60
+
61
+
62
+ def _user_key(user: str) -> str:
63
+ return hashlib.sha256(user.encode()).hexdigest()[:40]
64
+
65
+
66
+ class SeenUsers:
67
+ """Remembers who used AutoAir and with which roles (throttled per user and process)."""
68
+
69
+ def __init__(self, store: DocumentStore, interval: float = USER_SEEN_INTERVAL) -> None:
70
+ self.store = store
71
+ self.interval = interval
72
+ self._last: dict[str, float] = {}
73
+ self._lock = threading.Lock()
74
+
75
+ def due(self, user: str, now: float | None = None) -> bool:
76
+ now = time.monotonic() if now is None else now
77
+ with self._lock:
78
+ if now - self._last.get(user, -1e18) < self.interval:
79
+ return False
80
+ self._last[user] = now
81
+ if len(self._last) > 10_000:
82
+ self._last.clear()
83
+ return True
84
+
85
+ def record(self, user: str, *, roles: Iterable[str], permissions: int, auth: str) -> None:
86
+ payload = {
87
+ "user": user,
88
+ "roles": sorted(set(roles)),
89
+ "permissions": permissions,
90
+ "auth": auth,
91
+ "last_seen": datetime.datetime.now(datetime.timezone.utc).isoformat(),
92
+ }
93
+ self.store.put(_user_key(user), json.dumps(payload).encode())
94
+
95
+ def all(self) -> list[SeenUser]:
96
+ out: list[SeenUser] = []
97
+ for key in self.store.keys(): # noqa: SIM118 - a DocumentStore, not a dict
98
+ found = self.store.get(key)
99
+ if found is None:
100
+ continue
101
+ try:
102
+ out.append(SeenUser.model_validate_json(found.data))
103
+ except ValueError:
104
+ continue
105
+ return out
106
+
107
+
108
+ def seen_users_for(services: Any) -> SeenUsers:
109
+ existing = getattr(services, "_autoair_seen_users", None)
110
+ if isinstance(existing, SeenUsers):
111
+ return existing
112
+ created = SeenUsers(users_store(services.settings))
113
+ with contextlib.suppress(AttributeError, TypeError):
114
+ services._autoair_seen_users = created
115
+ return created
116
+
117
+
118
+ def users_overview(seen: list[SeenUser], audit: list[AuditRecord]) -> list[SeenUser]:
119
+ """Users seen by the API merged with the users found in ``audit`` (newest first)."""
120
+ by_user: dict[str, SeenUser] = {u.user: u.model_copy() for u in seen}
121
+ for rec in audit:
122
+ if not rec.user:
123
+ continue
124
+ item = by_user.setdefault(rec.user, SeenUser(user=rec.user))
125
+ item.actions += 1
126
+ if item.last_action_at is None or rec.timestamp > item.last_action_at:
127
+ item.last_action_at = rec.timestamp
128
+ item.last_action = rec.action
129
+ return sorted(
130
+ by_user.values(),
131
+ key=lambda u: max(u.last_seen or "", u.last_action_at or ""),
132
+ reverse=True,
133
+ )
134
+
135
+
136
+ # --------------------------------------------------------------------------- audit export
137
+
138
+ CSV_FIELDS = ("timestamp", "action", "user", "dag_id", "details")
139
+
140
+
141
+ def audit_csv(records: Iterable[AuditRecord]) -> str:
142
+ buf = io.StringIO()
143
+ writer = csv.writer(buf)
144
+ writer.writerow(CSV_FIELDS)
145
+ for rec in records:
146
+ writer.writerow(
147
+ [
148
+ rec.timestamp,
149
+ _cell(rec.action),
150
+ _cell(rec.user or ""),
151
+ _cell(rec.dag_id or ""),
152
+ _cell(json.dumps(rec.details, sort_keys=True, default=str)),
153
+ ]
154
+ )
155
+ return buf.getvalue()
156
+
157
+
158
+ def _cell(text: str) -> str:
159
+ """Neutralise spreadsheet formulas (CSV injection): a leading = + - @ becomes text."""
160
+ return f"'{text}" if text[:1] in ("=", "+", "-", "@", "\t", "\r") else text
161
+
162
+
163
+ # --------------------------------------------------------------------------- AI usage
164
+
165
+
166
+ def aggregate_usage(records: Iterable[Any]) -> list[UsageRow]:
167
+ """Requests, tokens and cost per (user, provider, model) of AI audit records."""
168
+ rows: dict[tuple[str | None, str | None, str | None], UsageRow] = {}
169
+ for rec in records:
170
+ key = (rec.user, rec.provider, rec.model)
171
+ row = rows.setdefault(key, UsageRow(user=rec.user, provider=rec.provider, model=rec.model))
172
+ usage = rec.usage
173
+ row.requests += 1
174
+ row.input_tokens += usage.input_tokens + usage.cache_read_tokens + usage.cache_write_tokens
175
+ row.output_tokens += usage.output_tokens
176
+ if usage.cost_usd is not None:
177
+ row.cost_usd = round((row.cost_usd or 0.0) + usage.cost_usd, 8)
178
+ if rec.outcome != "ok":
179
+ row.errors += 1
180
+ return sorted(rows.values(), key=lambda r: (-(r.cost_usd or 0), -r.requests))
181
+
182
+
183
+ def usage_rows(raw: Iterable[dict[str, Any]]) -> list[UsageRow]:
184
+ out = [
185
+ UsageRow(
186
+ user=r.get("user"),
187
+ provider=r.get("provider"),
188
+ model=r.get("model"),
189
+ requests=int(r.get("requests") or 0),
190
+ input_tokens=int(r.get("input_tokens") or 0),
191
+ output_tokens=int(r.get("output_tokens") or 0),
192
+ cost_usd=float(r["cost_usd"]) if r.get("cost_usd") is not None else None,
193
+ errors=int(r.get("errors") or 0),
194
+ )
195
+ for r in raw
196
+ ]
197
+ return sorted(out, key=lambda r: (-(r.cost_usd or 0), -r.requests))
198
+
199
+
200
+ # --------------------------------------------------------------------------- proposals
201
+
202
+
203
+ def all_pending_proposals(store: Any) -> list[Any]:
204
+ """Pending proposals of every DAG (SQL store: one query; file store: a scan)."""
205
+ if store is None:
206
+ return []
207
+ listing = getattr(store, "all_pending", None)
208
+ if callable(listing):
209
+ return list(listing())
210
+ fs = getattr(store, "fs", None)
211
+ root = getattr(store, "root", None)
212
+ if fs is None or root is None:
213
+ return []
214
+ try:
215
+ dirs = fs.ls(root, detail=False)
216
+ except (FileNotFoundError, OSError):
217
+ return []
218
+ out: list[Any] = []
219
+ for path in dirs:
220
+ dag_id = str(path).rstrip("/").rsplit("/", 1)[-1]
221
+ try:
222
+ out.extend(store.pending(dag_id))
223
+ except Exception:
224
+ log.debug("skipping proposals of %s", dag_id, exc_info=True)
225
+ return sorted(out, key=lambda p: p.timestamp, reverse=True)
226
+
227
+
228
+ __all__ = [
229
+ "SeenUser",
230
+ "SeenUsers",
231
+ "UsageRow",
232
+ "aggregate_usage",
233
+ "all_pending_proposals",
234
+ "audit_csv",
235
+ "seen_users_for",
236
+ "usage_rows",
237
+ "users_overview",
238
+ ]
autoair/ai/__init__.py ADDED
@@ -0,0 +1,99 @@
1
+ """AutoAir AI: DAG generation, review / leak scan / optimise / fix features, retrieval
2
+ (RAG), research, writers, guardrails, memory and tool-using agents on pydantic-ai.
3
+
4
+ Everything is imported lazily (PEP 562): ``autoair.settings`` imports
5
+ :mod:`autoair.ai.config` at start-up, and the plugin / server must start without the
6
+ optional ``autoair[ai]`` extra (pydantic-ai).
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import importlib
12
+ from typing import TYPE_CHECKING, Any
13
+
14
+ if TYPE_CHECKING:
15
+ from autoair.ai.findings import Finding, FindingsReport, PatchOp, apply_findings, apply_patch
16
+ from autoair.ai.generator import (
17
+ GenerationResult,
18
+ describe_dag,
19
+ explain_problems,
20
+ generate_spec,
21
+ rank_operators,
22
+ select_operators,
23
+ )
24
+ from autoair.ai.llm import (
25
+ DEFAULT_MODEL,
26
+ LLM,
27
+ ChatMessage,
28
+ LLMError,
29
+ ModelConfig,
30
+ build_embedder,
31
+ build_llm,
32
+ provider_config,
33
+ )
34
+ from autoair.ai.problems import SpecCheck, SpecProblem, check_spec
35
+ from autoair.ai.usage import Usage, track_usage
36
+
37
+ _EXPORTS: dict[str, str] = {
38
+ "Finding": "autoair.ai.findings",
39
+ "FindingsReport": "autoair.ai.findings",
40
+ "PatchOp": "autoair.ai.findings",
41
+ "apply_findings": "autoair.ai.findings",
42
+ "apply_patch": "autoair.ai.findings",
43
+ "GenerationResult": "autoair.ai.generator",
44
+ "describe_dag": "autoair.ai.generator",
45
+ "explain_problems": "autoair.ai.generator",
46
+ "generate_spec": "autoair.ai.generator",
47
+ "rank_operators": "autoair.ai.generator",
48
+ "select_operators": "autoair.ai.generator",
49
+ "DEFAULT_MODEL": "autoair.ai.llm",
50
+ "LLM": "autoair.ai.llm",
51
+ "ChatMessage": "autoair.ai.llm",
52
+ "LLMError": "autoair.ai.llm",
53
+ "ModelConfig": "autoair.ai.llm",
54
+ "build_embedder": "autoair.ai.llm",
55
+ "build_llm": "autoair.ai.llm",
56
+ "provider_config": "autoair.ai.llm",
57
+ "SpecCheck": "autoair.ai.problems",
58
+ "SpecProblem": "autoair.ai.problems",
59
+ "check_spec": "autoair.ai.problems",
60
+ "Usage": "autoair.ai.usage",
61
+ "track_usage": "autoair.ai.usage",
62
+ }
63
+
64
+
65
+ def __getattr__(name: str) -> Any:
66
+ module = _EXPORTS.get(name)
67
+ if module is None:
68
+ raise AttributeError(f"module 'autoair.ai' has no attribute {name!r}")
69
+ value = getattr(importlib.import_module(module), name)
70
+ globals()[name] = value
71
+ return value
72
+
73
+
74
+ __all__ = [
75
+ "DEFAULT_MODEL",
76
+ "LLM",
77
+ "ChatMessage",
78
+ "Finding",
79
+ "FindingsReport",
80
+ "GenerationResult",
81
+ "LLMError",
82
+ "ModelConfig",
83
+ "PatchOp",
84
+ "SpecCheck",
85
+ "SpecProblem",
86
+ "Usage",
87
+ "apply_findings",
88
+ "apply_patch",
89
+ "build_embedder",
90
+ "build_llm",
91
+ "check_spec",
92
+ "describe_dag",
93
+ "explain_problems",
94
+ "generate_spec",
95
+ "provider_config",
96
+ "rank_operators",
97
+ "select_operators",
98
+ "track_usage",
99
+ ]