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,325 @@
|
|
|
1
|
+
"""Persistent store for scheduled agent tasks.
|
|
2
|
+
|
|
3
|
+
Tasks are JSON, kept in ``<config_dir>/agents.json`` with 0600 permissions.
|
|
4
|
+
Histor each task's runs lives in ``<config_dir>/agent_runs/<task_id>.jsonl``
|
|
5
|
+
(one JSON object per line, append-only).
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import json
|
|
11
|
+
import logging
|
|
12
|
+
import os
|
|
13
|
+
import uuid
|
|
14
|
+
from datetime import UTC, datetime
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import Any, Literal
|
|
17
|
+
|
|
18
|
+
from pydantic import BaseModel, Field
|
|
19
|
+
|
|
20
|
+
logger = logging.getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
ActionType = Literal["mcp_tool", "cli_command", "ai_agent"]
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class AgentAction(BaseModel):
|
|
26
|
+
"""What the task does when triggered.
|
|
27
|
+
|
|
28
|
+
- ``mcp_tool``: call a keboola-mcp-server tool
|
|
29
|
+
params: { tool: "get_jobs", project: "padak", input: {...} }
|
|
30
|
+
- ``cli_command``: spawn ``kbagent <argv>`` and capture stdout
|
|
31
|
+
params: { argv: ["job", "list", "--project", "padak", "--status", "error"], timeout: 300 }
|
|
32
|
+
- ``ai_agent``: spawn an AI CLI (claude/codex/gemini) with a prompt
|
|
33
|
+
params: {
|
|
34
|
+
cli: "claude" | "codex" | "gemini",
|
|
35
|
+
prompt: "Check overnight job logs and summarize errors",
|
|
36
|
+
extra_args: ["--print", ...] (optional CLI-specific flags),
|
|
37
|
+
timeout: 600,
|
|
38
|
+
}
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
type: ActionType
|
|
42
|
+
params: dict[str, Any] = Field(default_factory=dict)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class Trigger(BaseModel):
|
|
46
|
+
"""Chain configuration: after an upstream task completes, optionally
|
|
47
|
+
run a downstream task with the upstream's run context attached.
|
|
48
|
+
|
|
49
|
+
The downstream's subprocess inherits ``KBAGENT_UPSTREAM_TASK_ID`` and
|
|
50
|
+
``KBAGENT_UPSTREAM_RUN_ID`` env vars; ``ai_agent`` action types
|
|
51
|
+
additionally get a one-line prompt prefix pointing at the upstream
|
|
52
|
+
run JSON they can pull via the kbagent HTTP API.
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
on: Literal["success", "error", "always"] = "success"
|
|
56
|
+
task_id: str
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class AgentTask(BaseModel):
|
|
60
|
+
"""A scheduled agent task.
|
|
61
|
+
|
|
62
|
+
Default: cron-driven by ``cron`` expression. With ``manual=True`` the
|
|
63
|
+
scheduler skips the task entirely; it only runs when triggered through
|
|
64
|
+
``POST /agents/{id}/run`` or as a downstream of another task's
|
|
65
|
+
``trigger``. ``cron`` is preserved on manual tasks so the operator can
|
|
66
|
+
flip back to scheduled mode without losing the schedule.
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
id: str = Field(default_factory=lambda: uuid.uuid4().hex[:12])
|
|
70
|
+
name: str
|
|
71
|
+
description: str = ""
|
|
72
|
+
cron: str = "0 * * * *" # default every hour, top of the hour
|
|
73
|
+
manual: bool = False
|
|
74
|
+
enabled: bool = True
|
|
75
|
+
action: AgentAction
|
|
76
|
+
trigger: Trigger | None = None
|
|
77
|
+
created_at: str = Field(default_factory=lambda: datetime.now(UTC).isoformat())
|
|
78
|
+
last_run_at: str | None = None
|
|
79
|
+
next_run_at: str | None = None
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class AgentRun(BaseModel):
|
|
83
|
+
"""One execution of a task.
|
|
84
|
+
|
|
85
|
+
The ``output`` field carries the final terminal payload (response text,
|
|
86
|
+
exit code, stderr) so old clients keep working. Newer fields:
|
|
87
|
+
|
|
88
|
+
- ``summary``: aggregated metrics produced by ``pricing.build_run_summary``
|
|
89
|
+
(model, token totals, cost breakdown, per-tool call counts). Always
|
|
90
|
+
present for ai_agent runs after v0.10.x; ``None`` for cli_command /
|
|
91
|
+
mcp_tool runs (no per-step structure to summarize).
|
|
92
|
+
- ``events_path``: relative path under the store's run directory pointing
|
|
93
|
+
at ``<task_id>/<run_id>.jsonl`` -- the full event timeline as it was
|
|
94
|
+
streamed live. Lets the detail drawer "replay" a finished run with the
|
|
95
|
+
same per-step UI shown during the live run.
|
|
96
|
+
"""
|
|
97
|
+
|
|
98
|
+
run_id: str = Field(default_factory=lambda: uuid.uuid4().hex[:12])
|
|
99
|
+
task_id: str
|
|
100
|
+
started_at: str
|
|
101
|
+
ended_at: str | None = None
|
|
102
|
+
status: Literal["running", "ok", "error"] = "running"
|
|
103
|
+
output: dict[str, Any] | None = None
|
|
104
|
+
error: str | None = None
|
|
105
|
+
summary: dict[str, Any] | None = None
|
|
106
|
+
events_path: str | None = None
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class AgentStore:
|
|
110
|
+
"""File-based agent task + run history persistence."""
|
|
111
|
+
|
|
112
|
+
def __init__(self, config_dir: Path) -> None:
|
|
113
|
+
self._config_dir = config_dir
|
|
114
|
+
self._agents_path = config_dir / "agents.json"
|
|
115
|
+
self._runs_dir = config_dir / "agent_runs"
|
|
116
|
+
|
|
117
|
+
def _ensure_dirs(self) -> None:
|
|
118
|
+
self._config_dir.mkdir(parents=True, exist_ok=True, mode=0o700)
|
|
119
|
+
self._runs_dir.mkdir(parents=True, exist_ok=True, mode=0o700)
|
|
120
|
+
|
|
121
|
+
def load_tasks(self) -> list[AgentTask]:
|
|
122
|
+
if not self._agents_path.exists():
|
|
123
|
+
return []
|
|
124
|
+
try:
|
|
125
|
+
raw = json.loads(self._agents_path.read_text(encoding="utf-8"))
|
|
126
|
+
except (OSError, json.JSONDecodeError) as exc:
|
|
127
|
+
logger.warning("agents.json invalid; ignoring (%s)", exc)
|
|
128
|
+
return []
|
|
129
|
+
if not isinstance(raw, list):
|
|
130
|
+
return []
|
|
131
|
+
result: list[AgentTask] = []
|
|
132
|
+
for item in raw:
|
|
133
|
+
try:
|
|
134
|
+
result.append(AgentTask.model_validate(item))
|
|
135
|
+
except Exception as exc:
|
|
136
|
+
logger.warning("Skipping invalid agent entry: %s", exc)
|
|
137
|
+
return result
|
|
138
|
+
|
|
139
|
+
def save_tasks(self, tasks: list[AgentTask]) -> None:
|
|
140
|
+
self._ensure_dirs()
|
|
141
|
+
payload = [t.model_dump(mode="json") for t in tasks]
|
|
142
|
+
tmp = self._agents_path.with_suffix(".tmp")
|
|
143
|
+
fd = os.open(str(tmp), os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o600)
|
|
144
|
+
try:
|
|
145
|
+
os.write(fd, (json.dumps(payload, indent=2) + "\n").encode("utf-8"))
|
|
146
|
+
finally:
|
|
147
|
+
os.close(fd)
|
|
148
|
+
os.replace(str(tmp), str(self._agents_path))
|
|
149
|
+
|
|
150
|
+
def upsert_task(self, task: AgentTask) -> AgentTask:
|
|
151
|
+
tasks = self.load_tasks()
|
|
152
|
+
idx = next((i for i, t in enumerate(tasks) if t.id == task.id), None)
|
|
153
|
+
if idx is None:
|
|
154
|
+
tasks.append(task)
|
|
155
|
+
else:
|
|
156
|
+
tasks[idx] = task
|
|
157
|
+
self.save_tasks(tasks)
|
|
158
|
+
return task
|
|
159
|
+
|
|
160
|
+
def delete_task(self, task_id: str) -> bool:
|
|
161
|
+
tasks = self.load_tasks()
|
|
162
|
+
new = [t for t in tasks if t.id != task_id]
|
|
163
|
+
if len(new) == len(tasks):
|
|
164
|
+
return False
|
|
165
|
+
self.save_tasks(new)
|
|
166
|
+
return True
|
|
167
|
+
|
|
168
|
+
def get_task(self, task_id: str) -> AgentTask | None:
|
|
169
|
+
return next((t for t in self.load_tasks() if t.id == task_id), None)
|
|
170
|
+
|
|
171
|
+
# ---- run history ---------------------------------------------------
|
|
172
|
+
|
|
173
|
+
def append_run(self, run: AgentRun) -> None:
|
|
174
|
+
self._ensure_dirs()
|
|
175
|
+
path = self._runs_dir / f"{run.task_id}.jsonl"
|
|
176
|
+
with path.open("a", encoding="utf-8") as fh:
|
|
177
|
+
fh.write(json.dumps(run.model_dump(mode="json"), ensure_ascii=False) + "\n")
|
|
178
|
+
|
|
179
|
+
def list_runs(self, task_id: str, limit: int = 50) -> list[AgentRun]:
|
|
180
|
+
path = self._runs_dir / f"{task_id}.jsonl"
|
|
181
|
+
if not path.exists():
|
|
182
|
+
return []
|
|
183
|
+
lines = path.read_text(encoding="utf-8").splitlines()
|
|
184
|
+
runs: list[AgentRun] = []
|
|
185
|
+
for line in reversed(lines):
|
|
186
|
+
line = line.strip()
|
|
187
|
+
if not line:
|
|
188
|
+
continue
|
|
189
|
+
try:
|
|
190
|
+
runs.append(AgentRun.model_validate_json(line))
|
|
191
|
+
except Exception:
|
|
192
|
+
continue
|
|
193
|
+
if len(runs) >= limit:
|
|
194
|
+
break
|
|
195
|
+
return runs
|
|
196
|
+
|
|
197
|
+
# ---- per-run event timeline (since v0.10.x) ------------------------
|
|
198
|
+
# Events are stored separately from the run summary to keep the
|
|
199
|
+
# row-level <task_id>.jsonl small (one line per run for fast listing)
|
|
200
|
+
# while letting the detail view fetch the full timeline on demand.
|
|
201
|
+
|
|
202
|
+
def _events_path(self, task_id: str, run_id: str) -> Path:
|
|
203
|
+
"""Filesystem path for a run's full event timeline JSONL."""
|
|
204
|
+
return self._runs_dir / task_id / f"{run_id}.jsonl"
|
|
205
|
+
|
|
206
|
+
def append_events(self, task_id: str, run_id: str, events: list[dict[str, Any]]) -> str:
|
|
207
|
+
"""Persist the full event stream for one run, return the relative path.
|
|
208
|
+
|
|
209
|
+
File layout: ``<runs_dir>/<task_id>/<run_id>.jsonl`` with one JSON
|
|
210
|
+
object per line (the same shape that ``stream_ai_agent_events``
|
|
211
|
+
emits, plus the ``seq`` tag from ``RunBroadcaster``).
|
|
212
|
+
|
|
213
|
+
Empty event lists still create an empty file so callers can later
|
|
214
|
+
distinguish "no timeline persisted" (path is None) from "agent
|
|
215
|
+
produced nothing" (file exists, zero lines).
|
|
216
|
+
"""
|
|
217
|
+
self._ensure_dirs()
|
|
218
|
+
path = self._events_path(task_id, run_id)
|
|
219
|
+
path.parent.mkdir(parents=True, exist_ok=True, mode=0o700)
|
|
220
|
+
# 0600: events can leak Storage tokens via tool inputs (e.g. MCP
|
|
221
|
+
# tool calls dump full project context); same security posture as
|
|
222
|
+
# the rest of config_dir.
|
|
223
|
+
fd = os.open(str(path), os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o600)
|
|
224
|
+
try:
|
|
225
|
+
for evt in events:
|
|
226
|
+
line = json.dumps(evt, ensure_ascii=False) + "\n"
|
|
227
|
+
os.write(fd, line.encode("utf-8"))
|
|
228
|
+
finally:
|
|
229
|
+
os.close(fd)
|
|
230
|
+
# Return the relative path for storage on the AgentRun record.
|
|
231
|
+
# Resolving back to absolute is the store's job, not the caller's.
|
|
232
|
+
return f"{task_id}/{run_id}.jsonl"
|
|
233
|
+
|
|
234
|
+
def load_events(self, task_id: str, run_id: str) -> list[dict[str, Any]] | None:
|
|
235
|
+
"""Load a run's event timeline, or ``None`` if no timeline was saved."""
|
|
236
|
+
path = self._events_path(task_id, run_id)
|
|
237
|
+
if not path.exists():
|
|
238
|
+
return None
|
|
239
|
+
events: list[dict[str, Any]] = []
|
|
240
|
+
for line in path.read_text(encoding="utf-8").splitlines():
|
|
241
|
+
line = line.strip()
|
|
242
|
+
if not line:
|
|
243
|
+
continue
|
|
244
|
+
try:
|
|
245
|
+
events.append(json.loads(line))
|
|
246
|
+
except json.JSONDecodeError:
|
|
247
|
+
# One bad line should not poison the whole replay; the
|
|
248
|
+
# frontend just sees a slightly shorter timeline.
|
|
249
|
+
logger.warning("Skipping malformed event line in %s", path)
|
|
250
|
+
continue
|
|
251
|
+
return events
|
|
252
|
+
|
|
253
|
+
def get_run(self, task_id: str, run_id: str) -> AgentRun | None:
|
|
254
|
+
"""Find a single run record by run_id (linear scan, OK for <1000 runs)."""
|
|
255
|
+
for run in self.list_runs(task_id, limit=10_000):
|
|
256
|
+
if run.run_id == run_id:
|
|
257
|
+
return run
|
|
258
|
+
return None
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
# ── Boundary helpers (shared between REST router + CLI service) ─────
|
|
262
|
+
# Kept here (next to the types they operate on) so REST endpoints and the
|
|
263
|
+
# CLI service stay in lock-step. Both import these directly. Raise
|
|
264
|
+
# ValueError; callers translate to their preferred error envelope.
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
def validate_trigger(
|
|
268
|
+
store: AgentStore, trigger: Trigger | None, *, owner_task_id: str | None = None
|
|
269
|
+
) -> None:
|
|
270
|
+
"""Reject obviously broken trigger configs at the API/CLI boundary.
|
|
271
|
+
|
|
272
|
+
- downstream task_id must exist
|
|
273
|
+
- no self-loop (task triggering itself)
|
|
274
|
+
|
|
275
|
+
Deeper cycle detection (A->B->A) is left to runtime safety; the value of
|
|
276
|
+
a deep check here is low compared to the implementation cost.
|
|
277
|
+
|
|
278
|
+
Raises:
|
|
279
|
+
ValueError: with a human-readable message when the trigger is invalid.
|
|
280
|
+
"""
|
|
281
|
+
if trigger is None:
|
|
282
|
+
return
|
|
283
|
+
if owner_task_id is not None and trigger.task_id == owner_task_id:
|
|
284
|
+
raise ValueError("Trigger target cannot be the task itself (would self-loop).")
|
|
285
|
+
if store.get_task(trigger.task_id) is None:
|
|
286
|
+
raise ValueError(f"Trigger target task '{trigger.task_id}' not found.")
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
def merge_runtime_input(task: AgentTask, runtime_input: dict[str, Any] | None) -> AgentTask:
|
|
290
|
+
"""Return a shallow-copied task with runtime_input merged into its action.
|
|
291
|
+
|
|
292
|
+
The original task is NOT mutated; we copy because the scheduler-side
|
|
293
|
+
``run_task_once`` persists ``task.last_run_at`` / ``next_run_at`` on the
|
|
294
|
+
real stored task, not on the merged ghost.
|
|
295
|
+
|
|
296
|
+
Per-action-type semantics:
|
|
297
|
+
- ``ai_agent``: ``runtime_input.prompt`` (string) is appended to the
|
|
298
|
+
persisted prompt as a labeled section so the AI sees both the
|
|
299
|
+
operator's static instructions and the runtime ask.
|
|
300
|
+
- ``cli_command``: ``runtime_input.argv`` (list of strings) is appended
|
|
301
|
+
to the persisted argv list.
|
|
302
|
+
- ``mcp_tool``: ``runtime_input`` (dict) is shallow-merged into the
|
|
303
|
+
persisted MCP tool input, with runtime keys winning on conflict.
|
|
304
|
+
"""
|
|
305
|
+
if not runtime_input:
|
|
306
|
+
return task
|
|
307
|
+
merged_params = dict(task.action.params)
|
|
308
|
+
if task.action.type == "ai_agent":
|
|
309
|
+
extra = runtime_input.get("prompt")
|
|
310
|
+
if isinstance(extra, str) and extra.strip():
|
|
311
|
+
base_prompt = str(merged_params.get("prompt", ""))
|
|
312
|
+
merged_params["prompt"] = (
|
|
313
|
+
f"{base_prompt}\n\n[Operator's runtime input for this run]\n{extra.strip()}"
|
|
314
|
+
)
|
|
315
|
+
elif task.action.type == "cli_command":
|
|
316
|
+
extra_argv = runtime_input.get("argv")
|
|
317
|
+
if isinstance(extra_argv, list) and extra_argv:
|
|
318
|
+
base_argv = list(merged_params.get("argv") or [])
|
|
319
|
+
merged_params["argv"] = [*base_argv, *(str(a) for a in extra_argv)]
|
|
320
|
+
elif task.action.type == "mcp_tool":
|
|
321
|
+
base_input = dict(merged_params.get("input") or {})
|
|
322
|
+
base_input.update(runtime_input)
|
|
323
|
+
merged_params["input"] = base_input
|
|
324
|
+
merged_action = AgentAction(type=task.action.type, params=merged_params)
|
|
325
|
+
return task.model_copy(update={"action": merged_action})
|