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
keboola_agent_cli/cli.py
ADDED
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
"""Typer root application with global options and subcommand registration."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
import sys
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
import typer
|
|
8
|
+
|
|
9
|
+
from .commands.agent import agent_app
|
|
10
|
+
from .commands.branch import branch_app
|
|
11
|
+
from .commands.changelog import changelog_command
|
|
12
|
+
from .commands.component import component_app
|
|
13
|
+
from .commands.config import config_app
|
|
14
|
+
from .commands.context import context_command
|
|
15
|
+
from .commands.data_app import data_app_app
|
|
16
|
+
from .commands.dev_portal import dev_portal_app
|
|
17
|
+
from .commands.doctor import doctor_command
|
|
18
|
+
from .commands.encrypt import encrypt_app
|
|
19
|
+
from .commands.feature import feature_app
|
|
20
|
+
from .commands.flow import flow_app
|
|
21
|
+
from .commands.http_client import http_app
|
|
22
|
+
from .commands.init import init_command
|
|
23
|
+
from .commands.job import job_app
|
|
24
|
+
from .commands.kai import kai_app
|
|
25
|
+
from .commands.lineage import lineage_app
|
|
26
|
+
from .commands.org import org_app
|
|
27
|
+
from .commands.permissions import permissions_app
|
|
28
|
+
from .commands.project import project_app
|
|
29
|
+
from .commands.repl import repl_command
|
|
30
|
+
from .commands.schedule import schedule_app
|
|
31
|
+
from .commands.search import search_command
|
|
32
|
+
from .commands.semantic_layer import semantic_layer_app
|
|
33
|
+
from .commands.serve import serve_command
|
|
34
|
+
from .commands.sharing import sharing_app
|
|
35
|
+
from .commands.storage import storage_app
|
|
36
|
+
from .commands.stream import stream_app
|
|
37
|
+
from .commands.sync import sync_app
|
|
38
|
+
from .commands.tool import tool_app
|
|
39
|
+
from .commands.version import update_command, version_command
|
|
40
|
+
from .commands.workspace import workspace_app
|
|
41
|
+
from .config_store import ConfigStore, resolve_config_dir
|
|
42
|
+
from .constants import EXIT_PERMISSION_DENIED
|
|
43
|
+
from .errors import ErrorCode, PermissionDeniedError
|
|
44
|
+
from .models import PermissionPolicy
|
|
45
|
+
from .output import OutputFormatter
|
|
46
|
+
from .permissions import PermissionEngine
|
|
47
|
+
from .services.agent_service import AgentService
|
|
48
|
+
from .services.branch_service import BranchService
|
|
49
|
+
from .services.component_service import ComponentService
|
|
50
|
+
from .services.config_service import ConfigService
|
|
51
|
+
from .services.data_app_git_service import DataAppGitService
|
|
52
|
+
from .services.data_app_service import DataAppService
|
|
53
|
+
from .services.deep_lineage_service import DeepLineageService
|
|
54
|
+
from .services.doctor_service import DoctorService
|
|
55
|
+
from .services.encrypt_service import EncryptService
|
|
56
|
+
from .services.feature_service import FeatureService
|
|
57
|
+
from .services.flow_service import FlowService
|
|
58
|
+
from .services.http_forwarder_service import HttpForwarderService
|
|
59
|
+
from .services.job_service import JobService
|
|
60
|
+
from .services.kai_service import KaiService
|
|
61
|
+
from .services.lineage_service import LineageService
|
|
62
|
+
from .services.mcp_service import McpService
|
|
63
|
+
from .services.member_service import MemberService
|
|
64
|
+
from .services.org_service import OrgService
|
|
65
|
+
from .services.project_service import ProjectService
|
|
66
|
+
from .services.repo_validate_service import RepoValidateService
|
|
67
|
+
from .services.schedule_service import ScheduleService
|
|
68
|
+
from .services.search_service import SearchService
|
|
69
|
+
from .services.semantic_layer_service import SemanticLayerService
|
|
70
|
+
from .services.sharing_service import SharingService
|
|
71
|
+
from .services.storage_service import StorageService
|
|
72
|
+
from .services.stream_service import StreamService
|
|
73
|
+
from .services.sync_service import SyncService
|
|
74
|
+
from .services.variables_service import VariablesService
|
|
75
|
+
from .services.version_service import VersionService
|
|
76
|
+
from .services.workspace_service import WorkspaceService
|
|
77
|
+
|
|
78
|
+
app = typer.Typer(
|
|
79
|
+
name="kbagent",
|
|
80
|
+
help="Keboola Agent CLI -- AI-friendly interface to Keboola projects",
|
|
81
|
+
invoke_without_command=True,
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
# -- Setup & Info --
|
|
85
|
+
_SETUP = "Setup & Info"
|
|
86
|
+
app.command("init", rich_help_panel=_SETUP)(init_command)
|
|
87
|
+
app.command("doctor", rich_help_panel=_SETUP)(doctor_command)
|
|
88
|
+
app.command("version", rich_help_panel=_SETUP)(version_command)
|
|
89
|
+
app.command("update", rich_help_panel=_SETUP)(update_command)
|
|
90
|
+
app.command("changelog", rich_help_panel=_SETUP)(changelog_command)
|
|
91
|
+
app.command("context", rich_help_panel=_SETUP)(context_command)
|
|
92
|
+
app.command("repl", rich_help_panel=_SETUP)(repl_command)
|
|
93
|
+
app.command("serve", rich_help_panel=_SETUP)(serve_command)
|
|
94
|
+
app.add_typer(permissions_app, name="permissions", rich_help_panel=_SETUP)
|
|
95
|
+
|
|
96
|
+
# -- Project Management --
|
|
97
|
+
_PROJ = "Project Management"
|
|
98
|
+
app.add_typer(project_app, name="project", rich_help_panel=_PROJ)
|
|
99
|
+
app.add_typer(org_app, name="org", rich_help_panel=_PROJ)
|
|
100
|
+
app.add_typer(feature_app, name="feature", rich_help_panel=_PROJ)
|
|
101
|
+
|
|
102
|
+
# -- Browse & Inspect --
|
|
103
|
+
_BROWSE = "Browse & Inspect"
|
|
104
|
+
app.add_typer(component_app, name="component", rich_help_panel=_BROWSE)
|
|
105
|
+
app.add_typer(config_app, name="config", rich_help_panel=_BROWSE)
|
|
106
|
+
app.command(
|
|
107
|
+
"search",
|
|
108
|
+
rich_help_panel=_BROWSE,
|
|
109
|
+
help="Search for items (tables, buckets, configs, flows, …) by name or content.",
|
|
110
|
+
no_args_is_help=True,
|
|
111
|
+
)(search_command)
|
|
112
|
+
app.add_typer(data_app_app, name="data-app", rich_help_panel=_BROWSE)
|
|
113
|
+
app.add_typer(job_app, name="job", rich_help_panel=_BROWSE)
|
|
114
|
+
app.add_typer(storage_app, name="storage", rich_help_panel=_BROWSE)
|
|
115
|
+
app.add_typer(stream_app, name="stream", rich_help_panel=_BROWSE)
|
|
116
|
+
app.add_typer(sharing_app, name="sharing", rich_help_panel=_BROWSE)
|
|
117
|
+
app.add_typer(lineage_app, name="lineage", rich_help_panel=_BROWSE)
|
|
118
|
+
app.add_typer(kai_app, name="kai", rich_help_panel=_BROWSE)
|
|
119
|
+
|
|
120
|
+
# -- Flows --
|
|
121
|
+
_FLOWS = "Flows"
|
|
122
|
+
app.add_typer(flow_app, name="flow", rich_help_panel=_FLOWS)
|
|
123
|
+
app.add_typer(schedule_app, name="schedule", rich_help_panel=_FLOWS)
|
|
124
|
+
|
|
125
|
+
# -- Development --
|
|
126
|
+
_DEV = "Development"
|
|
127
|
+
app.add_typer(branch_app, name="branch", rich_help_panel=_DEV)
|
|
128
|
+
app.add_typer(workspace_app, name="workspace", rich_help_panel=_DEV)
|
|
129
|
+
app.add_typer(tool_app, name="tool", rich_help_panel=_DEV)
|
|
130
|
+
app.add_typer(sync_app, name="sync", rich_help_panel=_DEV)
|
|
131
|
+
app.add_typer(encrypt_app, name="encrypt", rich_help_panel=_DEV)
|
|
132
|
+
app.add_typer(semantic_layer_app, name="semantic-layer", rich_help_panel=_DEV)
|
|
133
|
+
app.add_typer(semantic_layer_app, name="sl", rich_help_panel=_DEV, hidden=True)
|
|
134
|
+
app.add_typer(http_app, name="http", rich_help_panel=_DEV)
|
|
135
|
+
app.add_typer(agent_app, name="agent", rich_help_panel=_DEV)
|
|
136
|
+
app.add_typer(dev_portal_app, name="dev-portal", rich_help_panel=_DEV)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def apply_firewall_flags(
|
|
140
|
+
persisted: PermissionPolicy | None,
|
|
141
|
+
*,
|
|
142
|
+
deny_writes: bool,
|
|
143
|
+
deny_destructive: bool,
|
|
144
|
+
) -> PermissionPolicy | None:
|
|
145
|
+
"""Merge --deny-writes / --deny-destructive into the active policy for this invocation.
|
|
146
|
+
|
|
147
|
+
Session-only: does NOT touch config.json. If neither flag is set, the
|
|
148
|
+
persisted policy is returned unchanged (possibly None).
|
|
149
|
+
|
|
150
|
+
Merge semantics:
|
|
151
|
+
- A fresh session policy synthesized from the flags uses mode='allow'
|
|
152
|
+
so everything is allowed unless matched by the deny list.
|
|
153
|
+
- When a persisted policy already exists, the flag-implied deny patterns
|
|
154
|
+
are appended to its deny list (dedup); the mode is preserved. This is
|
|
155
|
+
strictly additive -- adding a flag never relaxes the persisted policy.
|
|
156
|
+
"""
|
|
157
|
+
if not deny_writes and not deny_destructive:
|
|
158
|
+
return persisted
|
|
159
|
+
|
|
160
|
+
extra_deny: list[str] = []
|
|
161
|
+
if deny_writes:
|
|
162
|
+
# cli:write pattern intentionally spans write+destructive+admin
|
|
163
|
+
# (permissions._matches_pattern lines 175-178). tool:write spans
|
|
164
|
+
# tool write+destructive. Wide net: --deny-writes blocks anything
|
|
165
|
+
# that mutates state.
|
|
166
|
+
extra_deny.extend(["cli:write", "tool:write"])
|
|
167
|
+
if deny_destructive:
|
|
168
|
+
# cli:destructive narrowly matches only ops categorized 'destructive'
|
|
169
|
+
# (data destruction). Admin and pure-write are left allowed by design:
|
|
170
|
+
# the two flags exist precisely so callers can opt into the narrower
|
|
171
|
+
# block without forfeiting writes (e.g. allow create-bucket, block
|
|
172
|
+
# delete-bucket).
|
|
173
|
+
extra_deny.extend(["cli:destructive", "tool:destructive"])
|
|
174
|
+
|
|
175
|
+
if persisted is None:
|
|
176
|
+
return PermissionPolicy(mode="allow", allow=[], deny=extra_deny)
|
|
177
|
+
|
|
178
|
+
# Preserve persisted mode, allow list; extend deny list without duplicates.
|
|
179
|
+
merged_deny = list(persisted.deny)
|
|
180
|
+
for pattern in extra_deny:
|
|
181
|
+
if pattern not in merged_deny:
|
|
182
|
+
merged_deny.append(pattern)
|
|
183
|
+
|
|
184
|
+
return PermissionPolicy(
|
|
185
|
+
mode=persisted.mode,
|
|
186
|
+
allow=list(persisted.allow),
|
|
187
|
+
deny=merged_deny,
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def _version_callback(value: bool) -> None:
|
|
192
|
+
"""Print version and exit -- standard `--version` flag for CLI tools."""
|
|
193
|
+
if value:
|
|
194
|
+
from . import __version__
|
|
195
|
+
|
|
196
|
+
typer.echo(f"kbagent v{__version__}")
|
|
197
|
+
raise typer.Exit()
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
@app.callback()
|
|
201
|
+
def main(
|
|
202
|
+
ctx: typer.Context,
|
|
203
|
+
_version: bool = typer.Option(
|
|
204
|
+
False,
|
|
205
|
+
"--version",
|
|
206
|
+
"-V",
|
|
207
|
+
callback=_version_callback,
|
|
208
|
+
is_eager=True,
|
|
209
|
+
help="Show version and exit.",
|
|
210
|
+
),
|
|
211
|
+
json_output: bool = typer.Option(
|
|
212
|
+
False,
|
|
213
|
+
"--json",
|
|
214
|
+
"-j",
|
|
215
|
+
help="Output in JSON format (for machine consumption)",
|
|
216
|
+
),
|
|
217
|
+
verbose: bool = typer.Option(
|
|
218
|
+
False,
|
|
219
|
+
"--verbose",
|
|
220
|
+
"-v",
|
|
221
|
+
help="Enable verbose output",
|
|
222
|
+
),
|
|
223
|
+
no_color: bool = typer.Option(
|
|
224
|
+
False,
|
|
225
|
+
"--no-color",
|
|
226
|
+
help="Disable colored output",
|
|
227
|
+
),
|
|
228
|
+
config_dir: str | None = typer.Option(
|
|
229
|
+
None,
|
|
230
|
+
"--config-dir",
|
|
231
|
+
help="Override config directory path.",
|
|
232
|
+
),
|
|
233
|
+
deny_writes: bool = typer.Option(
|
|
234
|
+
False,
|
|
235
|
+
"--deny-writes",
|
|
236
|
+
help="Session-only firewall: block write, destructive, AND admin "
|
|
237
|
+
"operations (the wide net -- project add/remove/edit, org setup, "
|
|
238
|
+
"storage writes and deletes, etc.). Merges with any persisted policy.",
|
|
239
|
+
),
|
|
240
|
+
deny_destructive: bool = typer.Option(
|
|
241
|
+
False,
|
|
242
|
+
"--deny-destructive",
|
|
243
|
+
help="Session-only firewall: block ONLY data-destructive operations "
|
|
244
|
+
"(storage delete-table/delete-bucket/delete-column, job terminate, "
|
|
245
|
+
"branch delete, etc.). Admin ops like 'project remove' and 'org setup' "
|
|
246
|
+
"are NOT blocked -- use --deny-writes for the wide net.",
|
|
247
|
+
),
|
|
248
|
+
allow_env_manage_token: bool = typer.Option(
|
|
249
|
+
False,
|
|
250
|
+
"--allow-env-manage-token",
|
|
251
|
+
help="Read KBC_MANAGE_API_TOKEN from the environment. Without this "
|
|
252
|
+
"flag the env var is ignored (with a warning) and an interactive "
|
|
253
|
+
"TTY prompt is required. Default-deny since 0.28.0; closes the "
|
|
254
|
+
"AI-exfiltration risk where subprocesses inherit the manage token.",
|
|
255
|
+
),
|
|
256
|
+
) -> None:
|
|
257
|
+
"""Global options applied to all commands."""
|
|
258
|
+
from .auto_update import maybe_auto_update, show_post_update_changelog
|
|
259
|
+
|
|
260
|
+
maybe_auto_update()
|
|
261
|
+
|
|
262
|
+
# If the user explicitly asked for `kbagent changelog`, they'll see the
|
|
263
|
+
# full changelog below -- prepending the "What's new" summary is pure
|
|
264
|
+
# duplication. Consume the trigger env var so it does not fire later
|
|
265
|
+
# on a different command.
|
|
266
|
+
if ctx.invoked_subcommand == "changelog":
|
|
267
|
+
import os as _os
|
|
268
|
+
|
|
269
|
+
from .changelog import ENV_UPDATED_FROM as _ENV_UPDATED_FROM
|
|
270
|
+
|
|
271
|
+
_os.environ.pop(_ENV_UPDATED_FROM, None)
|
|
272
|
+
else:
|
|
273
|
+
show_post_update_changelog()
|
|
274
|
+
|
|
275
|
+
# If no subcommand given, launch REPL on TTY or show help otherwise
|
|
276
|
+
if ctx.invoked_subcommand is None:
|
|
277
|
+
is_interactive = hasattr(sys.stdin, "isatty") and sys.stdin.isatty()
|
|
278
|
+
if is_interactive and not json_output:
|
|
279
|
+
# Defer REPL launch until after context setup (below)
|
|
280
|
+
ctx.ensure_object(dict)
|
|
281
|
+
ctx.obj["_launch_repl"] = True
|
|
282
|
+
else:
|
|
283
|
+
# Non-interactive: show help
|
|
284
|
+
click_cmd = typer.main.get_command(app)
|
|
285
|
+
with click_cmd.make_context("kbagent", []) as help_ctx:
|
|
286
|
+
sys.stdout.write(click_cmd.get_help(help_ctx) + "\n")
|
|
287
|
+
raise typer.Exit()
|
|
288
|
+
|
|
289
|
+
log_level = logging.DEBUG if verbose else logging.WARNING
|
|
290
|
+
logging.basicConfig(
|
|
291
|
+
level=log_level,
|
|
292
|
+
format="%(asctime)s %(name)s %(levelname)s %(message)s",
|
|
293
|
+
stream=sys.stderr,
|
|
294
|
+
)
|
|
295
|
+
|
|
296
|
+
is_tty = hasattr(sys.stdout, "isatty") and sys.stdout.isatty()
|
|
297
|
+
effective_no_color = no_color or not is_tty
|
|
298
|
+
|
|
299
|
+
formatter = OutputFormatter(
|
|
300
|
+
json_mode=json_output,
|
|
301
|
+
no_color=effective_no_color,
|
|
302
|
+
verbose=verbose,
|
|
303
|
+
)
|
|
304
|
+
|
|
305
|
+
resolved_dir, source = resolve_config_dir(cli_config_dir=config_dir)
|
|
306
|
+
config_store = ConfigStore(config_dir=resolved_dir, source=source)
|
|
307
|
+
|
|
308
|
+
project_service = ProjectService(config_store=config_store)
|
|
309
|
+
component_service = ComponentService(config_store=config_store)
|
|
310
|
+
config_service = ConfigService(config_store=config_store)
|
|
311
|
+
job_service = JobService(config_store=config_store)
|
|
312
|
+
lineage_service = LineageService(config_store=config_store)
|
|
313
|
+
deep_lineage_service = DeepLineageService(config_store=config_store)
|
|
314
|
+
org_service = OrgService(config_store=config_store)
|
|
315
|
+
member_service = MemberService(config_store=config_store)
|
|
316
|
+
feature_service = FeatureService(config_store=config_store)
|
|
317
|
+
mcp_service = McpService(config_store=config_store)
|
|
318
|
+
branch_service = BranchService(config_store=config_store)
|
|
319
|
+
sharing_service = SharingService(config_store=config_store)
|
|
320
|
+
search_service = SearchService(config_store=config_store)
|
|
321
|
+
storage_service = StorageService(config_store=config_store)
|
|
322
|
+
stream_service = StreamService(config_store=config_store)
|
|
323
|
+
sync_service = SyncService(config_store=config_store)
|
|
324
|
+
variables_service = VariablesService(config_store=config_store)
|
|
325
|
+
encrypt_service = EncryptService(config_store=config_store)
|
|
326
|
+
flow_service = FlowService(config_store=config_store)
|
|
327
|
+
schedule_service = ScheduleService(config_store=config_store)
|
|
328
|
+
workspace_service = WorkspaceService(config_store=config_store)
|
|
329
|
+
data_app_service = DataAppService(config_store=config_store)
|
|
330
|
+
data_app_git_service = DataAppGitService(config_store=config_store)
|
|
331
|
+
semantic_layer_service = SemanticLayerService(config_store=config_store)
|
|
332
|
+
repo_validate_service = RepoValidateService(config_store=config_store)
|
|
333
|
+
kai_service = KaiService(config_store=config_store)
|
|
334
|
+
doctor_service = DoctorService(config_store=config_store, mcp_service=mcp_service)
|
|
335
|
+
version_service = VersionService()
|
|
336
|
+
http_forwarder_service = HttpForwarderService()
|
|
337
|
+
agent_service = AgentService(config_store=config_store, mcp_service=mcp_service)
|
|
338
|
+
|
|
339
|
+
try:
|
|
340
|
+
config = config_store.load()
|
|
341
|
+
persisted_policy = config.permissions
|
|
342
|
+
except Exception:
|
|
343
|
+
# Config may be invalid (e.g. corrupted JSON) -- skip persisted policy
|
|
344
|
+
persisted_policy = None
|
|
345
|
+
|
|
346
|
+
session_policy = apply_firewall_flags(
|
|
347
|
+
persisted_policy,
|
|
348
|
+
deny_writes=deny_writes,
|
|
349
|
+
deny_destructive=deny_destructive,
|
|
350
|
+
)
|
|
351
|
+
permission_engine = PermissionEngine(session_policy)
|
|
352
|
+
|
|
353
|
+
ctx.ensure_object(dict)
|
|
354
|
+
ctx.obj["formatter"] = formatter
|
|
355
|
+
ctx.obj["json_output"] = json_output
|
|
356
|
+
ctx.obj["permission_engine"] = permission_engine
|
|
357
|
+
ctx.obj["verbose"] = verbose
|
|
358
|
+
ctx.obj["no_color"] = effective_no_color
|
|
359
|
+
ctx.obj["deny_writes"] = deny_writes
|
|
360
|
+
ctx.obj["deny_destructive"] = deny_destructive
|
|
361
|
+
ctx.obj["allow_env_manage_token"] = allow_env_manage_token
|
|
362
|
+
ctx.obj["config_store"] = config_store
|
|
363
|
+
ctx.obj["project_service"] = project_service
|
|
364
|
+
ctx.obj["component_service"] = component_service
|
|
365
|
+
ctx.obj["config_service"] = config_service
|
|
366
|
+
ctx.obj["job_service"] = job_service
|
|
367
|
+
ctx.obj["lineage_service"] = lineage_service
|
|
368
|
+
ctx.obj["deep_lineage_service"] = deep_lineage_service
|
|
369
|
+
ctx.obj["org_service"] = org_service
|
|
370
|
+
ctx.obj["member_service"] = member_service
|
|
371
|
+
ctx.obj["feature_service"] = feature_service
|
|
372
|
+
ctx.obj["mcp_service"] = mcp_service
|
|
373
|
+
ctx.obj["branch_service"] = branch_service
|
|
374
|
+
ctx.obj["sharing_service"] = sharing_service
|
|
375
|
+
ctx.obj["search_service"] = search_service
|
|
376
|
+
ctx.obj["storage_service"] = storage_service
|
|
377
|
+
ctx.obj["stream_service"] = stream_service
|
|
378
|
+
ctx.obj["sync_service"] = sync_service
|
|
379
|
+
ctx.obj["variables_service"] = variables_service
|
|
380
|
+
ctx.obj["encrypt_service"] = encrypt_service
|
|
381
|
+
ctx.obj["flow_service"] = flow_service
|
|
382
|
+
ctx.obj["schedule_service"] = schedule_service
|
|
383
|
+
ctx.obj["workspace_service"] = workspace_service
|
|
384
|
+
ctx.obj["data_app_service"] = data_app_service
|
|
385
|
+
ctx.obj["data_app_git_service"] = data_app_git_service
|
|
386
|
+
ctx.obj["semantic_layer_service"] = semantic_layer_service
|
|
387
|
+
ctx.obj["repo_validate_service"] = repo_validate_service
|
|
388
|
+
ctx.obj["kai_service"] = kai_service
|
|
389
|
+
ctx.obj["doctor_service"] = doctor_service
|
|
390
|
+
ctx.obj["version_service"] = version_service
|
|
391
|
+
ctx.obj["http_forwarder_service"] = http_forwarder_service
|
|
392
|
+
ctx.obj["agent_service"] = agent_service
|
|
393
|
+
|
|
394
|
+
# Warn if empty local config shadows global with projects (#104)
|
|
395
|
+
if source == "local" and not json_output and ctx.invoked_subcommand != "init":
|
|
396
|
+
try:
|
|
397
|
+
local_config = config_store.load()
|
|
398
|
+
if not local_config.projects:
|
|
399
|
+
import platformdirs as _platformdirs
|
|
400
|
+
|
|
401
|
+
_global_dir = Path(_platformdirs.user_config_dir("keboola-agent-cli"))
|
|
402
|
+
_global_path = _global_dir / "config.json"
|
|
403
|
+
if _global_path.is_file():
|
|
404
|
+
_global_store = ConfigStore(config_dir=_global_dir, source="global")
|
|
405
|
+
_global_config = _global_store.load()
|
|
406
|
+
if _global_config.projects:
|
|
407
|
+
_count = len(_global_config.projects)
|
|
408
|
+
formatter.warning(
|
|
409
|
+
f"Local workspace has no projects but global config has {_count}. "
|
|
410
|
+
f"Run 'kbagent init --from-global' to copy them, "
|
|
411
|
+
f"or remove {config_store.config_path.parent}/ to use global config."
|
|
412
|
+
)
|
|
413
|
+
except Exception:
|
|
414
|
+
pass # Don't let warning check crash the CLI
|
|
415
|
+
|
|
416
|
+
# Enforce permissions for top-level commands (sub-app commands use callbacks)
|
|
417
|
+
_top_level_commands = {
|
|
418
|
+
"init",
|
|
419
|
+
"doctor",
|
|
420
|
+
"version",
|
|
421
|
+
"update",
|
|
422
|
+
"changelog",
|
|
423
|
+
"context",
|
|
424
|
+
"repl",
|
|
425
|
+
"serve",
|
|
426
|
+
}
|
|
427
|
+
_is_help = "--help" in sys.argv or "-h" in sys.argv
|
|
428
|
+
|
|
429
|
+
if ctx.invoked_subcommand in _top_level_commands and not _is_help:
|
|
430
|
+
try:
|
|
431
|
+
permission_engine.check_or_raise(ctx.invoked_subcommand)
|
|
432
|
+
except PermissionDeniedError as exc:
|
|
433
|
+
formatter.error(message=exc.message, error_code=ErrorCode.PERMISSION_DENIED)
|
|
434
|
+
raise typer.Exit(code=EXIT_PERMISSION_DENIED) from None
|
|
435
|
+
|
|
436
|
+
# Launch REPL if no subcommand was given (set above)
|
|
437
|
+
if ctx.obj.get("_launch_repl"):
|
|
438
|
+
from .commands.repl import _run_repl
|
|
439
|
+
|
|
440
|
+
_run_repl(
|
|
441
|
+
json_mode=json_output,
|
|
442
|
+
verbose=verbose,
|
|
443
|
+
no_color=effective_no_color,
|
|
444
|
+
config_dir=config_dir,
|
|
445
|
+
deny_writes=deny_writes,
|
|
446
|
+
deny_destructive=deny_destructive,
|
|
447
|
+
)
|
|
448
|
+
raise typer.Exit()
|