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.
Files changed (306) hide show
  1. keboola_agent_cli/__init__.py +34 -0
  2. keboola_agent_cli/__main__.py +5 -0
  3. keboola_agent_cli/_ui_dist/assets/arc-DhFYIddx.js +2 -0
  4. keboola_agent_cli/_ui_dist/assets/arc-DhFYIddx.js.map +1 -0
  5. keboola_agent_cli/_ui_dist/assets/architecture-7EHR7CIX-hNCijx_H.js +1 -0
  6. keboola_agent_cli/_ui_dist/assets/architectureDiagram-3BPJPVTR-C6hUlprM.js +37 -0
  7. keboola_agent_cli/_ui_dist/assets/architectureDiagram-3BPJPVTR-C6hUlprM.js.map +1 -0
  8. keboola_agent_cli/_ui_dist/assets/array-BifhSqXX.js +2 -0
  9. keboola_agent_cli/_ui_dist/assets/array-BifhSqXX.js.map +1 -0
  10. keboola_agent_cli/_ui_dist/assets/blockDiagram-GPEHLZMM-DC7qY9i4.js +133 -0
  11. keboola_agent_cli/_ui_dist/assets/blockDiagram-GPEHLZMM-DC7qY9i4.js.map +1 -0
  12. keboola_agent_cli/_ui_dist/assets/c4Diagram-AAUBKEIU-5Lh44evt.js +11 -0
  13. keboola_agent_cli/_ui_dist/assets/c4Diagram-AAUBKEIU-5Lh44evt.js.map +1 -0
  14. keboola_agent_cli/_ui_dist/assets/channel-DBMrXlxx.js +2 -0
  15. keboola_agent_cli/_ui_dist/assets/channel-DBMrXlxx.js.map +1 -0
  16. keboola_agent_cli/_ui_dist/assets/chunk-2J33WTMH-Coy82EBh.js +2 -0
  17. keboola_agent_cli/_ui_dist/assets/chunk-2J33WTMH-Coy82EBh.js.map +1 -0
  18. keboola_agent_cli/_ui_dist/assets/chunk-3OPIFGDE-BQC5CRHI.js +63 -0
  19. keboola_agent_cli/_ui_dist/assets/chunk-3OPIFGDE-BQC5CRHI.js.map +1 -0
  20. keboola_agent_cli/_ui_dist/assets/chunk-4BX2VUAB-DUuEt70o.js +2 -0
  21. keboola_agent_cli/_ui_dist/assets/chunk-4BX2VUAB-DUuEt70o.js.map +1 -0
  22. keboola_agent_cli/_ui_dist/assets/chunk-55IACEB6-BvR-6chF.js +2 -0
  23. keboola_agent_cli/_ui_dist/assets/chunk-55IACEB6-BvR-6chF.js.map +1 -0
  24. keboola_agent_cli/_ui_dist/assets/chunk-5ZQYHXKU-BjcTN7ul.js +3 -0
  25. keboola_agent_cli/_ui_dist/assets/chunk-5ZQYHXKU-BjcTN7ul.js.map +1 -0
  26. keboola_agent_cli/_ui_dist/assets/chunk-727SXJPM-C0zxqqRN.js +207 -0
  27. keboola_agent_cli/_ui_dist/assets/chunk-727SXJPM-C0zxqqRN.js.map +1 -0
  28. keboola_agent_cli/_ui_dist/assets/chunk-AQP2D5EJ-CXf7rIlZ.js +232 -0
  29. keboola_agent_cli/_ui_dist/assets/chunk-AQP2D5EJ-CXf7rIlZ.js.map +1 -0
  30. keboola_agent_cli/_ui_dist/assets/chunk-BSJP7CBP-Oj_FO9Q7.js +2 -0
  31. keboola_agent_cli/_ui_dist/assets/chunk-BSJP7CBP-Oj_FO9Q7.js.map +1 -0
  32. keboola_agent_cli/_ui_dist/assets/chunk-CSCIHK7Q-CcTsLrFc.js +124 -0
  33. keboola_agent_cli/_ui_dist/assets/chunk-CSCIHK7Q-CcTsLrFc.js.map +1 -0
  34. keboola_agent_cli/_ui_dist/assets/chunk-FMBD7UC4-FH-zLkkW.js +16 -0
  35. keboola_agent_cli/_ui_dist/assets/chunk-FMBD7UC4-FH-zLkkW.js.map +1 -0
  36. keboola_agent_cli/_ui_dist/assets/chunk-L5ZTLDWV-B1Ky_e7O.js +2 -0
  37. keboola_agent_cli/_ui_dist/assets/chunk-L5ZTLDWV-B1Ky_e7O.js.map +1 -0
  38. keboola_agent_cli/_ui_dist/assets/chunk-ND2GUHAM-BHz1rpbm.js +2 -0
  39. keboola_agent_cli/_ui_dist/assets/chunk-ND2GUHAM-BHz1rpbm.js.map +1 -0
  40. keboola_agent_cli/_ui_dist/assets/chunk-NNHCCRGN-DlpIbxXb.js +160 -0
  41. keboola_agent_cli/_ui_dist/assets/chunk-NNHCCRGN-DlpIbxXb.js.map +1 -0
  42. keboola_agent_cli/_ui_dist/assets/chunk-NZK2D7GU-tnrSoegS.js +2 -0
  43. keboola_agent_cli/_ui_dist/assets/chunk-NZK2D7GU-tnrSoegS.js.map +1 -0
  44. keboola_agent_cli/_ui_dist/assets/chunk-O5CBEL6O-DxxqDH0l.js +71 -0
  45. keboola_agent_cli/_ui_dist/assets/chunk-O5CBEL6O-DxxqDH0l.js.map +1 -0
  46. keboola_agent_cli/_ui_dist/assets/chunk-QZHKN3VN-CSjc2gjj.js +2 -0
  47. keboola_agent_cli/_ui_dist/assets/chunk-QZHKN3VN-CSjc2gjj.js.map +1 -0
  48. keboola_agent_cli/_ui_dist/assets/classDiagram-4FO5ZUOK-BuZcZu85.js +2 -0
  49. keboola_agent_cli/_ui_dist/assets/classDiagram-4FO5ZUOK-BuZcZu85.js.map +1 -0
  50. keboola_agent_cli/_ui_dist/assets/classDiagram-v2-Q7XG4LA2-BuZcZu85.js +2 -0
  51. keboola_agent_cli/_ui_dist/assets/classDiagram-v2-Q7XG4LA2-BuZcZu85.js.map +1 -0
  52. keboola_agent_cli/_ui_dist/assets/cose-bilkent-S5V4N54A-Y0L8LDMa.js +2 -0
  53. keboola_agent_cli/_ui_dist/assets/cose-bilkent-S5V4N54A-Y0L8LDMa.js.map +1 -0
  54. keboola_agent_cli/_ui_dist/assets/cytoscape.esm-C8YCVR3_.js +322 -0
  55. keboola_agent_cli/_ui_dist/assets/cytoscape.esm-C8YCVR3_.js.map +1 -0
  56. keboola_agent_cli/_ui_dist/assets/dagre-BM42HDAG-UZ-9BTqF.js +5 -0
  57. keboola_agent_cli/_ui_dist/assets/dagre-BM42HDAG-UZ-9BTqF.js.map +1 -0
  58. keboola_agent_cli/_ui_dist/assets/dagre-Bx709z4p.js +2 -0
  59. keboola_agent_cli/_ui_dist/assets/dagre-Bx709z4p.js.map +1 -0
  60. keboola_agent_cli/_ui_dist/assets/defaultLocale-C8Fc0cco.js +2 -0
  61. keboola_agent_cli/_ui_dist/assets/defaultLocale-C8Fc0cco.js.map +1 -0
  62. keboola_agent_cli/_ui_dist/assets/diagram-2AECGRRQ-DoDQ60wi.js +44 -0
  63. keboola_agent_cli/_ui_dist/assets/diagram-2AECGRRQ-DoDQ60wi.js.map +1 -0
  64. keboola_agent_cli/_ui_dist/assets/diagram-5GNKFQAL-CMGFxpUs.js +11 -0
  65. keboola_agent_cli/_ui_dist/assets/diagram-5GNKFQAL-CMGFxpUs.js.map +1 -0
  66. keboola_agent_cli/_ui_dist/assets/diagram-KO2AKTUF-1uGDa-Iu.js +4 -0
  67. keboola_agent_cli/_ui_dist/assets/diagram-KO2AKTUF-1uGDa-Iu.js.map +1 -0
  68. keboola_agent_cli/_ui_dist/assets/diagram-LMA3HP47-XtFH7B51.js +25 -0
  69. keboola_agent_cli/_ui_dist/assets/diagram-LMA3HP47-XtFH7B51.js.map +1 -0
  70. keboola_agent_cli/_ui_dist/assets/diagram-OG6HWLK6-B4_Te1T5.js +25 -0
  71. keboola_agent_cli/_ui_dist/assets/diagram-OG6HWLK6-B4_Te1T5.js.map +1 -0
  72. keboola_agent_cli/_ui_dist/assets/dist-Di6zmlv0.js +2 -0
  73. keboola_agent_cli/_ui_dist/assets/dist-Di6zmlv0.js.map +1 -0
  74. keboola_agent_cli/_ui_dist/assets/erDiagram-TEJ5UH35-NjQkrdFt.js +86 -0
  75. keboola_agent_cli/_ui_dist/assets/erDiagram-TEJ5UH35-NjQkrdFt.js.map +1 -0
  76. keboola_agent_cli/_ui_dist/assets/eventmodeling-FCH6USID-BrJMIks8.js +1 -0
  77. keboola_agent_cli/_ui_dist/assets/flowDiagram-I6XJVG4X-CIr8DWl7.js +163 -0
  78. keboola_agent_cli/_ui_dist/assets/flowDiagram-I6XJVG4X-CIr8DWl7.js.map +1 -0
  79. keboola_agent_cli/_ui_dist/assets/ganttDiagram-6RSMTGT7-C1VY_xbQ.js +293 -0
  80. keboola_agent_cli/_ui_dist/assets/ganttDiagram-6RSMTGT7-C1VY_xbQ.js.map +1 -0
  81. keboola_agent_cli/_ui_dist/assets/gitGraph-WXDBUCRP-COacYjo-.js +1 -0
  82. keboola_agent_cli/_ui_dist/assets/gitGraphDiagram-PVQCEYII-DQT8-kg2.js +107 -0
  83. keboola_agent_cli/_ui_dist/assets/gitGraphDiagram-PVQCEYII-DQT8-kg2.js.map +1 -0
  84. keboola_agent_cli/_ui_dist/assets/graphlib-B8gBHxth.js +2 -0
  85. keboola_agent_cli/_ui_dist/assets/graphlib-B8gBHxth.js.map +1 -0
  86. keboola_agent_cli/_ui_dist/assets/index-CMq50kkV.css +1 -0
  87. keboola_agent_cli/_ui_dist/assets/index-D8W97DAz.js +118 -0
  88. keboola_agent_cli/_ui_dist/assets/index-D8W97DAz.js.map +1 -0
  89. keboola_agent_cli/_ui_dist/assets/info-J43DQDTF-DdCTRIzU.js +1 -0
  90. keboola_agent_cli/_ui_dist/assets/infoDiagram-5YYISTIA-C77rsoTp.js +3 -0
  91. keboola_agent_cli/_ui_dist/assets/infoDiagram-5YYISTIA-C77rsoTp.js.map +1 -0
  92. keboola_agent_cli/_ui_dist/assets/init-D6jRqBbL.js +2 -0
  93. keboola_agent_cli/_ui_dist/assets/init-D6jRqBbL.js.map +1 -0
  94. keboola_agent_cli/_ui_dist/assets/ishikawaDiagram-YF4QCWOH-BcTbXaLy.js +71 -0
  95. keboola_agent_cli/_ui_dist/assets/ishikawaDiagram-YF4QCWOH-BcTbXaLy.js.map +1 -0
  96. keboola_agent_cli/_ui_dist/assets/journeyDiagram-JHISSGLW-BejeAJQ_.js +140 -0
  97. keboola_agent_cli/_ui_dist/assets/journeyDiagram-JHISSGLW-BejeAJQ_.js.map +1 -0
  98. keboola_agent_cli/_ui_dist/assets/kanban-definition-UN3LZRKU-BRNz_UrH.js +90 -0
  99. keboola_agent_cli/_ui_dist/assets/kanban-definition-UN3LZRKU-BRNz_UrH.js.map +1 -0
  100. keboola_agent_cli/_ui_dist/assets/katex-C4eR7coU.js +258 -0
  101. keboola_agent_cli/_ui_dist/assets/katex-C4eR7coU.js.map +1 -0
  102. keboola_agent_cli/_ui_dist/assets/line-CzAQKFbJ.js +2 -0
  103. keboola_agent_cli/_ui_dist/assets/line-CzAQKFbJ.js.map +1 -0
  104. keboola_agent_cli/_ui_dist/assets/linear-DUNFFdck.js +2 -0
  105. keboola_agent_cli/_ui_dist/assets/linear-DUNFFdck.js.map +1 -0
  106. keboola_agent_cli/_ui_dist/assets/mermaid-parser.core-CpuBOkFa.js +5 -0
  107. keboola_agent_cli/_ui_dist/assets/mermaid-parser.core-CpuBOkFa.js.map +1 -0
  108. keboola_agent_cli/_ui_dist/assets/mindmap-definition-RKZ34NQL-9EJQNjH0.js +97 -0
  109. keboola_agent_cli/_ui_dist/assets/mindmap-definition-RKZ34NQL-9EJQNjH0.js.map +1 -0
  110. keboola_agent_cli/_ui_dist/assets/ordinal-hYBb2elL.js +2 -0
  111. keboola_agent_cli/_ui_dist/assets/ordinal-hYBb2elL.js.map +1 -0
  112. keboola_agent_cli/_ui_dist/assets/packet-YPE3B663-DLiiw_B2.js +1 -0
  113. keboola_agent_cli/_ui_dist/assets/path-BWPyau1x.js +2 -0
  114. keboola_agent_cli/_ui_dist/assets/path-BWPyau1x.js.map +1 -0
  115. keboola_agent_cli/_ui_dist/assets/pie-LRSECV5Y-CRoO8G1g.js +1 -0
  116. keboola_agent_cli/_ui_dist/assets/pieDiagram-4H26LBE5-XH4cy6Cb.js +31 -0
  117. keboola_agent_cli/_ui_dist/assets/pieDiagram-4H26LBE5-XH4cy6Cb.js.map +1 -0
  118. keboola_agent_cli/_ui_dist/assets/quadrantDiagram-W4KKPZXB-fdhc93U8.js +8 -0
  119. keboola_agent_cli/_ui_dist/assets/quadrantDiagram-W4KKPZXB-fdhc93U8.js.map +1 -0
  120. keboola_agent_cli/_ui_dist/assets/radar-GUYGQ44K-DAlLVJHm.js +1 -0
  121. keboola_agent_cli/_ui_dist/assets/requirementDiagram-4Y6WPE33-a94eP3R9.js +85 -0
  122. keboola_agent_cli/_ui_dist/assets/requirementDiagram-4Y6WPE33-a94eP3R9.js.map +1 -0
  123. keboola_agent_cli/_ui_dist/assets/rough.esm-CSKSodPl.js +2 -0
  124. keboola_agent_cli/_ui_dist/assets/rough.esm-CSKSodPl.js.map +1 -0
  125. keboola_agent_cli/_ui_dist/assets/sankeyDiagram-5OEKKPKP-jcBa02sp.js +41 -0
  126. keboola_agent_cli/_ui_dist/assets/sankeyDiagram-5OEKKPKP-jcBa02sp.js.map +1 -0
  127. keboola_agent_cli/_ui_dist/assets/sequenceDiagram-3UESZ5HK-A5-GGM-e.js +163 -0
  128. keboola_agent_cli/_ui_dist/assets/sequenceDiagram-3UESZ5HK-A5-GGM-e.js.map +1 -0
  129. keboola_agent_cli/_ui_dist/assets/src-ZI-V_AF0.js +2 -0
  130. keboola_agent_cli/_ui_dist/assets/src-ZI-V_AF0.js.map +1 -0
  131. keboola_agent_cli/_ui_dist/assets/stateDiagram-AJRCARHV-BKAA5rqE.js +2 -0
  132. keboola_agent_cli/_ui_dist/assets/stateDiagram-AJRCARHV-BKAA5rqE.js.map +1 -0
  133. keboola_agent_cli/_ui_dist/assets/stateDiagram-v2-BHNVJYJU-DnJwJBsE.js +2 -0
  134. keboola_agent_cli/_ui_dist/assets/stateDiagram-v2-BHNVJYJU-DnJwJBsE.js.map +1 -0
  135. keboola_agent_cli/_ui_dist/assets/timeline-definition-PNZ67QCA-Cy39jp8b.js +121 -0
  136. keboola_agent_cli/_ui_dist/assets/timeline-definition-PNZ67QCA-Cy39jp8b.js.map +1 -0
  137. keboola_agent_cli/_ui_dist/assets/treeView-BLDUP644-DbLYl23-.js +1 -0
  138. keboola_agent_cli/_ui_dist/assets/treemap-LRROVOQU-Bp0eGlOt.js +1 -0
  139. keboola_agent_cli/_ui_dist/assets/vennDiagram-CIIHVFJN-BGECKubd.js +35 -0
  140. keboola_agent_cli/_ui_dist/assets/vennDiagram-CIIHVFJN-BGECKubd.js.map +1 -0
  141. keboola_agent_cli/_ui_dist/assets/wardley-L42UT6IY-D4yH4jqS.js +1 -0
  142. keboola_agent_cli/_ui_dist/assets/wardleyDiagram-YWT4CUSO-D6XRG3cZ.js +79 -0
  143. keboola_agent_cli/_ui_dist/assets/wardleyDiagram-YWT4CUSO-D6XRG3cZ.js.map +1 -0
  144. keboola_agent_cli/_ui_dist/assets/xychartDiagram-2RQKCTM6-DRre-pfZ.js +8 -0
  145. keboola_agent_cli/_ui_dist/assets/xychartDiagram-2RQKCTM6-DRre-pfZ.js.map +1 -0
  146. keboola_agent_cli/_ui_dist/index.html +50 -0
  147. keboola_agent_cli/ai_client.py +83 -0
  148. keboola_agent_cli/auto_update.py +550 -0
  149. keboola_agent_cli/changelog.py +1198 -0
  150. keboola_agent_cli/cli.py +448 -0
  151. keboola_agent_cli/client.py +3422 -0
  152. keboola_agent_cli/commands/__init__.py +0 -0
  153. keboola_agent_cli/commands/_data_app_git.py +343 -0
  154. keboola_agent_cli/commands/_helpers.py +377 -0
  155. keboola_agent_cli/commands/_metadata_input.py +49 -0
  156. keboola_agent_cli/commands/_semantic_layer_crud.py +632 -0
  157. keboola_agent_cli/commands/_semantic_layer_helpers.py +44 -0
  158. keboola_agent_cli/commands/_semantic_layer_reference_data.py +247 -0
  159. keboola_agent_cli/commands/agent.py +968 -0
  160. keboola_agent_cli/commands/branch.py +423 -0
  161. keboola_agent_cli/commands/changelog.py +168 -0
  162. keboola_agent_cli/commands/component.py +216 -0
  163. keboola_agent_cli/commands/config.py +2442 -0
  164. keboola_agent_cli/commands/context.py +1481 -0
  165. keboola_agent_cli/commands/data_app.py +1279 -0
  166. keboola_agent_cli/commands/dev_portal.py +584 -0
  167. keboola_agent_cli/commands/doctor.py +37 -0
  168. keboola_agent_cli/commands/encrypt.py +145 -0
  169. keboola_agent_cli/commands/feature.py +311 -0
  170. keboola_agent_cli/commands/flow.py +948 -0
  171. keboola_agent_cli/commands/http_client.py +157 -0
  172. keboola_agent_cli/commands/init.py +279 -0
  173. keboola_agent_cli/commands/job.py +661 -0
  174. keboola_agent_cli/commands/kai.py +301 -0
  175. keboola_agent_cli/commands/lineage.py +1464 -0
  176. keboola_agent_cli/commands/org.py +292 -0
  177. keboola_agent_cli/commands/permissions.py +360 -0
  178. keboola_agent_cli/commands/project.py +1192 -0
  179. keboola_agent_cli/commands/repl.py +243 -0
  180. keboola_agent_cli/commands/schedule.py +340 -0
  181. keboola_agent_cli/commands/search.py +178 -0
  182. keboola_agent_cli/commands/semantic_layer.py +939 -0
  183. keboola_agent_cli/commands/serve.py +272 -0
  184. keboola_agent_cli/commands/sharing.py +340 -0
  185. keboola_agent_cli/commands/storage.py +2630 -0
  186. keboola_agent_cli/commands/stream.py +266 -0
  187. keboola_agent_cli/commands/sync.py +1277 -0
  188. keboola_agent_cli/commands/tool.py +206 -0
  189. keboola_agent_cli/commands/version.py +186 -0
  190. keboola_agent_cli/commands/workspace.py +635 -0
  191. keboola_agent_cli/config_store.py +582 -0
  192. keboola_agent_cli/constants.py +528 -0
  193. keboola_agent_cli/data_science_client.py +342 -0
  194. keboola_agent_cli/dev_portal_client.py +323 -0
  195. keboola_agent_cli/errors.py +248 -0
  196. keboola_agent_cli/http_base.py +315 -0
  197. keboola_agent_cli/json_utils.py +126 -0
  198. keboola_agent_cli/lib.py +536 -0
  199. keboola_agent_cli/manage_client.py +324 -0
  200. keboola_agent_cli/metastore_client.py +214 -0
  201. keboola_agent_cli/models.py +427 -0
  202. keboola_agent_cli/output.py +1084 -0
  203. keboola_agent_cli/permissions.py +469 -0
  204. keboola_agent_cli/py.typed +3 -0
  205. keboola_agent_cli/result_models.py +271 -0
  206. keboola_agent_cli/server/__init__.py +34 -0
  207. keboola_agent_cli/server/agent_runner.py +1289 -0
  208. keboola_agent_cli/server/agents_store.py +325 -0
  209. keboola_agent_cli/server/app.py +764 -0
  210. keboola_agent_cli/server/auth.py +117 -0
  211. keboola_agent_cli/server/dependencies.py +149 -0
  212. keboola_agent_cli/server/pricing.py +303 -0
  213. keboola_agent_cli/server/routers/__init__.py +1 -0
  214. keboola_agent_cli/server/routers/agents.py +616 -0
  215. keboola_agent_cli/server/routers/ai_chat.py +129 -0
  216. keboola_agent_cli/server/routers/branches.py +133 -0
  217. keboola_agent_cli/server/routers/components.py +48 -0
  218. keboola_agent_cli/server/routers/configs.py +507 -0
  219. keboola_agent_cli/server/routers/data_apps.py +384 -0
  220. keboola_agent_cli/server/routers/dev_portal.py +67 -0
  221. keboola_agent_cli/server/routers/encrypt.py +35 -0
  222. keboola_agent_cli/server/routers/feature.py +179 -0
  223. keboola_agent_cli/server/routers/flows.py +204 -0
  224. keboola_agent_cli/server/routers/health.py +53 -0
  225. keboola_agent_cli/server/routers/jobs.py +175 -0
  226. keboola_agent_cli/server/routers/kai.py +80 -0
  227. keboola_agent_cli/server/routers/lineage.py +226 -0
  228. keboola_agent_cli/server/routers/mcp.py +70 -0
  229. keboola_agent_cli/server/routers/members.py +170 -0
  230. keboola_agent_cli/server/routers/org.py +96 -0
  231. keboola_agent_cli/server/routers/projects.py +106 -0
  232. keboola_agent_cli/server/routers/schedules.py +54 -0
  233. keboola_agent_cli/server/routers/search.py +30 -0
  234. keboola_agent_cli/server/routers/semantic_layer.py +650 -0
  235. keboola_agent_cli/server/routers/sharing.py +86 -0
  236. keboola_agent_cli/server/routers/storage.py +574 -0
  237. keboola_agent_cli/server/routers/stream.py +100 -0
  238. keboola_agent_cli/server/routers/workspaces.py +302 -0
  239. keboola_agent_cli/server/run_broadcaster.py +329 -0
  240. keboola_agent_cli/server/sse.py +25 -0
  241. keboola_agent_cli/services/__init__.py +0 -0
  242. keboola_agent_cli/services/_encryption.py +217 -0
  243. keboola_agent_cli/services/_semantic_layer_cascade.py +147 -0
  244. keboola_agent_cli/services/_semantic_layer_crud.py +382 -0
  245. keboola_agent_cli/services/_semantic_layer_internals.py +1078 -0
  246. keboola_agent_cli/services/_semantic_layer_lookup.py +181 -0
  247. keboola_agent_cli/services/_semantic_layer_reference_data.py +217 -0
  248. keboola_agent_cli/services/_sync_bindings.py +456 -0
  249. keboola_agent_cli/services/_sync_branch.py +191 -0
  250. keboola_agent_cli/services/_sync_bulk.py +228 -0
  251. keboola_agent_cli/services/_sync_clone.py +163 -0
  252. keboola_agent_cli/services/_sync_models.py +97 -0
  253. keboola_agent_cli/services/_sync_push_ops.py +369 -0
  254. keboola_agent_cli/services/_sync_storage.py +376 -0
  255. keboola_agent_cli/services/_sync_writeback.py +167 -0
  256. keboola_agent_cli/services/agent_service.py +458 -0
  257. keboola_agent_cli/services/base.py +175 -0
  258. keboola_agent_cli/services/branch_service.py +588 -0
  259. keboola_agent_cli/services/component_service.py +694 -0
  260. keboola_agent_cli/services/config_service.py +2099 -0
  261. keboola_agent_cli/services/data_app_git_service.py +224 -0
  262. keboola_agent_cli/services/data_app_service.py +2082 -0
  263. keboola_agent_cli/services/deep_lineage_service.py +1322 -0
  264. keboola_agent_cli/services/dev_portal_service.py +345 -0
  265. keboola_agent_cli/services/doctor_service.py +445 -0
  266. keboola_agent_cli/services/encrypt_service.py +87 -0
  267. keboola_agent_cli/services/feature_service.py +268 -0
  268. keboola_agent_cli/services/flow_service.py +769 -0
  269. keboola_agent_cli/services/flow_validation.py +188 -0
  270. keboola_agent_cli/services/http_forwarder_service.py +236 -0
  271. keboola_agent_cli/services/job_idempotency_store.py +285 -0
  272. keboola_agent_cli/services/job_service.py +797 -0
  273. keboola_agent_cli/services/kai_service.py +367 -0
  274. keboola_agent_cli/services/lineage_service.py +274 -0
  275. keboola_agent_cli/services/mcp_service.py +1498 -0
  276. keboola_agent_cli/services/mcp_transport.py +259 -0
  277. keboola_agent_cli/services/member_service.py +593 -0
  278. keboola_agent_cli/services/org_service.py +619 -0
  279. keboola_agent_cli/services/project_service.py +947 -0
  280. keboola_agent_cli/services/repo_validate_service.py +767 -0
  281. keboola_agent_cli/services/schedule_service.py +731 -0
  282. keboola_agent_cli/services/search_service.py +331 -0
  283. keboola_agent_cli/services/semantic_layer_service.py +1497 -0
  284. keboola_agent_cli/services/sharing_service.py +307 -0
  285. keboola_agent_cli/services/storage_service.py +2524 -0
  286. keboola_agent_cli/services/stream_service.py +395 -0
  287. keboola_agent_cli/services/sync_service.py +2244 -0
  288. keboola_agent_cli/services/variables_service.py +447 -0
  289. keboola_agent_cli/services/version_service.py +1038 -0
  290. keboola_agent_cli/services/workspace_service.py +1103 -0
  291. keboola_agent_cli/stream_client.py +217 -0
  292. keboola_agent_cli/sync/__init__.py +1 -0
  293. keboola_agent_cli/sync/branch_mapping.py +174 -0
  294. keboola_agent_cli/sync/clone.py +211 -0
  295. keboola_agent_cli/sync/code_extraction.py +655 -0
  296. keboola_agent_cli/sync/config_format.py +290 -0
  297. keboola_agent_cli/sync/diff_engine.py +566 -0
  298. keboola_agent_cli/sync/git_utils.py +93 -0
  299. keboola_agent_cli/sync/manifest.py +162 -0
  300. keboola_agent_cli/sync/naming.py +90 -0
  301. keboola_agent_cli/sync/secrets.py +62 -0
  302. keboola_agent_cli/sync/sql_split.py +134 -0
  303. keboola_cli-0.63.4.dist-info/METADATA +308 -0
  304. keboola_cli-0.63.4.dist-info/RECORD +306 -0
  305. keboola_cli-0.63.4.dist-info/WHEEL +4 -0
  306. 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})