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