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