keboola-cli 0.63.4__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.
- keboola_agent_cli/__init__.py +34 -0
- keboola_agent_cli/__main__.py +5 -0
- keboola_agent_cli/_ui_dist/assets/arc-DhFYIddx.js +2 -0
- keboola_agent_cli/_ui_dist/assets/arc-DhFYIddx.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/architecture-7EHR7CIX-hNCijx_H.js +1 -0
- keboola_agent_cli/_ui_dist/assets/architectureDiagram-3BPJPVTR-C6hUlprM.js +37 -0
- keboola_agent_cli/_ui_dist/assets/architectureDiagram-3BPJPVTR-C6hUlprM.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/array-BifhSqXX.js +2 -0
- keboola_agent_cli/_ui_dist/assets/array-BifhSqXX.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/blockDiagram-GPEHLZMM-DC7qY9i4.js +133 -0
- keboola_agent_cli/_ui_dist/assets/blockDiagram-GPEHLZMM-DC7qY9i4.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/c4Diagram-AAUBKEIU-5Lh44evt.js +11 -0
- keboola_agent_cli/_ui_dist/assets/c4Diagram-AAUBKEIU-5Lh44evt.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/channel-DBMrXlxx.js +2 -0
- keboola_agent_cli/_ui_dist/assets/channel-DBMrXlxx.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-2J33WTMH-Coy82EBh.js +2 -0
- keboola_agent_cli/_ui_dist/assets/chunk-2J33WTMH-Coy82EBh.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-3OPIFGDE-BQC5CRHI.js +63 -0
- keboola_agent_cli/_ui_dist/assets/chunk-3OPIFGDE-BQC5CRHI.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-4BX2VUAB-DUuEt70o.js +2 -0
- keboola_agent_cli/_ui_dist/assets/chunk-4BX2VUAB-DUuEt70o.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-55IACEB6-BvR-6chF.js +2 -0
- keboola_agent_cli/_ui_dist/assets/chunk-55IACEB6-BvR-6chF.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-5ZQYHXKU-BjcTN7ul.js +3 -0
- keboola_agent_cli/_ui_dist/assets/chunk-5ZQYHXKU-BjcTN7ul.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-727SXJPM-C0zxqqRN.js +207 -0
- keboola_agent_cli/_ui_dist/assets/chunk-727SXJPM-C0zxqqRN.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-AQP2D5EJ-CXf7rIlZ.js +232 -0
- keboola_agent_cli/_ui_dist/assets/chunk-AQP2D5EJ-CXf7rIlZ.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-BSJP7CBP-Oj_FO9Q7.js +2 -0
- keboola_agent_cli/_ui_dist/assets/chunk-BSJP7CBP-Oj_FO9Q7.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-CSCIHK7Q-CcTsLrFc.js +124 -0
- keboola_agent_cli/_ui_dist/assets/chunk-CSCIHK7Q-CcTsLrFc.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-FMBD7UC4-FH-zLkkW.js +16 -0
- keboola_agent_cli/_ui_dist/assets/chunk-FMBD7UC4-FH-zLkkW.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-L5ZTLDWV-B1Ky_e7O.js +2 -0
- keboola_agent_cli/_ui_dist/assets/chunk-L5ZTLDWV-B1Ky_e7O.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-ND2GUHAM-BHz1rpbm.js +2 -0
- keboola_agent_cli/_ui_dist/assets/chunk-ND2GUHAM-BHz1rpbm.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-NNHCCRGN-DlpIbxXb.js +160 -0
- keboola_agent_cli/_ui_dist/assets/chunk-NNHCCRGN-DlpIbxXb.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-NZK2D7GU-tnrSoegS.js +2 -0
- keboola_agent_cli/_ui_dist/assets/chunk-NZK2D7GU-tnrSoegS.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-O5CBEL6O-DxxqDH0l.js +71 -0
- keboola_agent_cli/_ui_dist/assets/chunk-O5CBEL6O-DxxqDH0l.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/chunk-QZHKN3VN-CSjc2gjj.js +2 -0
- keboola_agent_cli/_ui_dist/assets/chunk-QZHKN3VN-CSjc2gjj.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/classDiagram-4FO5ZUOK-BuZcZu85.js +2 -0
- keboola_agent_cli/_ui_dist/assets/classDiagram-4FO5ZUOK-BuZcZu85.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/classDiagram-v2-Q7XG4LA2-BuZcZu85.js +2 -0
- keboola_agent_cli/_ui_dist/assets/classDiagram-v2-Q7XG4LA2-BuZcZu85.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/cose-bilkent-S5V4N54A-Y0L8LDMa.js +2 -0
- keboola_agent_cli/_ui_dist/assets/cose-bilkent-S5V4N54A-Y0L8LDMa.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/cytoscape.esm-C8YCVR3_.js +322 -0
- keboola_agent_cli/_ui_dist/assets/cytoscape.esm-C8YCVR3_.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/dagre-BM42HDAG-UZ-9BTqF.js +5 -0
- keboola_agent_cli/_ui_dist/assets/dagre-BM42HDAG-UZ-9BTqF.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/dagre-Bx709z4p.js +2 -0
- keboola_agent_cli/_ui_dist/assets/dagre-Bx709z4p.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/defaultLocale-C8Fc0cco.js +2 -0
- keboola_agent_cli/_ui_dist/assets/defaultLocale-C8Fc0cco.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/diagram-2AECGRRQ-DoDQ60wi.js +44 -0
- keboola_agent_cli/_ui_dist/assets/diagram-2AECGRRQ-DoDQ60wi.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/diagram-5GNKFQAL-CMGFxpUs.js +11 -0
- keboola_agent_cli/_ui_dist/assets/diagram-5GNKFQAL-CMGFxpUs.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/diagram-KO2AKTUF-1uGDa-Iu.js +4 -0
- keboola_agent_cli/_ui_dist/assets/diagram-KO2AKTUF-1uGDa-Iu.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/diagram-LMA3HP47-XtFH7B51.js +25 -0
- keboola_agent_cli/_ui_dist/assets/diagram-LMA3HP47-XtFH7B51.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/diagram-OG6HWLK6-B4_Te1T5.js +25 -0
- keboola_agent_cli/_ui_dist/assets/diagram-OG6HWLK6-B4_Te1T5.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/dist-Di6zmlv0.js +2 -0
- keboola_agent_cli/_ui_dist/assets/dist-Di6zmlv0.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/erDiagram-TEJ5UH35-NjQkrdFt.js +86 -0
- keboola_agent_cli/_ui_dist/assets/erDiagram-TEJ5UH35-NjQkrdFt.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/eventmodeling-FCH6USID-BrJMIks8.js +1 -0
- keboola_agent_cli/_ui_dist/assets/flowDiagram-I6XJVG4X-CIr8DWl7.js +163 -0
- keboola_agent_cli/_ui_dist/assets/flowDiagram-I6XJVG4X-CIr8DWl7.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/ganttDiagram-6RSMTGT7-C1VY_xbQ.js +293 -0
- keboola_agent_cli/_ui_dist/assets/ganttDiagram-6RSMTGT7-C1VY_xbQ.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/gitGraph-WXDBUCRP-COacYjo-.js +1 -0
- keboola_agent_cli/_ui_dist/assets/gitGraphDiagram-PVQCEYII-DQT8-kg2.js +107 -0
- keboola_agent_cli/_ui_dist/assets/gitGraphDiagram-PVQCEYII-DQT8-kg2.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/graphlib-B8gBHxth.js +2 -0
- keboola_agent_cli/_ui_dist/assets/graphlib-B8gBHxth.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/index-CMq50kkV.css +1 -0
- keboola_agent_cli/_ui_dist/assets/index-D8W97DAz.js +118 -0
- keboola_agent_cli/_ui_dist/assets/index-D8W97DAz.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/info-J43DQDTF-DdCTRIzU.js +1 -0
- keboola_agent_cli/_ui_dist/assets/infoDiagram-5YYISTIA-C77rsoTp.js +3 -0
- keboola_agent_cli/_ui_dist/assets/infoDiagram-5YYISTIA-C77rsoTp.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/init-D6jRqBbL.js +2 -0
- keboola_agent_cli/_ui_dist/assets/init-D6jRqBbL.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/ishikawaDiagram-YF4QCWOH-BcTbXaLy.js +71 -0
- keboola_agent_cli/_ui_dist/assets/ishikawaDiagram-YF4QCWOH-BcTbXaLy.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/journeyDiagram-JHISSGLW-BejeAJQ_.js +140 -0
- keboola_agent_cli/_ui_dist/assets/journeyDiagram-JHISSGLW-BejeAJQ_.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/kanban-definition-UN3LZRKU-BRNz_UrH.js +90 -0
- keboola_agent_cli/_ui_dist/assets/kanban-definition-UN3LZRKU-BRNz_UrH.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/katex-C4eR7coU.js +258 -0
- keboola_agent_cli/_ui_dist/assets/katex-C4eR7coU.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/line-CzAQKFbJ.js +2 -0
- keboola_agent_cli/_ui_dist/assets/line-CzAQKFbJ.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/linear-DUNFFdck.js +2 -0
- keboola_agent_cli/_ui_dist/assets/linear-DUNFFdck.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/mermaid-parser.core-CpuBOkFa.js +5 -0
- keboola_agent_cli/_ui_dist/assets/mermaid-parser.core-CpuBOkFa.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/mindmap-definition-RKZ34NQL-9EJQNjH0.js +97 -0
- keboola_agent_cli/_ui_dist/assets/mindmap-definition-RKZ34NQL-9EJQNjH0.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/ordinal-hYBb2elL.js +2 -0
- keboola_agent_cli/_ui_dist/assets/ordinal-hYBb2elL.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/packet-YPE3B663-DLiiw_B2.js +1 -0
- keboola_agent_cli/_ui_dist/assets/path-BWPyau1x.js +2 -0
- keboola_agent_cli/_ui_dist/assets/path-BWPyau1x.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/pie-LRSECV5Y-CRoO8G1g.js +1 -0
- keboola_agent_cli/_ui_dist/assets/pieDiagram-4H26LBE5-XH4cy6Cb.js +31 -0
- keboola_agent_cli/_ui_dist/assets/pieDiagram-4H26LBE5-XH4cy6Cb.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/quadrantDiagram-W4KKPZXB-fdhc93U8.js +8 -0
- keboola_agent_cli/_ui_dist/assets/quadrantDiagram-W4KKPZXB-fdhc93U8.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/radar-GUYGQ44K-DAlLVJHm.js +1 -0
- keboola_agent_cli/_ui_dist/assets/requirementDiagram-4Y6WPE33-a94eP3R9.js +85 -0
- keboola_agent_cli/_ui_dist/assets/requirementDiagram-4Y6WPE33-a94eP3R9.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/rough.esm-CSKSodPl.js +2 -0
- keboola_agent_cli/_ui_dist/assets/rough.esm-CSKSodPl.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/sankeyDiagram-5OEKKPKP-jcBa02sp.js +41 -0
- keboola_agent_cli/_ui_dist/assets/sankeyDiagram-5OEKKPKP-jcBa02sp.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/sequenceDiagram-3UESZ5HK-A5-GGM-e.js +163 -0
- keboola_agent_cli/_ui_dist/assets/sequenceDiagram-3UESZ5HK-A5-GGM-e.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/src-ZI-V_AF0.js +2 -0
- keboola_agent_cli/_ui_dist/assets/src-ZI-V_AF0.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/stateDiagram-AJRCARHV-BKAA5rqE.js +2 -0
- keboola_agent_cli/_ui_dist/assets/stateDiagram-AJRCARHV-BKAA5rqE.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/stateDiagram-v2-BHNVJYJU-DnJwJBsE.js +2 -0
- keboola_agent_cli/_ui_dist/assets/stateDiagram-v2-BHNVJYJU-DnJwJBsE.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/timeline-definition-PNZ67QCA-Cy39jp8b.js +121 -0
- keboola_agent_cli/_ui_dist/assets/timeline-definition-PNZ67QCA-Cy39jp8b.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/treeView-BLDUP644-DbLYl23-.js +1 -0
- keboola_agent_cli/_ui_dist/assets/treemap-LRROVOQU-Bp0eGlOt.js +1 -0
- keboola_agent_cli/_ui_dist/assets/vennDiagram-CIIHVFJN-BGECKubd.js +35 -0
- keboola_agent_cli/_ui_dist/assets/vennDiagram-CIIHVFJN-BGECKubd.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/wardley-L42UT6IY-D4yH4jqS.js +1 -0
- keboola_agent_cli/_ui_dist/assets/wardleyDiagram-YWT4CUSO-D6XRG3cZ.js +79 -0
- keboola_agent_cli/_ui_dist/assets/wardleyDiagram-YWT4CUSO-D6XRG3cZ.js.map +1 -0
- keboola_agent_cli/_ui_dist/assets/xychartDiagram-2RQKCTM6-DRre-pfZ.js +8 -0
- keboola_agent_cli/_ui_dist/assets/xychartDiagram-2RQKCTM6-DRre-pfZ.js.map +1 -0
- keboola_agent_cli/_ui_dist/index.html +50 -0
- keboola_agent_cli/ai_client.py +83 -0
- keboola_agent_cli/auto_update.py +550 -0
- keboola_agent_cli/changelog.py +1198 -0
- keboola_agent_cli/cli.py +448 -0
- keboola_agent_cli/client.py +3422 -0
- keboola_agent_cli/commands/__init__.py +0 -0
- keboola_agent_cli/commands/_data_app_git.py +343 -0
- keboola_agent_cli/commands/_helpers.py +377 -0
- keboola_agent_cli/commands/_metadata_input.py +49 -0
- keboola_agent_cli/commands/_semantic_layer_crud.py +632 -0
- keboola_agent_cli/commands/_semantic_layer_helpers.py +44 -0
- keboola_agent_cli/commands/_semantic_layer_reference_data.py +247 -0
- keboola_agent_cli/commands/agent.py +968 -0
- keboola_agent_cli/commands/branch.py +423 -0
- keboola_agent_cli/commands/changelog.py +168 -0
- keboola_agent_cli/commands/component.py +216 -0
- keboola_agent_cli/commands/config.py +2442 -0
- keboola_agent_cli/commands/context.py +1481 -0
- keboola_agent_cli/commands/data_app.py +1279 -0
- keboola_agent_cli/commands/dev_portal.py +584 -0
- keboola_agent_cli/commands/doctor.py +37 -0
- keboola_agent_cli/commands/encrypt.py +145 -0
- keboola_agent_cli/commands/feature.py +311 -0
- keboola_agent_cli/commands/flow.py +948 -0
- keboola_agent_cli/commands/http_client.py +157 -0
- keboola_agent_cli/commands/init.py +279 -0
- keboola_agent_cli/commands/job.py +661 -0
- keboola_agent_cli/commands/kai.py +301 -0
- keboola_agent_cli/commands/lineage.py +1464 -0
- keboola_agent_cli/commands/org.py +292 -0
- keboola_agent_cli/commands/permissions.py +360 -0
- keboola_agent_cli/commands/project.py +1192 -0
- keboola_agent_cli/commands/repl.py +243 -0
- keboola_agent_cli/commands/schedule.py +340 -0
- keboola_agent_cli/commands/search.py +178 -0
- keboola_agent_cli/commands/semantic_layer.py +939 -0
- keboola_agent_cli/commands/serve.py +272 -0
- keboola_agent_cli/commands/sharing.py +340 -0
- keboola_agent_cli/commands/storage.py +2630 -0
- keboola_agent_cli/commands/stream.py +266 -0
- keboola_agent_cli/commands/sync.py +1277 -0
- keboola_agent_cli/commands/tool.py +206 -0
- keboola_agent_cli/commands/version.py +186 -0
- keboola_agent_cli/commands/workspace.py +635 -0
- keboola_agent_cli/config_store.py +582 -0
- keboola_agent_cli/constants.py +528 -0
- keboola_agent_cli/data_science_client.py +342 -0
- keboola_agent_cli/dev_portal_client.py +323 -0
- keboola_agent_cli/errors.py +248 -0
- keboola_agent_cli/http_base.py +315 -0
- keboola_agent_cli/json_utils.py +126 -0
- keboola_agent_cli/lib.py +536 -0
- keboola_agent_cli/manage_client.py +324 -0
- keboola_agent_cli/metastore_client.py +214 -0
- keboola_agent_cli/models.py +427 -0
- keboola_agent_cli/output.py +1084 -0
- keboola_agent_cli/permissions.py +469 -0
- keboola_agent_cli/py.typed +3 -0
- keboola_agent_cli/result_models.py +271 -0
- keboola_agent_cli/server/__init__.py +34 -0
- keboola_agent_cli/server/agent_runner.py +1289 -0
- keboola_agent_cli/server/agents_store.py +325 -0
- keboola_agent_cli/server/app.py +764 -0
- keboola_agent_cli/server/auth.py +117 -0
- keboola_agent_cli/server/dependencies.py +149 -0
- keboola_agent_cli/server/pricing.py +303 -0
- keboola_agent_cli/server/routers/__init__.py +1 -0
- keboola_agent_cli/server/routers/agents.py +616 -0
- keboola_agent_cli/server/routers/ai_chat.py +129 -0
- keboola_agent_cli/server/routers/branches.py +133 -0
- keboola_agent_cli/server/routers/components.py +48 -0
- keboola_agent_cli/server/routers/configs.py +507 -0
- keboola_agent_cli/server/routers/data_apps.py +384 -0
- keboola_agent_cli/server/routers/dev_portal.py +67 -0
- keboola_agent_cli/server/routers/encrypt.py +35 -0
- keboola_agent_cli/server/routers/feature.py +179 -0
- keboola_agent_cli/server/routers/flows.py +204 -0
- keboola_agent_cli/server/routers/health.py +53 -0
- keboola_agent_cli/server/routers/jobs.py +175 -0
- keboola_agent_cli/server/routers/kai.py +80 -0
- keboola_agent_cli/server/routers/lineage.py +226 -0
- keboola_agent_cli/server/routers/mcp.py +70 -0
- keboola_agent_cli/server/routers/members.py +170 -0
- keboola_agent_cli/server/routers/org.py +96 -0
- keboola_agent_cli/server/routers/projects.py +106 -0
- keboola_agent_cli/server/routers/schedules.py +54 -0
- keboola_agent_cli/server/routers/search.py +30 -0
- keboola_agent_cli/server/routers/semantic_layer.py +650 -0
- keboola_agent_cli/server/routers/sharing.py +86 -0
- keboola_agent_cli/server/routers/storage.py +574 -0
- keboola_agent_cli/server/routers/stream.py +100 -0
- keboola_agent_cli/server/routers/workspaces.py +302 -0
- keboola_agent_cli/server/run_broadcaster.py +329 -0
- keboola_agent_cli/server/sse.py +25 -0
- keboola_agent_cli/services/__init__.py +0 -0
- keboola_agent_cli/services/_encryption.py +217 -0
- keboola_agent_cli/services/_semantic_layer_cascade.py +147 -0
- keboola_agent_cli/services/_semantic_layer_crud.py +382 -0
- keboola_agent_cli/services/_semantic_layer_internals.py +1078 -0
- keboola_agent_cli/services/_semantic_layer_lookup.py +181 -0
- keboola_agent_cli/services/_semantic_layer_reference_data.py +217 -0
- keboola_agent_cli/services/_sync_bindings.py +456 -0
- keboola_agent_cli/services/_sync_branch.py +191 -0
- keboola_agent_cli/services/_sync_bulk.py +228 -0
- keboola_agent_cli/services/_sync_clone.py +163 -0
- keboola_agent_cli/services/_sync_models.py +97 -0
- keboola_agent_cli/services/_sync_push_ops.py +369 -0
- keboola_agent_cli/services/_sync_storage.py +376 -0
- keboola_agent_cli/services/_sync_writeback.py +167 -0
- keboola_agent_cli/services/agent_service.py +458 -0
- keboola_agent_cli/services/base.py +175 -0
- keboola_agent_cli/services/branch_service.py +588 -0
- keboola_agent_cli/services/component_service.py +694 -0
- keboola_agent_cli/services/config_service.py +2099 -0
- keboola_agent_cli/services/data_app_git_service.py +224 -0
- keboola_agent_cli/services/data_app_service.py +2082 -0
- keboola_agent_cli/services/deep_lineage_service.py +1322 -0
- keboola_agent_cli/services/dev_portal_service.py +345 -0
- keboola_agent_cli/services/doctor_service.py +445 -0
- keboola_agent_cli/services/encrypt_service.py +87 -0
- keboola_agent_cli/services/feature_service.py +268 -0
- keboola_agent_cli/services/flow_service.py +769 -0
- keboola_agent_cli/services/flow_validation.py +188 -0
- keboola_agent_cli/services/http_forwarder_service.py +236 -0
- keboola_agent_cli/services/job_idempotency_store.py +285 -0
- keboola_agent_cli/services/job_service.py +797 -0
- keboola_agent_cli/services/kai_service.py +367 -0
- keboola_agent_cli/services/lineage_service.py +274 -0
- keboola_agent_cli/services/mcp_service.py +1498 -0
- keboola_agent_cli/services/mcp_transport.py +259 -0
- keboola_agent_cli/services/member_service.py +593 -0
- keboola_agent_cli/services/org_service.py +619 -0
- keboola_agent_cli/services/project_service.py +947 -0
- keboola_agent_cli/services/repo_validate_service.py +767 -0
- keboola_agent_cli/services/schedule_service.py +731 -0
- keboola_agent_cli/services/search_service.py +331 -0
- keboola_agent_cli/services/semantic_layer_service.py +1497 -0
- keboola_agent_cli/services/sharing_service.py +307 -0
- keboola_agent_cli/services/storage_service.py +2524 -0
- keboola_agent_cli/services/stream_service.py +395 -0
- keboola_agent_cli/services/sync_service.py +2244 -0
- keboola_agent_cli/services/variables_service.py +447 -0
- keboola_agent_cli/services/version_service.py +1038 -0
- keboola_agent_cli/services/workspace_service.py +1103 -0
- keboola_agent_cli/stream_client.py +217 -0
- keboola_agent_cli/sync/__init__.py +1 -0
- keboola_agent_cli/sync/branch_mapping.py +174 -0
- keboola_agent_cli/sync/clone.py +211 -0
- keboola_agent_cli/sync/code_extraction.py +655 -0
- keboola_agent_cli/sync/config_format.py +290 -0
- keboola_agent_cli/sync/diff_engine.py +566 -0
- keboola_agent_cli/sync/git_utils.py +93 -0
- keboola_agent_cli/sync/manifest.py +162 -0
- keboola_agent_cli/sync/naming.py +90 -0
- keboola_agent_cli/sync/secrets.py +62 -0
- keboola_agent_cli/sync/sql_split.py +134 -0
- keboola_cli-0.63.4.dist-info/METADATA +308 -0
- keboola_cli-0.63.4.dist-info/RECORD +306 -0
- keboola_cli-0.63.4.dist-info/WHEEL +4 -0
- keboola_cli-0.63.4.dist-info/entry_points.txt +2 -0
|
@@ -0,0 +1,528 @@
|
|
|
1
|
+
"""Shared constants for Keboola Agent CLI.
|
|
2
|
+
|
|
3
|
+
All magic numbers, default values, retry parameters, timeout settings,
|
|
4
|
+
and environment variable names are centralized here to avoid duplication
|
|
5
|
+
and ensure consistency across the codebase.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
9
|
+
|
|
10
|
+
import httpx
|
|
11
|
+
|
|
12
|
+
# --- Application identity ---
|
|
13
|
+
# Distribution name used for the importlib.metadata version lookup and the
|
|
14
|
+
# User-Agent product token that signs every Keboola API call.
|
|
15
|
+
#
|
|
16
|
+
# Resolved DYNAMICALLY so one codebase runs correctly under BOTH the current
|
|
17
|
+
# distribution (`keboola-cli`) and the legacy pre-0.63 name
|
|
18
|
+
# (`keboola-agent-cli`). The PyPI rename (#424) ships a migration-bridge wheel
|
|
19
|
+
# under the legacy name so already-installed <=0.62 users self-update in place;
|
|
20
|
+
# under that distribution `version("keboola-cli")` raises PackageNotFoundError,
|
|
21
|
+
# which would break `kbagent version` if APP_NAME were a fixed literal.
|
|
22
|
+
#
|
|
23
|
+
# NOTE: this is the PyPI/distribution identity ONLY. The on-disk config dir
|
|
24
|
+
# (`~/.config/keboola-agent-cli/`) is a SEPARATE fixed literal in
|
|
25
|
+
# config_store.py -- it must not move with the distribution name or existing
|
|
26
|
+
# users would lose their config location.
|
|
27
|
+
APP_NAME_CANDIDATES: tuple[str, ...] = ("keboola-cli", "keboola-agent-cli")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _resolve_app_name() -> str:
|
|
31
|
+
"""Return the installed distribution name, preferring the current one.
|
|
32
|
+
|
|
33
|
+
Falls back to the first (current) candidate when neither is importable --
|
|
34
|
+
an editable/source checkout without built metadata -- so callers always get
|
|
35
|
+
a stable product token.
|
|
36
|
+
"""
|
|
37
|
+
for name in APP_NAME_CANDIDATES:
|
|
38
|
+
try:
|
|
39
|
+
version(name)
|
|
40
|
+
return name
|
|
41
|
+
except PackageNotFoundError:
|
|
42
|
+
continue
|
|
43
|
+
return APP_NAME_CANDIDATES[0]
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
APP_NAME: str = _resolve_app_name()
|
|
47
|
+
|
|
48
|
+
# --- Sentinel for missing metadata keys ---
|
|
49
|
+
# Distinguishes "key absent" from "value is None/null" in branch metadata lookups.
|
|
50
|
+
METADATA_NOT_FOUND = object()
|
|
51
|
+
|
|
52
|
+
# --- HTTP Retry Constants ---
|
|
53
|
+
RETRYABLE_STATUS_CODES: set[int] = {429, 500, 502, 503, 504}
|
|
54
|
+
MAX_RETRIES: int = 3
|
|
55
|
+
BACKOFF_BASE: float = 1.0 # seconds; delays: 1s, 2s, 4s
|
|
56
|
+
|
|
57
|
+
# --- HTTP Timeout ---
|
|
58
|
+
DEFAULT_TIMEOUT: httpx.Timeout = httpx.Timeout(connect=5.0, read=30.0, write=10.0, pool=5.0)
|
|
59
|
+
|
|
60
|
+
# --- API Error Handling ---
|
|
61
|
+
MAX_API_ERROR_LENGTH: int = 500
|
|
62
|
+
|
|
63
|
+
# --- Developer Portal MFA ---
|
|
64
|
+
# Challenge type sent on the second `/auth/login` step (after the first call
|
|
65
|
+
# returns a `session` token). The apiary spec documents `SOFTWARE_TOKEN_MFA`
|
|
66
|
+
# (TOTP authenticator app) as the default and `SMS_MFA` as the only other
|
|
67
|
+
# member, but in practice the server 404s when the field is omitted, so we
|
|
68
|
+
# send it explicitly. If apps-api ever adds a third member (e.g. EMAIL_OTP),
|
|
69
|
+
# wire it in here and add a per-identity `mfa_challenge` field.
|
|
70
|
+
DP_MFA_CHALLENGE_TYPE: str = "SOFTWARE_TOKEN_MFA"
|
|
71
|
+
|
|
72
|
+
# --- UNEXPECTED_ERROR truncation ---
|
|
73
|
+
# Unhandled ``Exception`` messages surfaced to per-project error envelopes are
|
|
74
|
+
# truncated to this many characters before being returned. Exceptions can
|
|
75
|
+
# otherwise embed URLs with query params, response-buffer fragments, or, with
|
|
76
|
+
# ``--with-state``, OAuth refresh tokens from the runtime state dict. CWE-209.
|
|
77
|
+
UNEXPECTED_ERROR_MAX_MESSAGE_LEN: int = 256
|
|
78
|
+
|
|
79
|
+
# --- Default Stack URL ---
|
|
80
|
+
DEFAULT_STACK_URL: str = "https://connection.keboola.com"
|
|
81
|
+
|
|
82
|
+
# --- Token Description ---
|
|
83
|
+
DEFAULT_TOKEN_DESCRIPTION: str = "kbagent-cli"
|
|
84
|
+
|
|
85
|
+
# --- Project Member Roles ---
|
|
86
|
+
# Allowed values for project membership / invitation `role` field. Lifted from
|
|
87
|
+
# the Manage API's own validation error: `Role "X" is not valid. Allowed roles
|
|
88
|
+
# are: admin, guest, readOnly, share`. Verified empirically 2026-05-01 against
|
|
89
|
+
# connection.us-east4.gcp.keboola.com. If the API ever extends the list, the
|
|
90
|
+
# fix is to extend this tuple -- the engine already returns the new options in
|
|
91
|
+
# its validation error message.
|
|
92
|
+
PROJECT_ROLES: tuple[str, ...] = ("admin", "guest", "readOnly", "share")
|
|
93
|
+
|
|
94
|
+
# --- Bulk Invite Defaults ---
|
|
95
|
+
DEFAULT_INVITE_WORKERS: int = 8
|
|
96
|
+
|
|
97
|
+
# --- Job Limits ---
|
|
98
|
+
DEFAULT_JOB_LIMIT: int = 50
|
|
99
|
+
DEFAULT_JOBS_PER_CONFIG: int = 5
|
|
100
|
+
# Max groups: constrained by API rule jobsPerGroup * limit <= 500
|
|
101
|
+
DEFAULT_GROUPED_JOBS_LIMIT: int = 100
|
|
102
|
+
MAX_JOB_LIMIT: int = 500
|
|
103
|
+
|
|
104
|
+
# --- Retry-After Header ---
|
|
105
|
+
MAX_RETRY_AFTER_SECONDS: int = 60
|
|
106
|
+
|
|
107
|
+
# --- MCP Timeouts ---
|
|
108
|
+
DEFAULT_MCP_TOOL_TIMEOUT: int = 60
|
|
109
|
+
DEFAULT_MCP_INIT_TIMEOUT: int = 30
|
|
110
|
+
|
|
111
|
+
# --- MCP Concurrency ---
|
|
112
|
+
# 0 = unlimited (all projects run in parallel); set KBAGENT_MCP_MAX_SESSIONS to throttle
|
|
113
|
+
DEFAULT_MCP_MAX_SESSIONS: int = 0
|
|
114
|
+
|
|
115
|
+
# --- MCP HTTP Transport ---
|
|
116
|
+
# Transport mode: "http" (persistent server) or "stdio" (subprocess per call)
|
|
117
|
+
ENV_MCP_TRANSPORT: str = "KBAGENT_MCP_TRANSPORT"
|
|
118
|
+
DEFAULT_MCP_TRANSPORT: str = "stdio"
|
|
119
|
+
# Timeout for the persistent MCP server to start and be healthy
|
|
120
|
+
MCP_SERVER_STARTUP_TIMEOUT: float = 15.0
|
|
121
|
+
# Timeout for health check requests to persistent MCP server
|
|
122
|
+
MCP_SERVER_HEALTH_TIMEOUT: float = 2.0
|
|
123
|
+
|
|
124
|
+
# --- Storage Job Polling ---
|
|
125
|
+
STORAGE_JOB_POLL_INTERVAL: float = 1.0 # seconds between polls
|
|
126
|
+
STORAGE_JOB_MAX_WAIT: float = 60.0 # max seconds to wait for a storage job
|
|
127
|
+
IMPORT_JOB_MAX_WAIT: float = 600.0 # 10 min for table import jobs (large files)
|
|
128
|
+
|
|
129
|
+
# --- Queue Job Polling ---
|
|
130
|
+
# Piecewise curve matching FIIA's existing Queue API polling contract
|
|
131
|
+
# (same cadence as the official keboola-as-code Go CLI): fast initial polls
|
|
132
|
+
# to catch short jobs, then relax so multi-hour orchestrations don't spam
|
|
133
|
+
# the API. Each tuple is (interval_seconds, max_polls_at_this_interval);
|
|
134
|
+
# count=0 means "continue at this interval indefinitely" (only valid on the
|
|
135
|
+
# last segment). Total first-phase time: 2s * 30 + 5s * 48 = 300s = 5 min,
|
|
136
|
+
# after which we settle at 15s forever.
|
|
137
|
+
JOB_POLL_CURVE: tuple[tuple[float, int], ...] = (
|
|
138
|
+
(2.0, 30),
|
|
139
|
+
(5.0, 48),
|
|
140
|
+
(15.0, 0),
|
|
141
|
+
)
|
|
142
|
+
VALID_POLL_STRATEGIES: frozenset[str] = frozenset({"exponential", "fixed"})
|
|
143
|
+
DEFAULT_POLL_STRATEGY: str = "exponential"
|
|
144
|
+
# Queue API "mode" body field for job creation. "run" is the normal execution
|
|
145
|
+
# path (writes to mapped output tables); "debug" runs the component the same
|
|
146
|
+
# way but redirects the output to a Storage File tagged "debug-" + the job id
|
|
147
|
+
# instead of into destination buckets. Useful for dry-runs and reproducing
|
|
148
|
+
# failures without touching production tables.
|
|
149
|
+
VALID_JOB_MODES: frozenset[str] = frozenset({"run", "debug"})
|
|
150
|
+
DEFAULT_JOB_MODE: str = "run"
|
|
151
|
+
# Client-side job idempotency store (issue #427). Lives in the config-dir
|
|
152
|
+
# alongside config.json; maps idempotency_key -> prior job so a replayed
|
|
153
|
+
# `kbagent job run --idempotency-key` does not fire a duplicate side effect.
|
|
154
|
+
JOB_IDEMPOTENCY_FILENAME: str = "job_idempotency.json"
|
|
155
|
+
# Default log-tail length surfaced on FAILED/WARNING/TERMINATED jobs.
|
|
156
|
+
DEFAULT_LOG_TAIL_LINES: int = 200
|
|
157
|
+
# Upper bound to prevent accidentally pulling tens of thousands of events
|
|
158
|
+
# from a long-running job.
|
|
159
|
+
MAX_LOG_TAIL_LINES: int = 5000
|
|
160
|
+
# Seconds to wait after issuing kill_job() during timeout-cancellation for
|
|
161
|
+
# the job to transition to a terminal state before we return.
|
|
162
|
+
JOB_TERMINATE_GRACE_SECONDS: float = 10.0
|
|
163
|
+
# Poll cadence while waiting inside the terminate grace window; capped so we
|
|
164
|
+
# never overshoot the deadline by more than one interval on latency-sensitive
|
|
165
|
+
# callers (see _terminate_and_wait in services/job_service.py).
|
|
166
|
+
JOB_TERMINATE_POLL_INTERVAL: float = 1.0
|
|
167
|
+
|
|
168
|
+
# --- File Upload Timeout ---
|
|
169
|
+
FILE_UPLOAD_TIMEOUT: httpx.Timeout = httpx.Timeout(
|
|
170
|
+
connect=30.0, read=300.0, write=3600.0, pool=30.0
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
# --- File Download Timeout ---
|
|
174
|
+
FILE_DOWNLOAD_TIMEOUT: httpx.Timeout = httpx.Timeout(
|
|
175
|
+
connect=30.0, read=3600.0, write=10.0, pool=30.0
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
# --- File Download Streaming ---
|
|
179
|
+
# Chunk size for streamed downloads. Bounded buffer keeps peak RSS small even
|
|
180
|
+
# for multi-GB tables (see GitHub issue #187: 200MB parquet slices OOM'd on 2GB RAM
|
|
181
|
+
# hosts when loaded whole-body via response.content).
|
|
182
|
+
FILE_DOWNLOAD_CHUNK_SIZE: int = 1024 * 1024 # 1 MiB
|
|
183
|
+
|
|
184
|
+
# --- Export Job ---
|
|
185
|
+
EXPORT_JOB_MAX_WAIT: float = 600.0 # 10 min for table export jobs (large tables)
|
|
186
|
+
|
|
187
|
+
# --- Parallel Workers ---
|
|
188
|
+
MAX_PARALLEL_WORKERS_LIMIT: int = 100
|
|
189
|
+
|
|
190
|
+
# --- Config Resolution ---
|
|
191
|
+
ENV_CONFIG_DIR: str = "KBAGENT_CONFIG_DIR"
|
|
192
|
+
LOCAL_CONFIG_DIR_NAME: str = ".kbagent"
|
|
193
|
+
|
|
194
|
+
# --- Project Pin ---
|
|
195
|
+
# Overrides the persisted `default_project` pin for a single invocation/session.
|
|
196
|
+
ENV_KBAGENT_PROJECT: str = "KBAGENT_PROJECT"
|
|
197
|
+
|
|
198
|
+
# --- Headless / env-only project (issue #359) ---
|
|
199
|
+
# Opt-in flag that makes ConfigStore synthesize an in-memory project from
|
|
200
|
+
# KBC_TOKEN + KBC_STORAGE_API_URL, so a daemon / container / CI can run kbagent
|
|
201
|
+
# (CLI or `serve`) with no `kbagent project add` and no config.json on disk.
|
|
202
|
+
# Explicit opt-in (not mere presence of KBC_TOKEN) avoids a phantom project
|
|
203
|
+
# surprising a dev who exported KBC_TOKEN only for `kbagent project add`.
|
|
204
|
+
ENV_PROJECT_FROM_ENV: str = "KBAGENT_PROJECT_FROM_ENV"
|
|
205
|
+
# Reserved alias for the synthesized project. Double-underscore marks it as a
|
|
206
|
+
# synthetic, never-persisted entry that cannot collide with a user alias.
|
|
207
|
+
ENV_PROJECT_ALIAS: str = "__env__"
|
|
208
|
+
|
|
209
|
+
# --- Environment Variable Names ---
|
|
210
|
+
ENV_MAX_PARALLEL_WORKERS: str = "KBAGENT_MAX_PARALLEL_WORKERS"
|
|
211
|
+
ENV_KBC_TOKEN: str = "KBC_TOKEN"
|
|
212
|
+
ENV_KBC_STORAGE_API_URL: str = "KBC_STORAGE_API_URL"
|
|
213
|
+
ENV_KBC_MANAGE_API_TOKEN: str = "KBC_MANAGE_API_TOKEN"
|
|
214
|
+
ENV_KBC_MASTER_TOKEN: str = "KBC_MASTER_TOKEN"
|
|
215
|
+
ENV_MCP_TOOL_TIMEOUT: str = "KBAGENT_MCP_TOOL_TIMEOUT"
|
|
216
|
+
ENV_MCP_INIT_TIMEOUT: str = "KBAGENT_MCP_INIT_TIMEOUT"
|
|
217
|
+
ENV_MCP_MAX_SESSIONS: str = "KBAGENT_MCP_MAX_SESSIONS"
|
|
218
|
+
ENV_CONVERSATION_ID: str = "KBAGENT_CONVERSATION_ID"
|
|
219
|
+
|
|
220
|
+
# --- Serve subprocess context (since v0.7.x) ---
|
|
221
|
+
# Injected by `kbagent serve` into scheduled-agent subprocess env so AI CLIs
|
|
222
|
+
# (claude / codex / gemini) and plain `kbagent` invocations can talk to the
|
|
223
|
+
# live HTTP API instead of reading possibly-stale local config. Pair them:
|
|
224
|
+
# ENV_KBAGENT_SERVE_URL points at the FastAPI bind URL and ENV_KBAGENT_SERVE_TOKEN
|
|
225
|
+
# is the bearer token printed at serve startup. Used by `kbagent http <verb>`.
|
|
226
|
+
ENV_KBAGENT_SERVE_URL: str = "KBAGENT_SERVE_URL"
|
|
227
|
+
ENV_KBAGENT_SERVE_TOKEN: str = "KBAGENT_SERVE_TOKEN"
|
|
228
|
+
|
|
229
|
+
# --- AI-agent extra_args opt-in (since 0.60.2) ---
|
|
230
|
+
# extra_args on an ai_agent task are passed verbatim to the AI CLI, so they can
|
|
231
|
+
# carry rail-disabling flags (permission-skip / unrestricted-exec). They are
|
|
232
|
+
# IGNORED unless the serve operator opts in by setting this to a truthy value
|
|
233
|
+
# (1/true/yes/on) -- mirroring the --allow-env-manage-token opt-in. See
|
|
234
|
+
# GHSA-777j-6p95-qv3m.
|
|
235
|
+
ENV_ALLOW_AI_EXTRA_ARGS: str = "KBAGENT_ALLOW_AI_EXTRA_ARGS"
|
|
236
|
+
|
|
237
|
+
# --- Upstream-chain context (set when a task is triggered as a downstream) ---
|
|
238
|
+
# Populated only on runs spawned by another task's ``trigger`` field; absent
|
|
239
|
+
# on cron-driven or manually-invoked runs. AI agents read these to fetch the
|
|
240
|
+
# upstream output via `kbagent http get /agents/<task>/runs/<run>`.
|
|
241
|
+
ENV_KBAGENT_UPSTREAM_TASK_ID: str = "KBAGENT_UPSTREAM_TASK_ID"
|
|
242
|
+
ENV_KBAGENT_UPSTREAM_RUN_ID: str = "KBAGENT_UPSTREAM_RUN_ID"
|
|
243
|
+
ENV_KBAGENT_UPSTREAM_STATUS: str = "KBAGENT_UPSTREAM_STATUS"
|
|
244
|
+
|
|
245
|
+
# Default timeout for `kbagent http` requests. AI agents poll endpoints
|
|
246
|
+
# during multi-step tasks; long enough for slow Storage table listings,
|
|
247
|
+
# short enough to fail fast on a dead serve.
|
|
248
|
+
HTTP_DEFAULT_TIMEOUT: float = 60.0
|
|
249
|
+
|
|
250
|
+
# --- AI helper subprocess timeouts (seconds) ---
|
|
251
|
+
# Each of the three stateless AI helpers spawns a local claude / codex /
|
|
252
|
+
# gemini CLI via stream_ai_agent_events; these caps protect against a stuck
|
|
253
|
+
# CLI camping on the SSE connection. Centralised here so they stay
|
|
254
|
+
# governable from one place instead of three router files.
|
|
255
|
+
#
|
|
256
|
+
# - Prompt helper: rewrite a draft prompt for a scheduled agent. Short
|
|
257
|
+
# single-turn task, no tool calls expected -> 180s.
|
|
258
|
+
# - SQL helper: write workspace SQL. May round-trip through
|
|
259
|
+
# `kbagent storage bucket-detail` + INFORMATION_SCHEMA queries -> 180s.
|
|
260
|
+
# - Chat helper: generic Local AI co-pilot. Can involve several tool
|
|
261
|
+
# invocations + a longer summary -> 300s, matching the longest
|
|
262
|
+
# credible single-turn budget without leaving stuck connections open.
|
|
263
|
+
AI_PROMPT_HELPER_TIMEOUT: float = 180.0
|
|
264
|
+
AI_SQL_HELPER_TIMEOUT: float = 180.0
|
|
265
|
+
AI_CHAT_HELPER_TIMEOUT: float = 300.0
|
|
266
|
+
|
|
267
|
+
# --- Version Check ---
|
|
268
|
+
VERSION_CHECK_TIMEOUT: float = 4.0 # seconds for fetching latest version from remote
|
|
269
|
+
MCP_PYPI_URL: str = "https://pypi.org/pypi/keboola-mcp-server/json"
|
|
270
|
+
KBAGENT_GITHUB_REPO: str = "keboola/cli"
|
|
271
|
+
KBAGENT_INSTALL_SOURCE: str = "git+https://github.com/keboola/cli"
|
|
272
|
+
|
|
273
|
+
# --- MCP self-upgrade (since v0.30.1) ---
|
|
274
|
+
# Subprocess timeout for the `keboola_mcp_server --version` probe and the
|
|
275
|
+
# `uv tool list` install-method probe. These are local subprocess calls,
|
|
276
|
+
# so 5s leaves plenty of headroom for cold-start CPython without slowing
|
|
277
|
+
# kbagent startup observably.
|
|
278
|
+
MCP_PROBE_TIMEOUT: float = 5.0
|
|
279
|
+
# Subprocess timeout for the actual upgrade command (`uv tool upgrade` /
|
|
280
|
+
# `pip install -U` / `uvx --refresh`). Network bound; 180s tolerates a
|
|
281
|
+
# slow PyPI link plus the worst-case dependency-resolution cost.
|
|
282
|
+
MCP_UPGRADE_TIMEOUT: float = 180.0
|
|
283
|
+
# Pre-release opt-in flags for installing/upgrading keboola-mcp-server (#324).
|
|
284
|
+
#
|
|
285
|
+
# keboola-mcp-server >= 1.55.0 declares a pre-release-only transitive
|
|
286
|
+
# dependency: ``toon-format~=0.9.0b1``. On PyPI ``toon-format`` ships exactly
|
|
287
|
+
# two releases -- ``0.1.0`` (stable) and ``0.9.0b1`` (pre-release) -- so the
|
|
288
|
+
# ``~=0.9.0b1`` constraint can ONLY be satisfied by the pre-release.
|
|
289
|
+
#
|
|
290
|
+
# uv refuses pre-releases by default. Crucially, ``--prerelease=if-necessary``
|
|
291
|
+
# does NOT help here: a *stable* toon-format (0.1.0) exists, so uv decides a
|
|
292
|
+
# pre-release is "not necessary", then fails because 0.1.0 violates the pin.
|
|
293
|
+
# Only ``--prerelease=allow`` resolves it (verified empirically, uv 0.10.x).
|
|
294
|
+
# Without the flag ``uv tool upgrade``/``install`` silently backtracks to the
|
|
295
|
+
# last MCP release predating the pin (v1.32.0) and exits 0 -- pinning the
|
|
296
|
+
# fleet to a stale server while reporting a newer version is "available".
|
|
297
|
+
#
|
|
298
|
+
# Scoped to the MCP environment only; never affects the kbagent self-update
|
|
299
|
+
# channel (which stays stable-only unless --beta).
|
|
300
|
+
MCP_UV_PRERELEASE_FLAG: str = "--prerelease=allow"
|
|
301
|
+
MCP_PIP_PRERELEASE_FLAG: str = "--pre"
|
|
302
|
+
|
|
303
|
+
# --- Auto-Update ---
|
|
304
|
+
ENV_AUTO_UPDATE: str = "KBAGENT_AUTO_UPDATE"
|
|
305
|
+
ENV_SKIP_UPDATE: str = "KBAGENT_SKIP_UPDATE"
|
|
306
|
+
AUTO_UPDATE_CHECK_INTERVAL: int = 3600 # 1 hour TTL for version cache
|
|
307
|
+
VERSION_CACHE_FILENAME: str = "version_cache.json"
|
|
308
|
+
# Self-update subprocess timeout. Previously a hardcoded 120s in two places,
|
|
309
|
+
# which falsely tripped on WSL where the git+ source build (npm/React SPA) runs
|
|
310
|
+
# for minutes (issue #353). The prebuilt-wheel install is a seconds download, so
|
|
311
|
+
# 300s is ample; KBAGENT_UPDATE_TIMEOUT raises it for the slow git+ fallback.
|
|
312
|
+
UPDATE_TIMEOUT_SECONDS: int = 300
|
|
313
|
+
ENV_UPDATE_TIMEOUT: str = "KBAGENT_UPDATE_TIMEOUT"
|
|
314
|
+
|
|
315
|
+
# --- AI Service ---
|
|
316
|
+
AI_SERVICE_TIMEOUT: httpx.Timeout = httpx.Timeout(connect=5.0, read=15.0, write=5.0, pool=5.0)
|
|
317
|
+
|
|
318
|
+
# --- Data Streams (Stream API) ---
|
|
319
|
+
# The Stream control-plane API lives on a separate host derived from the
|
|
320
|
+
# Storage URL by replacing 'connection.' with 'stream.' (same scheme as
|
|
321
|
+
# 'ai.'/'queue.'), authenticated with the Storage API token (X-StorageApi-Token).
|
|
322
|
+
# The OTLP *ingestion* endpoint (stream-in.<region>/otlp/...) is NOT derived --
|
|
323
|
+
# it is returned by the API in the source's `otlp.url` field.
|
|
324
|
+
STREAM_API_TIMEOUT: httpx.Timeout = httpx.Timeout(connect=5.0, read=30.0, write=10.0, pool=5.0)
|
|
325
|
+
# Branch ref used by the Stream API path /v1/branches/<branch>/...; "default"
|
|
326
|
+
# targets the project's default (production) branch.
|
|
327
|
+
STREAM_DEFAULT_BRANCH: str = "default"
|
|
328
|
+
# Source/delete operations return an async Task; poll GET /v1/tasks/<id> until
|
|
329
|
+
# `isFinished`. Interval between polls and the overall ceiling.
|
|
330
|
+
STREAM_TASK_POLL_INTERVAL: float = 1.0 # seconds between task polls
|
|
331
|
+
STREAM_TASK_TIMEOUT: float = 60.0 # max seconds to wait for a Stream task
|
|
332
|
+
# OTLP/HTTP per-signal sub-paths appended to the source's base endpoint, and the
|
|
333
|
+
# wire protocol every OTLP source speaks. Surfaced by `kbagent stream detail`.
|
|
334
|
+
OTLP_SIGNAL_PATHS: tuple[str, ...] = ("v1/logs", "v1/traces", "v1/metrics")
|
|
335
|
+
OTLP_PROTOCOL: str = "http/protobuf"
|
|
336
|
+
# Signals (and their destination table names) auto-provisioned for an OTLP source.
|
|
337
|
+
# Creating a source via the raw Stream API does NOT create sinks, so kbagent
|
|
338
|
+
# provisions one table sink per signal (matching the Keboola UI) so data actually
|
|
339
|
+
# lands. Bucket = OTLP_BUCKET_PREFIX + sourceId; table = the signal name.
|
|
340
|
+
OTLP_SINK_SIGNALS: tuple[str, ...] = ("logs", "metrics", "traces")
|
|
341
|
+
OTLP_BUCKET_PREFIX: str = "in.c-otlp-"
|
|
342
|
+
# Universal, signal-agnostic sink mapping: an auto id, the ingest datetime, and a
|
|
343
|
+
# `body` column that captures the full flattened OTLP record as JSON. Users can
|
|
344
|
+
# refine per-signal column mappings in the Keboola UI afterwards.
|
|
345
|
+
OTLP_SINK_COLUMNS: tuple[dict[str, str], ...] = (
|
|
346
|
+
{"type": "uuid", "name": "id"},
|
|
347
|
+
{"type": "datetime", "name": "datetime"},
|
|
348
|
+
{"type": "body", "name": "body"},
|
|
349
|
+
)
|
|
350
|
+
|
|
351
|
+
# --- Project Feature Flags ---
|
|
352
|
+
# `storage-branches` enables the modern dev-branch storage isolation:
|
|
353
|
+
# transformation runner / output-mapping consult bucket metadata
|
|
354
|
+
# (KBC.createdBy.branch.id) and use the /v2/storage/branch/<id>/* endpoints.
|
|
355
|
+
# Projects WITHOUT this feature still accept POST /v2/storage/branch/<id>/buckets,
|
|
356
|
+
# but the runner ignores those buckets and creates parallel `out.c-<branch_id>-*`
|
|
357
|
+
# buckets in the default branch (legacy "fake-branch" path). kbagent's
|
|
358
|
+
# branch-aware writes surface a `legacy_branch_storage: true` flag on such
|
|
359
|
+
# projects so callers know the materialized bucket will be unused by the runner.
|
|
360
|
+
# See plugins/kbagent/skills/kbagent/references/storage-types-workflow.md.
|
|
361
|
+
STORAGE_BRANCHES_FEATURE: str = "storage-branches"
|
|
362
|
+
|
|
363
|
+
# --- Global Search ---
|
|
364
|
+
# Feature flag that gates the Storage API ``GET /v2/storage/global-search``
|
|
365
|
+
# endpoint used by ``kbagent search`` (textual mode). Projects without this
|
|
366
|
+
# flag receive a 404; ``SearchService`` checks the flag pre-flight and
|
|
367
|
+
# returns a descriptive per-project error rather than letting the raw 404
|
|
368
|
+
# bubble up.
|
|
369
|
+
GLOBAL_SEARCH_FEATURE: str = "global-search"
|
|
370
|
+
|
|
371
|
+
# --- OAuth ---
|
|
372
|
+
# Host of the Keboola-hosted OAuth wizard used by ``kbagent config oauth-url``.
|
|
373
|
+
# Constant across all stacks (EU/US/AWS/GCP/Azure); the per-stack difference
|
|
374
|
+
# is reflected in the ``sapiUrl`` query parameter, not the wizard host.
|
|
375
|
+
OAUTH_HOST: str = "external.keboola.com"
|
|
376
|
+
OAUTH_PATH: str = "/oauth/index.html"
|
|
377
|
+
|
|
378
|
+
# --- Kai (Keboola AI Assistant) ---
|
|
379
|
+
KAI_FEATURE_FLAG: str = "agent-chat"
|
|
380
|
+
KAI_REQUEST_TIMEOUT: float = 300.0 # 5 min for non-streaming requests
|
|
381
|
+
KAI_STREAM_TIMEOUT: float = 600.0 # 10 min for SSE streaming responses
|
|
382
|
+
SECRET_PLACEHOLDER: str = "<YOUR_SECRET>"
|
|
383
|
+
|
|
384
|
+
# --- Changelog rendering ---
|
|
385
|
+
# `kbagent changelog` shows a one-line summary per version by default (--full
|
|
386
|
+
# expands). A summary is the note's first sentence, capped at this many chars
|
|
387
|
+
# (cut on a word boundary) so a verbose release note collapses to a scannable
|
|
388
|
+
# headline instead of a wall of text.
|
|
389
|
+
CHANGELOG_HEADLINE_MAX_CHARS: int = 160
|
|
390
|
+
|
|
391
|
+
# --- Job Run ---
|
|
392
|
+
DEFAULT_JOB_RUN_TIMEOUT: float = 300.0 # 5 min default for --wait polling
|
|
393
|
+
|
|
394
|
+
# --- Job Terminate ---
|
|
395
|
+
# States where POST /jobs/{id}/kill returns HTTP 200; any other state yields 400.
|
|
396
|
+
KILLABLE_JOB_STATUSES: frozenset[str] = frozenset({"created", "waiting", "processing"})
|
|
397
|
+
|
|
398
|
+
# --- Workspace Query Service compatibility (since v0.42.0, closes #304) ---
|
|
399
|
+
# Storage API workspace endpoint exposes `connection.loginType`. The Query
|
|
400
|
+
# Service (POST /v2/storage/branch/{ID}/workspaces/{WS}/query) accepts only a
|
|
401
|
+
# subset of these and rejects the rest with HTTP 400 and
|
|
402
|
+
# `code: storage.executeQuery.notSupportedLoginType`. Before #304 the only
|
|
403
|
+
# way to learn whether a workspace was Query-Service-compatible was to fire a
|
|
404
|
+
# query and read the failure -- the issue cost ~30 min of trial-and-error
|
|
405
|
+
# per data-app onboarding.
|
|
406
|
+
#
|
|
407
|
+
# Conservative WHITELIST semantics (false negatives over false positives):
|
|
408
|
+
# present -> qs_compatible=True (confirmed working in production)
|
|
409
|
+
# absent -> qs_compatible=False; hint to try anyway because the policy
|
|
410
|
+
# varies per stack (snowflake-legacy-service worked on
|
|
411
|
+
# connection.keboola.com but failed on the GCP us-east4 stack
|
|
412
|
+
# in the original issue report)
|
|
413
|
+
#
|
|
414
|
+
# Verified 2026-05-18 against project 901 on connection.keboola.com:
|
|
415
|
+
# snowflake-service-keypair: PASS
|
|
416
|
+
# snowflake-person-sso: PASS
|
|
417
|
+
# snowflake-person-keypair: PASS (required for new Snowflake sandboxes)
|
|
418
|
+
# snowflake-legacy-service: PASS here, FAIL on GCP us-east4 (issue #304)
|
|
419
|
+
# default (legacy 2016 ws): FAIL ('JWT token is invalid')
|
|
420
|
+
#
|
|
421
|
+
# Extend ONLY after empirical confirmation across at least one non-AWS stack.
|
|
422
|
+
#
|
|
423
|
+
# This whitelist is SNOWFLAKE-SCOPED. BigQuery compatibility lives in its own
|
|
424
|
+
# set below because the `default` loginType means opposite things per backend
|
|
425
|
+
# (see BIGQUERY_WORKSPACE_LOGIN_TYPE). Compatibility is therefore keyed by
|
|
426
|
+
# (backend, loginType) -- see `_classify_qs_compatibility`.
|
|
427
|
+
SNOWFLAKE_WORKSPACE_LOGIN_TYPE: str = "snowflake-person-keypair"
|
|
428
|
+
QUERY_SERVICE_COMPATIBLE_LOGIN_TYPES: frozenset[str] = frozenset(
|
|
429
|
+
{
|
|
430
|
+
"snowflake-service-keypair",
|
|
431
|
+
"snowflake-person-sso",
|
|
432
|
+
SNOWFLAKE_WORKSPACE_LOGIN_TYPE,
|
|
433
|
+
}
|
|
434
|
+
)
|
|
435
|
+
|
|
436
|
+
# --- BigQuery Query Service compatibility (since v0.58.0) ---
|
|
437
|
+
# BigQuery workspaces carry a single `default` loginType -- the sandbox API does
|
|
438
|
+
# not expose Snowflake-style variants for BigQuery. The Query Service accepts it:
|
|
439
|
+
# verified 2026-06-04 against project 9621 on connection.keboola.com, where a
|
|
440
|
+
# `SELECT` against a read-only `default` BigQuery workspace returns rows.
|
|
441
|
+
#
|
|
442
|
+
# CRITICAL: `default` is on the BigQuery whitelist but deliberately OFF the
|
|
443
|
+
# Snowflake one above. Snowflake ALSO mints a `default` loginType (legacy 2016
|
|
444
|
+
# workspaces) which the Query Service REJECTS ('JWT token is invalid'). Keying
|
|
445
|
+
# compatibility on loginType alone would wrongly green-light those legacy
|
|
446
|
+
# Snowflake workspaces, so `_classify_qs_compatibility` dispatches on backend.
|
|
447
|
+
BIGQUERY_WORKSPACE_LOGIN_TYPE: str = "default"
|
|
448
|
+
QUERY_SERVICE_COMPATIBLE_LOGIN_TYPES_BIGQUERY: frozenset[str] = frozenset(
|
|
449
|
+
{BIGQUERY_WORKSPACE_LOGIN_TYPE}
|
|
450
|
+
)
|
|
451
|
+
|
|
452
|
+
# --- Permission Exit Code ---
|
|
453
|
+
EXIT_PERMISSION_DENIED: int = 6
|
|
454
|
+
# --- Job-timeout Exit Code ---
|
|
455
|
+
# Distinct from the general "1" exit code so scripts can tell
|
|
456
|
+
# "local --timeout elapsed and we cancelled the remote job" apart
|
|
457
|
+
# from "job failed on its own". The retryable-with-longer-timeout
|
|
458
|
+
# QUEUE_JOB_TIMEOUT case (kill itself failed) stays at exit 4.
|
|
459
|
+
EXIT_JOB_TIMEOUT_TERMINATED: int = 7
|
|
460
|
+
|
|
461
|
+
# --- Domain Validation Constants ---
|
|
462
|
+
VALID_COMPONENT_TYPES: list[str] = ["extractor", "writer", "transformation", "application"]
|
|
463
|
+
VALID_STATUSES: list[str] = ["processing", "terminated", "cancelled", "success", "error"]
|
|
464
|
+
|
|
465
|
+
# --- Query Service ---
|
|
466
|
+
QUERY_JOB_POLL_INTERVAL: float = 1.0 # seconds between polls for query job status
|
|
467
|
+
QUERY_JOB_MAX_WAIT: float = 120.0 # max seconds to wait for a query job
|
|
468
|
+
# Fast inline result path (GET .../results) -- reads the already-computed result
|
|
469
|
+
# set as JSON instead of materializing a CSV file via the warehouse UNLOAD path
|
|
470
|
+
# (GET .../export). The default path fetches at most QUERY_RESULTS_DEFAULT_LIMIT
|
|
471
|
+
# rows, accumulated in pages of QUERY_RESULTS_PAGE_SIZE and trimmed to the limit.
|
|
472
|
+
# The endpoint enforces 100 <= pageSize <= 100000, so QUERY_RESULTS_PAGE_SIZE is a
|
|
473
|
+
# fixed valid page size -- it is NOT derived from --limit (a small limit would 400).
|
|
474
|
+
# Two DISTINCT concepts that happen to share the value 500:
|
|
475
|
+
# DEFAULT_LIMIT = user-facing row cap (the --limit default; freely tunable).
|
|
476
|
+
# PAGE_SIZE = API wire constraint -- rows per /results request, which the
|
|
477
|
+
# endpoint requires to be within 100..100000. Independent of
|
|
478
|
+
# --limit; the service pages by PAGE_SIZE and trims to --limit.
|
|
479
|
+
QUERY_RESULTS_DEFAULT_LIMIT: int = 500 # default --limit for `workspace query` fast path
|
|
480
|
+
QUERY_RESULTS_PAGE_SIZE: int = 500 # rows per /results page (API requires 100..100000)
|
|
481
|
+
|
|
482
|
+
# --- Workspace Defaults ---
|
|
483
|
+
DEFAULT_WORKSPACE_BACKEND: str = "snowflake"
|
|
484
|
+
|
|
485
|
+
# --- Sync / Git Workflow ---
|
|
486
|
+
KEBOOLA_DIR_NAME: str = ".keboola"
|
|
487
|
+
MANIFEST_FILENAME: str = "manifest.json"
|
|
488
|
+
BRANCH_MAPPING_FILENAME: str = "branch-mapping.json"
|
|
489
|
+
CONFIG_FILENAME: str = "_config.yml"
|
|
490
|
+
MANIFEST_VERSION: int = 3
|
|
491
|
+
DEFAULT_NAMING_BRANCH: str = "{branch_name}"
|
|
492
|
+
DEFAULT_NAMING_CONFIG: str = "{component_type}/{component_id}/{config_name}"
|
|
493
|
+
DEFAULT_NAMING_CONFIG_ROW: str = "rows/{config_row_name}"
|
|
494
|
+
DEFAULT_NAMING_SCHEDULER: str = "schedules/{config_name}"
|
|
495
|
+
DEFAULT_NAMING_SHARED_CODE: str = "_shared/{target_component_id}"
|
|
496
|
+
DEFAULT_NAMING_SHARED_CODE_ROW: str = "codes/{config_row_name}"
|
|
497
|
+
DEFAULT_NAMING_VARIABLES: str = "variables"
|
|
498
|
+
DEFAULT_NAMING_VARIABLES_VALUES: str = "values/{config_row_name}"
|
|
499
|
+
DEFAULT_NAMING_DATA_APP: str = "app/{component_id}/{config_name}"
|
|
500
|
+
# _config.yml file-format version is independent of the manifest schema version.
|
|
501
|
+
# Manifest v3 introduces ManifestConfigRow.metadata (row-level pull hashes) but does
|
|
502
|
+
# not change the on-disk YAML shape, so CONFIG_YML_VERSION stays at 2.
|
|
503
|
+
CONFIG_YML_VERSION: int = 2
|
|
504
|
+
SANITIZE_NAME_MAX_LENGTH: int = 100
|
|
505
|
+
|
|
506
|
+
# --- Sync Pull: Storage & Jobs ---
|
|
507
|
+
JOBS_FILENAME: str = "_jobs.jsonl"
|
|
508
|
+
STORAGE_DIR_NAME: str = "storage"
|
|
509
|
+
STORAGE_BUCKETS_FILENAME: str = "buckets.json"
|
|
510
|
+
STORAGE_SAMPLES_DIR_NAME: str = "samples"
|
|
511
|
+
DEFAULT_SAMPLE_LIMIT: int = 100
|
|
512
|
+
DEFAULT_MAX_SAMPLES: int = 50
|
|
513
|
+
ENCRYPTED_COLUMN_PREFIX: str = "#"
|
|
514
|
+
ENCRYPTED_COLUMN_MASK: str = "***ENCRYPTED***"
|
|
515
|
+
|
|
516
|
+
# --- Ignored Components ---
|
|
517
|
+
# Components that are always excluded from sync operations (pull/push/diff).
|
|
518
|
+
# These are managed through separate APIs and have volatile internal state.
|
|
519
|
+
ALWAYS_IGNORED_COMPONENTS: frozenset[str] = frozenset(
|
|
520
|
+
{
|
|
521
|
+
"keboola.sandboxes", # Workspaces API; parameters.id is volatile
|
|
522
|
+
}
|
|
523
|
+
)
|
|
524
|
+
|
|
525
|
+
# --- Diff Engine ---
|
|
526
|
+
DIFF_MAX_DEPTH: int = 3 # max nesting depth for deep_diff detail output
|
|
527
|
+
DIFF_MAX_LINES: int = 20 # max number of diff detail lines per config change
|
|
528
|
+
ENCRYPTED_PLACEHOLDER: str = "<ENCRYPTED>" # placeholder for encrypted values during comparison
|