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,345 @@
|
|
|
1
|
+
"""Developer Portal business logic.
|
|
2
|
+
|
|
3
|
+
Identity CRUD + prepare/apply discipline for portal writes. Commands stay
|
|
4
|
+
thin; this module owns diff computation, publish pre-flight validation,
|
|
5
|
+
and the verify-on-add login probe.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import logging
|
|
11
|
+
from collections.abc import Callable, Iterator
|
|
12
|
+
from contextlib import contextmanager
|
|
13
|
+
from dataclasses import dataclass, field
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from typing import Any
|
|
16
|
+
|
|
17
|
+
from ..config_store import ConfigStore
|
|
18
|
+
from ..dev_portal_client import DeveloperPortalClient
|
|
19
|
+
from ..errors import ConfigError, ErrorCode, KeboolaApiError
|
|
20
|
+
from ..models import DeveloperPortalIdentity
|
|
21
|
+
|
|
22
|
+
ClientFactory = Callable[[DeveloperPortalIdentity], DeveloperPortalClient]
|
|
23
|
+
|
|
24
|
+
_log = logging.getLogger(__name__)
|
|
25
|
+
|
|
26
|
+
_BANNED_NAME_WORDS = ("extractor", "writer")
|
|
27
|
+
_REQUIRED_PUBLISH_FIELDS = (
|
|
28
|
+
"icon",
|
|
29
|
+
"name",
|
|
30
|
+
"type",
|
|
31
|
+
"repository",
|
|
32
|
+
"shortDescription",
|
|
33
|
+
"longDescription",
|
|
34
|
+
"licenseUrl",
|
|
35
|
+
"documentationUrl",
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
# Fields that the apps-api server `.forbidden()`s on the vendor PATCH endpoint
|
|
39
|
+
# (PATCH /vendors/{vendor}/apps/{app}). Settable only via PATCH /admin/apps/{app}
|
|
40
|
+
# with an admin-role token. Sending any of these on the vendor endpoint returns
|
|
41
|
+
# a 422 with a misleading "must be one of: ..." error message because the
|
|
42
|
+
# enum-validation error annotation is attached in the shared admin schema
|
|
43
|
+
# before clientAppSchema overrides with `.forbidden()`. Source of truth:
|
|
44
|
+
# keboola/developer-portal:src/lib/validation.js -> clientAppSchema().
|
|
45
|
+
_ADMIN_ONLY_PATCH_FIELDS = frozenset(
|
|
46
|
+
{
|
|
47
|
+
"category",
|
|
48
|
+
"categories",
|
|
49
|
+
"complexity",
|
|
50
|
+
"features",
|
|
51
|
+
"forwardToken",
|
|
52
|
+
"forwardTokenDetails",
|
|
53
|
+
"injectEnvironment",
|
|
54
|
+
"processTimeout",
|
|
55
|
+
"requiredMemory",
|
|
56
|
+
}
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@dataclass(frozen=True)
|
|
61
|
+
class FieldDiff:
|
|
62
|
+
key: str
|
|
63
|
+
current: Any
|
|
64
|
+
new: Any
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@dataclass(frozen=True)
|
|
68
|
+
class PendingWrite:
|
|
69
|
+
"""Base for any prepared portal write. apply() in the service dispatches on the subclass."""
|
|
70
|
+
|
|
71
|
+
alias: str
|
|
72
|
+
vendor: str
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@dataclass(frozen=True)
|
|
76
|
+
class PendingCreate(PendingWrite):
|
|
77
|
+
payload: dict[str, Any]
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@dataclass(frozen=True)
|
|
81
|
+
class PendingPatch(PendingWrite):
|
|
82
|
+
app_id: str
|
|
83
|
+
payload: dict[str, Any]
|
|
84
|
+
current: dict[str, Any]
|
|
85
|
+
diff: list[FieldDiff] = field(default_factory=list)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@dataclass(frozen=True)
|
|
89
|
+
class PendingIconUpload(PendingWrite):
|
|
90
|
+
app_id: str
|
|
91
|
+
png_path: Path
|
|
92
|
+
png_bytes: bytes
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@dataclass(frozen=True)
|
|
96
|
+
class PendingPublish(PendingWrite):
|
|
97
|
+
app_id: str
|
|
98
|
+
current: dict[str, Any]
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
@dataclass(frozen=True)
|
|
102
|
+
class PendingDeprecate(PendingWrite):
|
|
103
|
+
app_id: str
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
class DeveloperPortalService:
|
|
107
|
+
def __init__(
|
|
108
|
+
self,
|
|
109
|
+
config_store: ConfigStore,
|
|
110
|
+
client_factory: ClientFactory,
|
|
111
|
+
) -> None:
|
|
112
|
+
self._store = config_store
|
|
113
|
+
self._client_factory = client_factory
|
|
114
|
+
# One bearer per alias, reused across a prepare/apply pair within a
|
|
115
|
+
# single command invocation. In-memory only; the service instance is
|
|
116
|
+
# rebuilt per CLI call, so nothing leaks across invocations.
|
|
117
|
+
self._bearers: dict[str, str] = {}
|
|
118
|
+
|
|
119
|
+
# ----- Identity management -----
|
|
120
|
+
|
|
121
|
+
def add_identity(self, alias: str, identity: DeveloperPortalIdentity) -> None:
|
|
122
|
+
"""Verify creds (login probe) BEFORE persisting.
|
|
123
|
+
|
|
124
|
+
Same UX as `kbagent project add` (which calls verify_token first):
|
|
125
|
+
bad creds fail fast and never land in config.json.
|
|
126
|
+
"""
|
|
127
|
+
with self._client_factory(identity) as client:
|
|
128
|
+
client._ensure_authenticated() # raises on bad creds / MFA failure
|
|
129
|
+
self._store.add_dev_portal_identity(alias, identity)
|
|
130
|
+
|
|
131
|
+
def list_identities(self) -> dict[str, DeveloperPortalIdentity]:
|
|
132
|
+
return dict(self._store.load().dev_portal_identities)
|
|
133
|
+
|
|
134
|
+
def remove_identity(self, alias: str) -> None:
|
|
135
|
+
self._store.remove_dev_portal_identity(alias)
|
|
136
|
+
|
|
137
|
+
def edit_identity(self, alias: str, **fields: Any) -> None:
|
|
138
|
+
self._store.edit_dev_portal_identity(alias, **fields)
|
|
139
|
+
|
|
140
|
+
def rename_identity(self, old_alias: str, new_alias: str) -> None:
|
|
141
|
+
self._store.rename_dev_portal_identity(old_alias, new_alias)
|
|
142
|
+
|
|
143
|
+
def use_identity(self, alias: str) -> None:
|
|
144
|
+
self._store.set_default_dev_portal_identity(alias)
|
|
145
|
+
|
|
146
|
+
def current_identity(self) -> str:
|
|
147
|
+
return self._store.load().default_dev_portal_identity
|
|
148
|
+
|
|
149
|
+
def verify_identity(self, alias: str) -> dict[str, str]:
|
|
150
|
+
ident = self._resolve_identity(alias)
|
|
151
|
+
with self._client_factory(ident) as client:
|
|
152
|
+
client._ensure_authenticated()
|
|
153
|
+
return {"alias": alias, "username": ident.username}
|
|
154
|
+
|
|
155
|
+
# ----- Internal -----
|
|
156
|
+
|
|
157
|
+
def _resolve_identity(self, alias: str) -> DeveloperPortalIdentity:
|
|
158
|
+
ident = self._store.get_dev_portal_identity(alias)
|
|
159
|
+
if ident is None:
|
|
160
|
+
raise ConfigError(
|
|
161
|
+
f"Developer Portal identity '{alias}' not found. "
|
|
162
|
+
"Run `kbagent dev-portal identity list` to see configured identities."
|
|
163
|
+
)
|
|
164
|
+
return ident
|
|
165
|
+
|
|
166
|
+
@contextmanager
|
|
167
|
+
def _authed_client(self, alias: str) -> Iterator[DeveloperPortalClient]:
|
|
168
|
+
"""Yield a portal client that reuses an existing login for this alias.
|
|
169
|
+
|
|
170
|
+
The first call for an alias logs in (prompting MFA once on a personal
|
|
171
|
+
account); any later call within the same command invocation reuses the
|
|
172
|
+
bearer obtained earlier. This is what stops `patch`/`publish` -- which
|
|
173
|
+
open a client in `prepare_*` to read current state and again in
|
|
174
|
+
`apply()` to write -- from logging in (and MFA-prompting) twice.
|
|
175
|
+
|
|
176
|
+
A cached bearer can go stale: portal tokens have a finite TTL, and in
|
|
177
|
+
`kbagent serve` this service lives in a long-lived singleton registry,
|
|
178
|
+
so a bearer can outlive its validity across requests. On an auth
|
|
179
|
+
failure the cached bearer is evicted, so the NEXT call re-authenticates
|
|
180
|
+
instead of replaying a dead token forever (which would lock out serve
|
|
181
|
+
until a restart).
|
|
182
|
+
"""
|
|
183
|
+
ident = self._resolve_identity(alias)
|
|
184
|
+
client = self._client_factory(ident)
|
|
185
|
+
cached = self._bearers.get(alias)
|
|
186
|
+
if cached is not None:
|
|
187
|
+
client.seed_bearer(cached)
|
|
188
|
+
with client:
|
|
189
|
+
try:
|
|
190
|
+
yield client
|
|
191
|
+
except KeboolaApiError as exc:
|
|
192
|
+
if exc.error_code in (ErrorCode.INVALID_TOKEN, ErrorCode.DP_LOGIN_FAILED):
|
|
193
|
+
self._bearers.pop(alias, None)
|
|
194
|
+
raise
|
|
195
|
+
new_bearer = client.bearer
|
|
196
|
+
if new_bearer is not None:
|
|
197
|
+
self._bearers[alias] = new_bearer
|
|
198
|
+
|
|
199
|
+
# ----- Reads -----
|
|
200
|
+
|
|
201
|
+
def list_apps(self, alias: str, vendor: str) -> list[dict[str, Any]]:
|
|
202
|
+
with self._authed_client(alias) as client:
|
|
203
|
+
return client.list_apps(vendor)
|
|
204
|
+
|
|
205
|
+
def get_app(self, alias: str, vendor: str, app_id: str) -> dict[str, Any]:
|
|
206
|
+
with self._authed_client(alias) as client:
|
|
207
|
+
return client.get_app(vendor, app_id)
|
|
208
|
+
|
|
209
|
+
# ----- Prepare (no portal write yet) -----
|
|
210
|
+
|
|
211
|
+
def prepare_create(self, alias: str, vendor: str, payload: dict[str, Any]) -> PendingCreate:
|
|
212
|
+
for required in ("id", "name", "type"):
|
|
213
|
+
if required not in payload:
|
|
214
|
+
raise KeboolaApiError(
|
|
215
|
+
message=f"create payload must include '{required}'",
|
|
216
|
+
error_code=ErrorCode.VALIDATION_ERROR,
|
|
217
|
+
)
|
|
218
|
+
name_lower = str(payload["name"]).lower()
|
|
219
|
+
for banned in _BANNED_NAME_WORDS:
|
|
220
|
+
if banned in name_lower:
|
|
221
|
+
raise KeboolaApiError(
|
|
222
|
+
message=(
|
|
223
|
+
f"App name must not contain {_BANNED_NAME_WORDS!r}; got {payload['name']!r}"
|
|
224
|
+
),
|
|
225
|
+
error_code=ErrorCode.VALIDATION_ERROR,
|
|
226
|
+
)
|
|
227
|
+
# Confirm identity exists; defer login until apply().
|
|
228
|
+
self._resolve_identity(alias)
|
|
229
|
+
return PendingCreate(alias=alias, vendor=vendor, payload=payload)
|
|
230
|
+
|
|
231
|
+
def prepare_patch(
|
|
232
|
+
self,
|
|
233
|
+
alias: str,
|
|
234
|
+
vendor: str,
|
|
235
|
+
app_id: str,
|
|
236
|
+
payload: dict[str, Any],
|
|
237
|
+
) -> PendingPatch:
|
|
238
|
+
ident = self._resolve_identity(alias)
|
|
239
|
+
admin_only_in_payload = sorted(_ADMIN_ONLY_PATCH_FIELDS & set(payload.keys()))
|
|
240
|
+
if admin_only_in_payload and ident.role_hint != "admin":
|
|
241
|
+
raise KeboolaApiError(
|
|
242
|
+
message=(
|
|
243
|
+
f"Cannot patch admin-only field(s) via the vendor endpoint: "
|
|
244
|
+
f"{admin_only_in_payload}. The apps-api server forbids these "
|
|
245
|
+
f"on PATCH /vendors/{vendor}/apps/{app_id} (the 422 you'd "
|
|
246
|
+
"otherwise see -- 'must be one of: ...' -- is a misleading "
|
|
247
|
+
"server-side message hiding the real reason: the field is "
|
|
248
|
+
"forbidden() on the vendor schema, not enum-validated). "
|
|
249
|
+
"Switch to an admin identity to route this PATCH through "
|
|
250
|
+
"/admin/apps/{app} instead: `kbagent dev-portal identity add "
|
|
251
|
+
"--alias <name> --username <admin-email> --role-hint admin "
|
|
252
|
+
"--password-stdin` and re-run with `--identity <name>`. "
|
|
253
|
+
"Alternatively, drop the field and ask a Developer Portal "
|
|
254
|
+
"admin to set it. Canonical list: keboola/developer-portal "
|
|
255
|
+
"src/lib/validation.js -> clientAppSchema()."
|
|
256
|
+
),
|
|
257
|
+
error_code=ErrorCode.VALIDATION_ERROR,
|
|
258
|
+
)
|
|
259
|
+
with self._authed_client(alias) as client:
|
|
260
|
+
current = client.get_app(vendor, app_id)
|
|
261
|
+
diff = [
|
|
262
|
+
FieldDiff(key=k, current=current.get(k), new=v)
|
|
263
|
+
for k, v in payload.items()
|
|
264
|
+
if current.get(k) != v
|
|
265
|
+
]
|
|
266
|
+
return PendingPatch(
|
|
267
|
+
alias=alias,
|
|
268
|
+
vendor=vendor,
|
|
269
|
+
app_id=app_id,
|
|
270
|
+
payload=payload,
|
|
271
|
+
current=current,
|
|
272
|
+
diff=diff,
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
def prepare_upload_icon(
|
|
276
|
+
self, alias: str, vendor: str, app_id: str, path: str | Path
|
|
277
|
+
) -> PendingIconUpload:
|
|
278
|
+
import struct
|
|
279
|
+
|
|
280
|
+
p = Path(path)
|
|
281
|
+
if not p.is_file():
|
|
282
|
+
raise KeboolaApiError(
|
|
283
|
+
message=f"Icon file not found: {p}",
|
|
284
|
+
error_code=ErrorCode.FILE_NOT_FOUND,
|
|
285
|
+
)
|
|
286
|
+
data = p.read_bytes()
|
|
287
|
+
if not data.startswith(b"\x89PNG\r\n\x1a\n"):
|
|
288
|
+
raise KeboolaApiError(
|
|
289
|
+
message=f"Icon file is not a PNG: {p}",
|
|
290
|
+
error_code=ErrorCode.VALIDATION_ERROR,
|
|
291
|
+
)
|
|
292
|
+
if len(data) >= 24:
|
|
293
|
+
width, height = struct.unpack(">II", data[16:24])
|
|
294
|
+
if (width, height) != (128, 128):
|
|
295
|
+
_log.warning(
|
|
296
|
+
"Icon is %dx%d, not 128x128 — portal may reject it.",
|
|
297
|
+
width,
|
|
298
|
+
height,
|
|
299
|
+
)
|
|
300
|
+
self._resolve_identity(alias)
|
|
301
|
+
return PendingIconUpload(
|
|
302
|
+
alias=alias,
|
|
303
|
+
vendor=vendor,
|
|
304
|
+
app_id=app_id,
|
|
305
|
+
png_path=p,
|
|
306
|
+
png_bytes=data,
|
|
307
|
+
)
|
|
308
|
+
|
|
309
|
+
def prepare_publish(self, alias: str, vendor: str, app_id: str) -> PendingPublish:
|
|
310
|
+
with self._authed_client(alias) as client:
|
|
311
|
+
current = client.get_app(vendor, app_id)
|
|
312
|
+
missing = [f for f in _REQUIRED_PUBLISH_FIELDS if not current.get(f)]
|
|
313
|
+
if missing:
|
|
314
|
+
raise KeboolaApiError(
|
|
315
|
+
message=(
|
|
316
|
+
f"Cannot publish {app_id}: missing required fields "
|
|
317
|
+
f"{missing}. Fix them via `kbagent dev-portal patch` first."
|
|
318
|
+
),
|
|
319
|
+
error_code=ErrorCode.DP_PUBLISH_REQUIREMENTS_MISSING,
|
|
320
|
+
)
|
|
321
|
+
return PendingPublish(alias=alias, vendor=vendor, app_id=app_id, current=current)
|
|
322
|
+
|
|
323
|
+
def prepare_deprecate(self, alias: str, vendor: str, app_id: str) -> PendingDeprecate:
|
|
324
|
+
self._resolve_identity(alias)
|
|
325
|
+
return PendingDeprecate(alias=alias, vendor=vendor, app_id=app_id)
|
|
326
|
+
|
|
327
|
+
# ----- Apply (calls the portal write) -----
|
|
328
|
+
|
|
329
|
+
def apply(self, pending: PendingWrite) -> dict[str, Any]:
|
|
330
|
+
with self._authed_client(pending.alias) as client:
|
|
331
|
+
if isinstance(pending, PendingCreate):
|
|
332
|
+
return client.create_app(pending.vendor, pending.payload)
|
|
333
|
+
if isinstance(pending, PendingPatch):
|
|
334
|
+
return client.patch_app(pending.vendor, pending.app_id, pending.payload)
|
|
335
|
+
if isinstance(pending, PendingIconUpload):
|
|
336
|
+
client.upload_icon(pending.vendor, pending.app_id, pending.png_bytes)
|
|
337
|
+
return {"status": "uploaded", "app": pending.app_id}
|
|
338
|
+
if isinstance(pending, PendingPublish):
|
|
339
|
+
return client.publish_app(pending.vendor, pending.app_id)
|
|
340
|
+
if isinstance(pending, PendingDeprecate):
|
|
341
|
+
return client.deprecate_app(pending.vendor, pending.app_id)
|
|
342
|
+
raise KeboolaApiError(
|
|
343
|
+
message=f"Unknown pending write type: {type(pending).__name__}",
|
|
344
|
+
error_code=ErrorCode.INTERNAL_ERROR,
|
|
345
|
+
)
|