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,331 @@
|
|
|
1
|
+
"""Search service — cross-project item search using the Storage API global-search endpoint.
|
|
2
|
+
|
|
3
|
+
Provides textual (name-based) search across buckets, tables, configurations,
|
|
4
|
+
flows, data apps, and other Keboola item types. Supports multi-project fan-out
|
|
5
|
+
via BaseService._run_parallel() with per-project error accumulation.
|
|
6
|
+
|
|
7
|
+
The ``config-based`` search type is delegated to ``ConfigService.search_configs()``
|
|
8
|
+
(which scans full configuration JSON bodies for the query string) and is included
|
|
9
|
+
here for a unified ``search`` command surface.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import logging
|
|
15
|
+
from typing import Any
|
|
16
|
+
|
|
17
|
+
from ..constants import GLOBAL_SEARCH_FEATURE
|
|
18
|
+
from ..errors import KeboolaApiError
|
|
19
|
+
from ..models import ProjectConfig
|
|
20
|
+
from .base import BaseService, sanitize_unexpected_error
|
|
21
|
+
from .config_service import ConfigService
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
# Mapping from user-facing --type values to Storage API ``types[]`` values.
|
|
26
|
+
# The API accepts a strict set; we expose a friendlier subset as CLI options.
|
|
27
|
+
USER_TYPE_TO_API_TYPES: dict[str, list[str]] = {
|
|
28
|
+
"bucket": ["bucket"],
|
|
29
|
+
"table": ["table"],
|
|
30
|
+
"config": ["configuration"],
|
|
31
|
+
"flow": ["flow"],
|
|
32
|
+
# data-app reuses the "configuration" API type; results are post-filtered
|
|
33
|
+
# to component_id == "keboola.data-apps" in `_normalise_item` so users
|
|
34
|
+
# asking for --type data-app do not get every other configuration too.
|
|
35
|
+
"data-app": ["configuration"],
|
|
36
|
+
"transformation": ["transformation"],
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
# Component ID used to identify data-app configurations after post-filtering.
|
|
40
|
+
DATA_APP_COMPONENT_ID = "keboola.data-apps"
|
|
41
|
+
|
|
42
|
+
# All API types for unfiltered search.
|
|
43
|
+
ALL_API_TYPES: list[str] = [
|
|
44
|
+
"bucket",
|
|
45
|
+
"table",
|
|
46
|
+
"flow",
|
|
47
|
+
"transformation",
|
|
48
|
+
"configuration",
|
|
49
|
+
"configuration-row",
|
|
50
|
+
]
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class SearchService(BaseService):
|
|
54
|
+
"""Service for cross-project textual search using the Storage API global-search endpoint.
|
|
55
|
+
|
|
56
|
+
Supports:
|
|
57
|
+
- Textual search: uses ``GET /v2/storage/global-search`` (name-based, fast).
|
|
58
|
+
- Config-based search: delegates to ConfigService for body scanning (slower).
|
|
59
|
+
|
|
60
|
+
Multi-project fan-out runs in parallel via ``_run_parallel()``. A failing
|
|
61
|
+
project is recorded in ``errors`` without stopping others.
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
def search(
|
|
65
|
+
self,
|
|
66
|
+
query: str,
|
|
67
|
+
aliases: list[str] | None = None,
|
|
68
|
+
item_types: list[str] | None = None,
|
|
69
|
+
search_type: str = "textual",
|
|
70
|
+
limit: int = 50,
|
|
71
|
+
) -> dict[str, Any]:
|
|
72
|
+
"""Search for items across one or more projects.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
query: Search string to match against item names (textual) or
|
|
76
|
+
config bodies (config-based).
|
|
77
|
+
aliases: Project aliases to search. ``None`` means all projects.
|
|
78
|
+
item_types: Optional list of user-facing type names. Supported:
|
|
79
|
+
``bucket``, ``table``, ``config``, ``flow``,
|
|
80
|
+
``data-app``, ``transformation``.
|
|
81
|
+
``None`` or empty means search all types.
|
|
82
|
+
search_type: ``"textual"`` (default) uses the fast global-search
|
|
83
|
+
endpoint (name-based). ``"config-based"`` scans full
|
|
84
|
+
config JSON bodies via ConfigService.
|
|
85
|
+
limit: Maximum number of results per project (textual only).
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
Dict with keys:
|
|
89
|
+
- ``"results"``: list of result dicts
|
|
90
|
+
- ``"errors"``: list of per-project error dicts
|
|
91
|
+
- ``"stats"``: dict with ``projects_searched`` and ``results_found``
|
|
92
|
+
"""
|
|
93
|
+
projects = self.resolve_projects(aliases)
|
|
94
|
+
|
|
95
|
+
if search_type == "config-based":
|
|
96
|
+
return self._search_config_based(query, projects, item_types)
|
|
97
|
+
|
|
98
|
+
return self._search_textual(query, projects, item_types, limit)
|
|
99
|
+
|
|
100
|
+
# ── Textual search (global-search endpoint) ────────────────────────────
|
|
101
|
+
|
|
102
|
+
def _search_textual(
|
|
103
|
+
self,
|
|
104
|
+
query: str,
|
|
105
|
+
projects: dict[str, ProjectConfig],
|
|
106
|
+
item_types: list[str] | None,
|
|
107
|
+
limit: int,
|
|
108
|
+
) -> dict[str, Any]:
|
|
109
|
+
"""Fan out textual search across projects in parallel."""
|
|
110
|
+
api_types = _resolve_api_types(item_types)
|
|
111
|
+
|
|
112
|
+
def worker(
|
|
113
|
+
alias: str, project: ProjectConfig
|
|
114
|
+
) -> tuple[str, list[dict[str, Any]], bool] | tuple[str, dict[str, str]]:
|
|
115
|
+
return self._search_project_textual(
|
|
116
|
+
alias, project, query, api_types, limit, item_types=item_types
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
successes, errors = self._run_parallel(projects, worker)
|
|
120
|
+
|
|
121
|
+
all_results: list[dict[str, Any]] = []
|
|
122
|
+
for _alias, results, _ok in successes:
|
|
123
|
+
all_results.extend(results)
|
|
124
|
+
|
|
125
|
+
all_results.sort(key=lambda r: (r["project_alias"], r["type"], r["id"]))
|
|
126
|
+
errors.sort(key=lambda e: e.get("project_alias", ""))
|
|
127
|
+
|
|
128
|
+
return {
|
|
129
|
+
"results": all_results,
|
|
130
|
+
"errors": errors,
|
|
131
|
+
"stats": {
|
|
132
|
+
"projects_searched": len(successes),
|
|
133
|
+
"results_found": len(all_results),
|
|
134
|
+
},
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
def _search_project_textual(
|
|
138
|
+
self,
|
|
139
|
+
alias: str,
|
|
140
|
+
project: ProjectConfig,
|
|
141
|
+
query: str,
|
|
142
|
+
api_types: list[str],
|
|
143
|
+
limit: int,
|
|
144
|
+
item_types: list[str] | None = None,
|
|
145
|
+
) -> tuple[str, list[dict[str, Any]], bool] | tuple[str, dict[str, str]]:
|
|
146
|
+
"""Worker: run textual search against a single project (thread-safe)."""
|
|
147
|
+
client = self._client_factory(project.stack_url, project.token)
|
|
148
|
+
try:
|
|
149
|
+
# Resolve project_id via token verify; cached within client lifetime.
|
|
150
|
+
token_info = client.verify_token()
|
|
151
|
+
project_id = token_info.project_id
|
|
152
|
+
if project_id is None:
|
|
153
|
+
return (
|
|
154
|
+
alias,
|
|
155
|
+
{
|
|
156
|
+
"project_alias": alias,
|
|
157
|
+
"error_code": "CONFIG_ERROR",
|
|
158
|
+
"message": "Could not determine project ID from token info.",
|
|
159
|
+
},
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
# Pre-flight: refuse fast on stacks/projects without the global-search
|
|
163
|
+
# feature instead of letting a raw 404/403 confuse the caller.
|
|
164
|
+
if not client.has_feature(GLOBAL_SEARCH_FEATURE):
|
|
165
|
+
return (
|
|
166
|
+
alias,
|
|
167
|
+
{
|
|
168
|
+
"project_alias": alias,
|
|
169
|
+
"error_code": "FEATURE_NOT_ENABLED",
|
|
170
|
+
"message": (
|
|
171
|
+
f"Project does not have the '{GLOBAL_SEARCH_FEATURE}' feature "
|
|
172
|
+
"enabled. Use --search-type config-based for body scanning, or "
|
|
173
|
+
"ask a Keboola admin to enable the feature."
|
|
174
|
+
),
|
|
175
|
+
},
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
raw = client.global_search(
|
|
179
|
+
query=query,
|
|
180
|
+
project_id=project_id,
|
|
181
|
+
types=api_types if api_types else None,
|
|
182
|
+
limit=limit,
|
|
183
|
+
)
|
|
184
|
+
items = raw.get("items", [])
|
|
185
|
+
results = [_normalise_item(alias, item) for item in items]
|
|
186
|
+
|
|
187
|
+
# Post-filter when --type data-app was requested without --type config:
|
|
188
|
+
# data-app maps to the same API type as config, so without filtering
|
|
189
|
+
# users would receive every configuration in the project.
|
|
190
|
+
if item_types and "data-app" in item_types and "config" not in item_types:
|
|
191
|
+
results = [
|
|
192
|
+
r
|
|
193
|
+
for r in results
|
|
194
|
+
if r.get("type") != "configuration"
|
|
195
|
+
or r.get("component_id") == DATA_APP_COMPONENT_ID
|
|
196
|
+
]
|
|
197
|
+
|
|
198
|
+
return alias, results, True
|
|
199
|
+
|
|
200
|
+
except KeboolaApiError as exc:
|
|
201
|
+
return (
|
|
202
|
+
alias,
|
|
203
|
+
{
|
|
204
|
+
"project_alias": alias,
|
|
205
|
+
"error_code": exc.error_code or "API_ERROR",
|
|
206
|
+
"message": exc.message,
|
|
207
|
+
},
|
|
208
|
+
)
|
|
209
|
+
except Exception as exc:
|
|
210
|
+
logger.debug("Unexpected error searching project '%s': %s", alias, exc)
|
|
211
|
+
return (
|
|
212
|
+
alias,
|
|
213
|
+
{
|
|
214
|
+
"project_alias": alias,
|
|
215
|
+
"error_code": "UNEXPECTED_ERROR",
|
|
216
|
+
"message": sanitize_unexpected_error(exc),
|
|
217
|
+
},
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
# ── Config-based search (full body scan) ───────────────────────────────
|
|
221
|
+
|
|
222
|
+
def _search_config_based(
|
|
223
|
+
self,
|
|
224
|
+
query: str,
|
|
225
|
+
projects: dict[str, ProjectConfig],
|
|
226
|
+
item_types: list[str] | None,
|
|
227
|
+
) -> dict[str, Any]:
|
|
228
|
+
"""Delegate to ConfigService for JSON-body search across projects.
|
|
229
|
+
|
|
230
|
+
Translates user-facing ``item_types`` to ConfigService's
|
|
231
|
+
``component_type`` filter where possible, then reformats the result
|
|
232
|
+
to the unified search output shape.
|
|
233
|
+
"""
|
|
234
|
+
# Map item_types to a component_type filter for ConfigService.
|
|
235
|
+
component_type = _item_types_to_component_type(item_types)
|
|
236
|
+
|
|
237
|
+
config_service = ConfigService(
|
|
238
|
+
config_store=self._config_store,
|
|
239
|
+
client_factory=self._client_factory,
|
|
240
|
+
)
|
|
241
|
+
aliases = list(projects.keys()) if projects else None
|
|
242
|
+
raw = config_service.search_configs(
|
|
243
|
+
query=query,
|
|
244
|
+
aliases=aliases,
|
|
245
|
+
component_type=component_type,
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
# Re-shape matches into the unified results format.
|
|
249
|
+
results = [
|
|
250
|
+
{
|
|
251
|
+
"project_alias": m["project_alias"],
|
|
252
|
+
"type": "configuration",
|
|
253
|
+
"id": m["config_id"],
|
|
254
|
+
"name": m["config_name"],
|
|
255
|
+
"description": m.get("description", ""),
|
|
256
|
+
"component_id": m.get("component_id"),
|
|
257
|
+
"match_count": m.get("match_count", 0),
|
|
258
|
+
"match_locations": m.get("match_locations", []),
|
|
259
|
+
}
|
|
260
|
+
for m in raw.get("matches", [])
|
|
261
|
+
]
|
|
262
|
+
|
|
263
|
+
return {
|
|
264
|
+
"results": results,
|
|
265
|
+
"errors": raw.get("errors", []),
|
|
266
|
+
"stats": {
|
|
267
|
+
"projects_searched": raw["stats"]["projects_searched"],
|
|
268
|
+
"results_found": len(results),
|
|
269
|
+
},
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
# ── Helpers ────────────────────────────────────────────────────────────────
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
def _resolve_api_types(item_types: list[str] | None) -> list[str]:
|
|
277
|
+
"""Translate user-facing type names to Storage API type values.
|
|
278
|
+
|
|
279
|
+
Args:
|
|
280
|
+
item_types: List of user-facing type names, or None for all.
|
|
281
|
+
|
|
282
|
+
Returns:
|
|
283
|
+
Deduplicated list of API type strings. Empty list means "all types".
|
|
284
|
+
"""
|
|
285
|
+
if not item_types:
|
|
286
|
+
return []
|
|
287
|
+
seen: set[str] = set()
|
|
288
|
+
result: list[str] = []
|
|
289
|
+
for t in item_types:
|
|
290
|
+
for api_type in USER_TYPE_TO_API_TYPES.get(t, [t]):
|
|
291
|
+
if api_type not in seen:
|
|
292
|
+
seen.add(api_type)
|
|
293
|
+
result.append(api_type)
|
|
294
|
+
return result
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
def _item_types_to_component_type(item_types: list[str] | None) -> str | None:
|
|
298
|
+
"""Map user-facing item types to a ConfigService component_type filter.
|
|
299
|
+
|
|
300
|
+
Returns None (no filter) for types that do not map to a specific
|
|
301
|
+
component type (e.g. bucket, table) or when no filter is given.
|
|
302
|
+
"""
|
|
303
|
+
if not item_types:
|
|
304
|
+
return None
|
|
305
|
+
types_set = set(item_types)
|
|
306
|
+
if types_set == {"transformation"}:
|
|
307
|
+
return "transformation"
|
|
308
|
+
return None
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
def _normalise_item(alias: str, item: dict[str, Any]) -> dict[str, Any]:
|
|
312
|
+
"""Normalise a raw global-search API item into the unified result shape.
|
|
313
|
+
|
|
314
|
+
Args:
|
|
315
|
+
alias: Project alias this result came from.
|
|
316
|
+
item: Raw item dict from the Storage API response.
|
|
317
|
+
|
|
318
|
+
Returns:
|
|
319
|
+
Normalised result dict with consistent keys across all item types.
|
|
320
|
+
"""
|
|
321
|
+
full_path = item.get("fullPath", {})
|
|
322
|
+
return {
|
|
323
|
+
"project_alias": alias,
|
|
324
|
+
"type": item.get("type", ""),
|
|
325
|
+
"id": item.get("id", ""),
|
|
326
|
+
"name": item.get("name", ""),
|
|
327
|
+
"description": full_path.get("description", ""),
|
|
328
|
+
"component_id": item.get("componentId"),
|
|
329
|
+
"project_id": item.get("projectId"),
|
|
330
|
+
"project_name": item.get("projectName", ""),
|
|
331
|
+
}
|