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,528 @@
1
+ """Shared constants for Keboola Agent CLI.
2
+
3
+ All magic numbers, default values, retry parameters, timeout settings,
4
+ and environment variable names are centralized here to avoid duplication
5
+ and ensure consistency across the codebase.
6
+ """
7
+
8
+ from importlib.metadata import PackageNotFoundError, version
9
+
10
+ import httpx
11
+
12
+ # --- Application identity ---
13
+ # Distribution name used for the importlib.metadata version lookup and the
14
+ # User-Agent product token that signs every Keboola API call.
15
+ #
16
+ # Resolved DYNAMICALLY so one codebase runs correctly under BOTH the current
17
+ # distribution (`keboola-cli`) and the legacy pre-0.63 name
18
+ # (`keboola-agent-cli`). The PyPI rename (#424) ships a migration-bridge wheel
19
+ # under the legacy name so already-installed <=0.62 users self-update in place;
20
+ # under that distribution `version("keboola-cli")` raises PackageNotFoundError,
21
+ # which would break `kbagent version` if APP_NAME were a fixed literal.
22
+ #
23
+ # NOTE: this is the PyPI/distribution identity ONLY. The on-disk config dir
24
+ # (`~/.config/keboola-agent-cli/`) is a SEPARATE fixed literal in
25
+ # config_store.py -- it must not move with the distribution name or existing
26
+ # users would lose their config location.
27
+ APP_NAME_CANDIDATES: tuple[str, ...] = ("keboola-cli", "keboola-agent-cli")
28
+
29
+
30
+ def _resolve_app_name() -> str:
31
+ """Return the installed distribution name, preferring the current one.
32
+
33
+ Falls back to the first (current) candidate when neither is importable --
34
+ an editable/source checkout without built metadata -- so callers always get
35
+ a stable product token.
36
+ """
37
+ for name in APP_NAME_CANDIDATES:
38
+ try:
39
+ version(name)
40
+ return name
41
+ except PackageNotFoundError:
42
+ continue
43
+ return APP_NAME_CANDIDATES[0]
44
+
45
+
46
+ APP_NAME: str = _resolve_app_name()
47
+
48
+ # --- Sentinel for missing metadata keys ---
49
+ # Distinguishes "key absent" from "value is None/null" in branch metadata lookups.
50
+ METADATA_NOT_FOUND = object()
51
+
52
+ # --- HTTP Retry Constants ---
53
+ RETRYABLE_STATUS_CODES: set[int] = {429, 500, 502, 503, 504}
54
+ MAX_RETRIES: int = 3
55
+ BACKOFF_BASE: float = 1.0 # seconds; delays: 1s, 2s, 4s
56
+
57
+ # --- HTTP Timeout ---
58
+ DEFAULT_TIMEOUT: httpx.Timeout = httpx.Timeout(connect=5.0, read=30.0, write=10.0, pool=5.0)
59
+
60
+ # --- API Error Handling ---
61
+ MAX_API_ERROR_LENGTH: int = 500
62
+
63
+ # --- Developer Portal MFA ---
64
+ # Challenge type sent on the second `/auth/login` step (after the first call
65
+ # returns a `session` token). The apiary spec documents `SOFTWARE_TOKEN_MFA`
66
+ # (TOTP authenticator app) as the default and `SMS_MFA` as the only other
67
+ # member, but in practice the server 404s when the field is omitted, so we
68
+ # send it explicitly. If apps-api ever adds a third member (e.g. EMAIL_OTP),
69
+ # wire it in here and add a per-identity `mfa_challenge` field.
70
+ DP_MFA_CHALLENGE_TYPE: str = "SOFTWARE_TOKEN_MFA"
71
+
72
+ # --- UNEXPECTED_ERROR truncation ---
73
+ # Unhandled ``Exception`` messages surfaced to per-project error envelopes are
74
+ # truncated to this many characters before being returned. Exceptions can
75
+ # otherwise embed URLs with query params, response-buffer fragments, or, with
76
+ # ``--with-state``, OAuth refresh tokens from the runtime state dict. CWE-209.
77
+ UNEXPECTED_ERROR_MAX_MESSAGE_LEN: int = 256
78
+
79
+ # --- Default Stack URL ---
80
+ DEFAULT_STACK_URL: str = "https://connection.keboola.com"
81
+
82
+ # --- Token Description ---
83
+ DEFAULT_TOKEN_DESCRIPTION: str = "kbagent-cli"
84
+
85
+ # --- Project Member Roles ---
86
+ # Allowed values for project membership / invitation `role` field. Lifted from
87
+ # the Manage API's own validation error: `Role "X" is not valid. Allowed roles
88
+ # are: admin, guest, readOnly, share`. Verified empirically 2026-05-01 against
89
+ # connection.us-east4.gcp.keboola.com. If the API ever extends the list, the
90
+ # fix is to extend this tuple -- the engine already returns the new options in
91
+ # its validation error message.
92
+ PROJECT_ROLES: tuple[str, ...] = ("admin", "guest", "readOnly", "share")
93
+
94
+ # --- Bulk Invite Defaults ---
95
+ DEFAULT_INVITE_WORKERS: int = 8
96
+
97
+ # --- Job Limits ---
98
+ DEFAULT_JOB_LIMIT: int = 50
99
+ DEFAULT_JOBS_PER_CONFIG: int = 5
100
+ # Max groups: constrained by API rule jobsPerGroup * limit <= 500
101
+ DEFAULT_GROUPED_JOBS_LIMIT: int = 100
102
+ MAX_JOB_LIMIT: int = 500
103
+
104
+ # --- Retry-After Header ---
105
+ MAX_RETRY_AFTER_SECONDS: int = 60
106
+
107
+ # --- MCP Timeouts ---
108
+ DEFAULT_MCP_TOOL_TIMEOUT: int = 60
109
+ DEFAULT_MCP_INIT_TIMEOUT: int = 30
110
+
111
+ # --- MCP Concurrency ---
112
+ # 0 = unlimited (all projects run in parallel); set KBAGENT_MCP_MAX_SESSIONS to throttle
113
+ DEFAULT_MCP_MAX_SESSIONS: int = 0
114
+
115
+ # --- MCP HTTP Transport ---
116
+ # Transport mode: "http" (persistent server) or "stdio" (subprocess per call)
117
+ ENV_MCP_TRANSPORT: str = "KBAGENT_MCP_TRANSPORT"
118
+ DEFAULT_MCP_TRANSPORT: str = "stdio"
119
+ # Timeout for the persistent MCP server to start and be healthy
120
+ MCP_SERVER_STARTUP_TIMEOUT: float = 15.0
121
+ # Timeout for health check requests to persistent MCP server
122
+ MCP_SERVER_HEALTH_TIMEOUT: float = 2.0
123
+
124
+ # --- Storage Job Polling ---
125
+ STORAGE_JOB_POLL_INTERVAL: float = 1.0 # seconds between polls
126
+ STORAGE_JOB_MAX_WAIT: float = 60.0 # max seconds to wait for a storage job
127
+ IMPORT_JOB_MAX_WAIT: float = 600.0 # 10 min for table import jobs (large files)
128
+
129
+ # --- Queue Job Polling ---
130
+ # Piecewise curve matching FIIA's existing Queue API polling contract
131
+ # (same cadence as the official keboola-as-code Go CLI): fast initial polls
132
+ # to catch short jobs, then relax so multi-hour orchestrations don't spam
133
+ # the API. Each tuple is (interval_seconds, max_polls_at_this_interval);
134
+ # count=0 means "continue at this interval indefinitely" (only valid on the
135
+ # last segment). Total first-phase time: 2s * 30 + 5s * 48 = 300s = 5 min,
136
+ # after which we settle at 15s forever.
137
+ JOB_POLL_CURVE: tuple[tuple[float, int], ...] = (
138
+ (2.0, 30),
139
+ (5.0, 48),
140
+ (15.0, 0),
141
+ )
142
+ VALID_POLL_STRATEGIES: frozenset[str] = frozenset({"exponential", "fixed"})
143
+ DEFAULT_POLL_STRATEGY: str = "exponential"
144
+ # Queue API "mode" body field for job creation. "run" is the normal execution
145
+ # path (writes to mapped output tables); "debug" runs the component the same
146
+ # way but redirects the output to a Storage File tagged "debug-" + the job id
147
+ # instead of into destination buckets. Useful for dry-runs and reproducing
148
+ # failures without touching production tables.
149
+ VALID_JOB_MODES: frozenset[str] = frozenset({"run", "debug"})
150
+ DEFAULT_JOB_MODE: str = "run"
151
+ # Client-side job idempotency store (issue #427). Lives in the config-dir
152
+ # alongside config.json; maps idempotency_key -> prior job so a replayed
153
+ # `kbagent job run --idempotency-key` does not fire a duplicate side effect.
154
+ JOB_IDEMPOTENCY_FILENAME: str = "job_idempotency.json"
155
+ # Default log-tail length surfaced on FAILED/WARNING/TERMINATED jobs.
156
+ DEFAULT_LOG_TAIL_LINES: int = 200
157
+ # Upper bound to prevent accidentally pulling tens of thousands of events
158
+ # from a long-running job.
159
+ MAX_LOG_TAIL_LINES: int = 5000
160
+ # Seconds to wait after issuing kill_job() during timeout-cancellation for
161
+ # the job to transition to a terminal state before we return.
162
+ JOB_TERMINATE_GRACE_SECONDS: float = 10.0
163
+ # Poll cadence while waiting inside the terminate grace window; capped so we
164
+ # never overshoot the deadline by more than one interval on latency-sensitive
165
+ # callers (see _terminate_and_wait in services/job_service.py).
166
+ JOB_TERMINATE_POLL_INTERVAL: float = 1.0
167
+
168
+ # --- File Upload Timeout ---
169
+ FILE_UPLOAD_TIMEOUT: httpx.Timeout = httpx.Timeout(
170
+ connect=30.0, read=300.0, write=3600.0, pool=30.0
171
+ )
172
+
173
+ # --- File Download Timeout ---
174
+ FILE_DOWNLOAD_TIMEOUT: httpx.Timeout = httpx.Timeout(
175
+ connect=30.0, read=3600.0, write=10.0, pool=30.0
176
+ )
177
+
178
+ # --- File Download Streaming ---
179
+ # Chunk size for streamed downloads. Bounded buffer keeps peak RSS small even
180
+ # for multi-GB tables (see GitHub issue #187: 200MB parquet slices OOM'd on 2GB RAM
181
+ # hosts when loaded whole-body via response.content).
182
+ FILE_DOWNLOAD_CHUNK_SIZE: int = 1024 * 1024 # 1 MiB
183
+
184
+ # --- Export Job ---
185
+ EXPORT_JOB_MAX_WAIT: float = 600.0 # 10 min for table export jobs (large tables)
186
+
187
+ # --- Parallel Workers ---
188
+ MAX_PARALLEL_WORKERS_LIMIT: int = 100
189
+
190
+ # --- Config Resolution ---
191
+ ENV_CONFIG_DIR: str = "KBAGENT_CONFIG_DIR"
192
+ LOCAL_CONFIG_DIR_NAME: str = ".kbagent"
193
+
194
+ # --- Project Pin ---
195
+ # Overrides the persisted `default_project` pin for a single invocation/session.
196
+ ENV_KBAGENT_PROJECT: str = "KBAGENT_PROJECT"
197
+
198
+ # --- Headless / env-only project (issue #359) ---
199
+ # Opt-in flag that makes ConfigStore synthesize an in-memory project from
200
+ # KBC_TOKEN + KBC_STORAGE_API_URL, so a daemon / container / CI can run kbagent
201
+ # (CLI or `serve`) with no `kbagent project add` and no config.json on disk.
202
+ # Explicit opt-in (not mere presence of KBC_TOKEN) avoids a phantom project
203
+ # surprising a dev who exported KBC_TOKEN only for `kbagent project add`.
204
+ ENV_PROJECT_FROM_ENV: str = "KBAGENT_PROJECT_FROM_ENV"
205
+ # Reserved alias for the synthesized project. Double-underscore marks it as a
206
+ # synthetic, never-persisted entry that cannot collide with a user alias.
207
+ ENV_PROJECT_ALIAS: str = "__env__"
208
+
209
+ # --- Environment Variable Names ---
210
+ ENV_MAX_PARALLEL_WORKERS: str = "KBAGENT_MAX_PARALLEL_WORKERS"
211
+ ENV_KBC_TOKEN: str = "KBC_TOKEN"
212
+ ENV_KBC_STORAGE_API_URL: str = "KBC_STORAGE_API_URL"
213
+ ENV_KBC_MANAGE_API_TOKEN: str = "KBC_MANAGE_API_TOKEN"
214
+ ENV_KBC_MASTER_TOKEN: str = "KBC_MASTER_TOKEN"
215
+ ENV_MCP_TOOL_TIMEOUT: str = "KBAGENT_MCP_TOOL_TIMEOUT"
216
+ ENV_MCP_INIT_TIMEOUT: str = "KBAGENT_MCP_INIT_TIMEOUT"
217
+ ENV_MCP_MAX_SESSIONS: str = "KBAGENT_MCP_MAX_SESSIONS"
218
+ ENV_CONVERSATION_ID: str = "KBAGENT_CONVERSATION_ID"
219
+
220
+ # --- Serve subprocess context (since v0.7.x) ---
221
+ # Injected by `kbagent serve` into scheduled-agent subprocess env so AI CLIs
222
+ # (claude / codex / gemini) and plain `kbagent` invocations can talk to the
223
+ # live HTTP API instead of reading possibly-stale local config. Pair them:
224
+ # ENV_KBAGENT_SERVE_URL points at the FastAPI bind URL and ENV_KBAGENT_SERVE_TOKEN
225
+ # is the bearer token printed at serve startup. Used by `kbagent http <verb>`.
226
+ ENV_KBAGENT_SERVE_URL: str = "KBAGENT_SERVE_URL"
227
+ ENV_KBAGENT_SERVE_TOKEN: str = "KBAGENT_SERVE_TOKEN"
228
+
229
+ # --- AI-agent extra_args opt-in (since 0.60.2) ---
230
+ # extra_args on an ai_agent task are passed verbatim to the AI CLI, so they can
231
+ # carry rail-disabling flags (permission-skip / unrestricted-exec). They are
232
+ # IGNORED unless the serve operator opts in by setting this to a truthy value
233
+ # (1/true/yes/on) -- mirroring the --allow-env-manage-token opt-in. See
234
+ # GHSA-777j-6p95-qv3m.
235
+ ENV_ALLOW_AI_EXTRA_ARGS: str = "KBAGENT_ALLOW_AI_EXTRA_ARGS"
236
+
237
+ # --- Upstream-chain context (set when a task is triggered as a downstream) ---
238
+ # Populated only on runs spawned by another task's ``trigger`` field; absent
239
+ # on cron-driven or manually-invoked runs. AI agents read these to fetch the
240
+ # upstream output via `kbagent http get /agents/<task>/runs/<run>`.
241
+ ENV_KBAGENT_UPSTREAM_TASK_ID: str = "KBAGENT_UPSTREAM_TASK_ID"
242
+ ENV_KBAGENT_UPSTREAM_RUN_ID: str = "KBAGENT_UPSTREAM_RUN_ID"
243
+ ENV_KBAGENT_UPSTREAM_STATUS: str = "KBAGENT_UPSTREAM_STATUS"
244
+
245
+ # Default timeout for `kbagent http` requests. AI agents poll endpoints
246
+ # during multi-step tasks; long enough for slow Storage table listings,
247
+ # short enough to fail fast on a dead serve.
248
+ HTTP_DEFAULT_TIMEOUT: float = 60.0
249
+
250
+ # --- AI helper subprocess timeouts (seconds) ---
251
+ # Each of the three stateless AI helpers spawns a local claude / codex /
252
+ # gemini CLI via stream_ai_agent_events; these caps protect against a stuck
253
+ # CLI camping on the SSE connection. Centralised here so they stay
254
+ # governable from one place instead of three router files.
255
+ #
256
+ # - Prompt helper: rewrite a draft prompt for a scheduled agent. Short
257
+ # single-turn task, no tool calls expected -> 180s.
258
+ # - SQL helper: write workspace SQL. May round-trip through
259
+ # `kbagent storage bucket-detail` + INFORMATION_SCHEMA queries -> 180s.
260
+ # - Chat helper: generic Local AI co-pilot. Can involve several tool
261
+ # invocations + a longer summary -> 300s, matching the longest
262
+ # credible single-turn budget without leaving stuck connections open.
263
+ AI_PROMPT_HELPER_TIMEOUT: float = 180.0
264
+ AI_SQL_HELPER_TIMEOUT: float = 180.0
265
+ AI_CHAT_HELPER_TIMEOUT: float = 300.0
266
+
267
+ # --- Version Check ---
268
+ VERSION_CHECK_TIMEOUT: float = 4.0 # seconds for fetching latest version from remote
269
+ MCP_PYPI_URL: str = "https://pypi.org/pypi/keboola-mcp-server/json"
270
+ KBAGENT_GITHUB_REPO: str = "keboola/cli"
271
+ KBAGENT_INSTALL_SOURCE: str = "git+https://github.com/keboola/cli"
272
+
273
+ # --- MCP self-upgrade (since v0.30.1) ---
274
+ # Subprocess timeout for the `keboola_mcp_server --version` probe and the
275
+ # `uv tool list` install-method probe. These are local subprocess calls,
276
+ # so 5s leaves plenty of headroom for cold-start CPython without slowing
277
+ # kbagent startup observably.
278
+ MCP_PROBE_TIMEOUT: float = 5.0
279
+ # Subprocess timeout for the actual upgrade command (`uv tool upgrade` /
280
+ # `pip install -U` / `uvx --refresh`). Network bound; 180s tolerates a
281
+ # slow PyPI link plus the worst-case dependency-resolution cost.
282
+ MCP_UPGRADE_TIMEOUT: float = 180.0
283
+ # Pre-release opt-in flags for installing/upgrading keboola-mcp-server (#324).
284
+ #
285
+ # keboola-mcp-server >= 1.55.0 declares a pre-release-only transitive
286
+ # dependency: ``toon-format~=0.9.0b1``. On PyPI ``toon-format`` ships exactly
287
+ # two releases -- ``0.1.0`` (stable) and ``0.9.0b1`` (pre-release) -- so the
288
+ # ``~=0.9.0b1`` constraint can ONLY be satisfied by the pre-release.
289
+ #
290
+ # uv refuses pre-releases by default. Crucially, ``--prerelease=if-necessary``
291
+ # does NOT help here: a *stable* toon-format (0.1.0) exists, so uv decides a
292
+ # pre-release is "not necessary", then fails because 0.1.0 violates the pin.
293
+ # Only ``--prerelease=allow`` resolves it (verified empirically, uv 0.10.x).
294
+ # Without the flag ``uv tool upgrade``/``install`` silently backtracks to the
295
+ # last MCP release predating the pin (v1.32.0) and exits 0 -- pinning the
296
+ # fleet to a stale server while reporting a newer version is "available".
297
+ #
298
+ # Scoped to the MCP environment only; never affects the kbagent self-update
299
+ # channel (which stays stable-only unless --beta).
300
+ MCP_UV_PRERELEASE_FLAG: str = "--prerelease=allow"
301
+ MCP_PIP_PRERELEASE_FLAG: str = "--pre"
302
+
303
+ # --- Auto-Update ---
304
+ ENV_AUTO_UPDATE: str = "KBAGENT_AUTO_UPDATE"
305
+ ENV_SKIP_UPDATE: str = "KBAGENT_SKIP_UPDATE"
306
+ AUTO_UPDATE_CHECK_INTERVAL: int = 3600 # 1 hour TTL for version cache
307
+ VERSION_CACHE_FILENAME: str = "version_cache.json"
308
+ # Self-update subprocess timeout. Previously a hardcoded 120s in two places,
309
+ # which falsely tripped on WSL where the git+ source build (npm/React SPA) runs
310
+ # for minutes (issue #353). The prebuilt-wheel install is a seconds download, so
311
+ # 300s is ample; KBAGENT_UPDATE_TIMEOUT raises it for the slow git+ fallback.
312
+ UPDATE_TIMEOUT_SECONDS: int = 300
313
+ ENV_UPDATE_TIMEOUT: str = "KBAGENT_UPDATE_TIMEOUT"
314
+
315
+ # --- AI Service ---
316
+ AI_SERVICE_TIMEOUT: httpx.Timeout = httpx.Timeout(connect=5.0, read=15.0, write=5.0, pool=5.0)
317
+
318
+ # --- Data Streams (Stream API) ---
319
+ # The Stream control-plane API lives on a separate host derived from the
320
+ # Storage URL by replacing 'connection.' with 'stream.' (same scheme as
321
+ # 'ai.'/'queue.'), authenticated with the Storage API token (X-StorageApi-Token).
322
+ # The OTLP *ingestion* endpoint (stream-in.<region>/otlp/...) is NOT derived --
323
+ # it is returned by the API in the source's `otlp.url` field.
324
+ STREAM_API_TIMEOUT: httpx.Timeout = httpx.Timeout(connect=5.0, read=30.0, write=10.0, pool=5.0)
325
+ # Branch ref used by the Stream API path /v1/branches/<branch>/...; "default"
326
+ # targets the project's default (production) branch.
327
+ STREAM_DEFAULT_BRANCH: str = "default"
328
+ # Source/delete operations return an async Task; poll GET /v1/tasks/<id> until
329
+ # `isFinished`. Interval between polls and the overall ceiling.
330
+ STREAM_TASK_POLL_INTERVAL: float = 1.0 # seconds between task polls
331
+ STREAM_TASK_TIMEOUT: float = 60.0 # max seconds to wait for a Stream task
332
+ # OTLP/HTTP per-signal sub-paths appended to the source's base endpoint, and the
333
+ # wire protocol every OTLP source speaks. Surfaced by `kbagent stream detail`.
334
+ OTLP_SIGNAL_PATHS: tuple[str, ...] = ("v1/logs", "v1/traces", "v1/metrics")
335
+ OTLP_PROTOCOL: str = "http/protobuf"
336
+ # Signals (and their destination table names) auto-provisioned for an OTLP source.
337
+ # Creating a source via the raw Stream API does NOT create sinks, so kbagent
338
+ # provisions one table sink per signal (matching the Keboola UI) so data actually
339
+ # lands. Bucket = OTLP_BUCKET_PREFIX + sourceId; table = the signal name.
340
+ OTLP_SINK_SIGNALS: tuple[str, ...] = ("logs", "metrics", "traces")
341
+ OTLP_BUCKET_PREFIX: str = "in.c-otlp-"
342
+ # Universal, signal-agnostic sink mapping: an auto id, the ingest datetime, and a
343
+ # `body` column that captures the full flattened OTLP record as JSON. Users can
344
+ # refine per-signal column mappings in the Keboola UI afterwards.
345
+ OTLP_SINK_COLUMNS: tuple[dict[str, str], ...] = (
346
+ {"type": "uuid", "name": "id"},
347
+ {"type": "datetime", "name": "datetime"},
348
+ {"type": "body", "name": "body"},
349
+ )
350
+
351
+ # --- Project Feature Flags ---
352
+ # `storage-branches` enables the modern dev-branch storage isolation:
353
+ # transformation runner / output-mapping consult bucket metadata
354
+ # (KBC.createdBy.branch.id) and use the /v2/storage/branch/<id>/* endpoints.
355
+ # Projects WITHOUT this feature still accept POST /v2/storage/branch/<id>/buckets,
356
+ # but the runner ignores those buckets and creates parallel `out.c-<branch_id>-*`
357
+ # buckets in the default branch (legacy "fake-branch" path). kbagent's
358
+ # branch-aware writes surface a `legacy_branch_storage: true` flag on such
359
+ # projects so callers know the materialized bucket will be unused by the runner.
360
+ # See plugins/kbagent/skills/kbagent/references/storage-types-workflow.md.
361
+ STORAGE_BRANCHES_FEATURE: str = "storage-branches"
362
+
363
+ # --- Global Search ---
364
+ # Feature flag that gates the Storage API ``GET /v2/storage/global-search``
365
+ # endpoint used by ``kbagent search`` (textual mode). Projects without this
366
+ # flag receive a 404; ``SearchService`` checks the flag pre-flight and
367
+ # returns a descriptive per-project error rather than letting the raw 404
368
+ # bubble up.
369
+ GLOBAL_SEARCH_FEATURE: str = "global-search"
370
+
371
+ # --- OAuth ---
372
+ # Host of the Keboola-hosted OAuth wizard used by ``kbagent config oauth-url``.
373
+ # Constant across all stacks (EU/US/AWS/GCP/Azure); the per-stack difference
374
+ # is reflected in the ``sapiUrl`` query parameter, not the wizard host.
375
+ OAUTH_HOST: str = "external.keboola.com"
376
+ OAUTH_PATH: str = "/oauth/index.html"
377
+
378
+ # --- Kai (Keboola AI Assistant) ---
379
+ KAI_FEATURE_FLAG: str = "agent-chat"
380
+ KAI_REQUEST_TIMEOUT: float = 300.0 # 5 min for non-streaming requests
381
+ KAI_STREAM_TIMEOUT: float = 600.0 # 10 min for SSE streaming responses
382
+ SECRET_PLACEHOLDER: str = "<YOUR_SECRET>"
383
+
384
+ # --- Changelog rendering ---
385
+ # `kbagent changelog` shows a one-line summary per version by default (--full
386
+ # expands). A summary is the note's first sentence, capped at this many chars
387
+ # (cut on a word boundary) so a verbose release note collapses to a scannable
388
+ # headline instead of a wall of text.
389
+ CHANGELOG_HEADLINE_MAX_CHARS: int = 160
390
+
391
+ # --- Job Run ---
392
+ DEFAULT_JOB_RUN_TIMEOUT: float = 300.0 # 5 min default for --wait polling
393
+
394
+ # --- Job Terminate ---
395
+ # States where POST /jobs/{id}/kill returns HTTP 200; any other state yields 400.
396
+ KILLABLE_JOB_STATUSES: frozenset[str] = frozenset({"created", "waiting", "processing"})
397
+
398
+ # --- Workspace Query Service compatibility (since v0.42.0, closes #304) ---
399
+ # Storage API workspace endpoint exposes `connection.loginType`. The Query
400
+ # Service (POST /v2/storage/branch/{ID}/workspaces/{WS}/query) accepts only a
401
+ # subset of these and rejects the rest with HTTP 400 and
402
+ # `code: storage.executeQuery.notSupportedLoginType`. Before #304 the only
403
+ # way to learn whether a workspace was Query-Service-compatible was to fire a
404
+ # query and read the failure -- the issue cost ~30 min of trial-and-error
405
+ # per data-app onboarding.
406
+ #
407
+ # Conservative WHITELIST semantics (false negatives over false positives):
408
+ # present -> qs_compatible=True (confirmed working in production)
409
+ # absent -> qs_compatible=False; hint to try anyway because the policy
410
+ # varies per stack (snowflake-legacy-service worked on
411
+ # connection.keboola.com but failed on the GCP us-east4 stack
412
+ # in the original issue report)
413
+ #
414
+ # Verified 2026-05-18 against project 901 on connection.keboola.com:
415
+ # snowflake-service-keypair: PASS
416
+ # snowflake-person-sso: PASS
417
+ # snowflake-person-keypair: PASS (required for new Snowflake sandboxes)
418
+ # snowflake-legacy-service: PASS here, FAIL on GCP us-east4 (issue #304)
419
+ # default (legacy 2016 ws): FAIL ('JWT token is invalid')
420
+ #
421
+ # Extend ONLY after empirical confirmation across at least one non-AWS stack.
422
+ #
423
+ # This whitelist is SNOWFLAKE-SCOPED. BigQuery compatibility lives in its own
424
+ # set below because the `default` loginType means opposite things per backend
425
+ # (see BIGQUERY_WORKSPACE_LOGIN_TYPE). Compatibility is therefore keyed by
426
+ # (backend, loginType) -- see `_classify_qs_compatibility`.
427
+ SNOWFLAKE_WORKSPACE_LOGIN_TYPE: str = "snowflake-person-keypair"
428
+ QUERY_SERVICE_COMPATIBLE_LOGIN_TYPES: frozenset[str] = frozenset(
429
+ {
430
+ "snowflake-service-keypair",
431
+ "snowflake-person-sso",
432
+ SNOWFLAKE_WORKSPACE_LOGIN_TYPE,
433
+ }
434
+ )
435
+
436
+ # --- BigQuery Query Service compatibility (since v0.58.0) ---
437
+ # BigQuery workspaces carry a single `default` loginType -- the sandbox API does
438
+ # not expose Snowflake-style variants for BigQuery. The Query Service accepts it:
439
+ # verified 2026-06-04 against project 9621 on connection.keboola.com, where a
440
+ # `SELECT` against a read-only `default` BigQuery workspace returns rows.
441
+ #
442
+ # CRITICAL: `default` is on the BigQuery whitelist but deliberately OFF the
443
+ # Snowflake one above. Snowflake ALSO mints a `default` loginType (legacy 2016
444
+ # workspaces) which the Query Service REJECTS ('JWT token is invalid'). Keying
445
+ # compatibility on loginType alone would wrongly green-light those legacy
446
+ # Snowflake workspaces, so `_classify_qs_compatibility` dispatches on backend.
447
+ BIGQUERY_WORKSPACE_LOGIN_TYPE: str = "default"
448
+ QUERY_SERVICE_COMPATIBLE_LOGIN_TYPES_BIGQUERY: frozenset[str] = frozenset(
449
+ {BIGQUERY_WORKSPACE_LOGIN_TYPE}
450
+ )
451
+
452
+ # --- Permission Exit Code ---
453
+ EXIT_PERMISSION_DENIED: int = 6
454
+ # --- Job-timeout Exit Code ---
455
+ # Distinct from the general "1" exit code so scripts can tell
456
+ # "local --timeout elapsed and we cancelled the remote job" apart
457
+ # from "job failed on its own". The retryable-with-longer-timeout
458
+ # QUEUE_JOB_TIMEOUT case (kill itself failed) stays at exit 4.
459
+ EXIT_JOB_TIMEOUT_TERMINATED: int = 7
460
+
461
+ # --- Domain Validation Constants ---
462
+ VALID_COMPONENT_TYPES: list[str] = ["extractor", "writer", "transformation", "application"]
463
+ VALID_STATUSES: list[str] = ["processing", "terminated", "cancelled", "success", "error"]
464
+
465
+ # --- Query Service ---
466
+ QUERY_JOB_POLL_INTERVAL: float = 1.0 # seconds between polls for query job status
467
+ QUERY_JOB_MAX_WAIT: float = 120.0 # max seconds to wait for a query job
468
+ # Fast inline result path (GET .../results) -- reads the already-computed result
469
+ # set as JSON instead of materializing a CSV file via the warehouse UNLOAD path
470
+ # (GET .../export). The default path fetches at most QUERY_RESULTS_DEFAULT_LIMIT
471
+ # rows, accumulated in pages of QUERY_RESULTS_PAGE_SIZE and trimmed to the limit.
472
+ # The endpoint enforces 100 <= pageSize <= 100000, so QUERY_RESULTS_PAGE_SIZE is a
473
+ # fixed valid page size -- it is NOT derived from --limit (a small limit would 400).
474
+ # Two DISTINCT concepts that happen to share the value 500:
475
+ # DEFAULT_LIMIT = user-facing row cap (the --limit default; freely tunable).
476
+ # PAGE_SIZE = API wire constraint -- rows per /results request, which the
477
+ # endpoint requires to be within 100..100000. Independent of
478
+ # --limit; the service pages by PAGE_SIZE and trims to --limit.
479
+ QUERY_RESULTS_DEFAULT_LIMIT: int = 500 # default --limit for `workspace query` fast path
480
+ QUERY_RESULTS_PAGE_SIZE: int = 500 # rows per /results page (API requires 100..100000)
481
+
482
+ # --- Workspace Defaults ---
483
+ DEFAULT_WORKSPACE_BACKEND: str = "snowflake"
484
+
485
+ # --- Sync / Git Workflow ---
486
+ KEBOOLA_DIR_NAME: str = ".keboola"
487
+ MANIFEST_FILENAME: str = "manifest.json"
488
+ BRANCH_MAPPING_FILENAME: str = "branch-mapping.json"
489
+ CONFIG_FILENAME: str = "_config.yml"
490
+ MANIFEST_VERSION: int = 3
491
+ DEFAULT_NAMING_BRANCH: str = "{branch_name}"
492
+ DEFAULT_NAMING_CONFIG: str = "{component_type}/{component_id}/{config_name}"
493
+ DEFAULT_NAMING_CONFIG_ROW: str = "rows/{config_row_name}"
494
+ DEFAULT_NAMING_SCHEDULER: str = "schedules/{config_name}"
495
+ DEFAULT_NAMING_SHARED_CODE: str = "_shared/{target_component_id}"
496
+ DEFAULT_NAMING_SHARED_CODE_ROW: str = "codes/{config_row_name}"
497
+ DEFAULT_NAMING_VARIABLES: str = "variables"
498
+ DEFAULT_NAMING_VARIABLES_VALUES: str = "values/{config_row_name}"
499
+ DEFAULT_NAMING_DATA_APP: str = "app/{component_id}/{config_name}"
500
+ # _config.yml file-format version is independent of the manifest schema version.
501
+ # Manifest v3 introduces ManifestConfigRow.metadata (row-level pull hashes) but does
502
+ # not change the on-disk YAML shape, so CONFIG_YML_VERSION stays at 2.
503
+ CONFIG_YML_VERSION: int = 2
504
+ SANITIZE_NAME_MAX_LENGTH: int = 100
505
+
506
+ # --- Sync Pull: Storage & Jobs ---
507
+ JOBS_FILENAME: str = "_jobs.jsonl"
508
+ STORAGE_DIR_NAME: str = "storage"
509
+ STORAGE_BUCKETS_FILENAME: str = "buckets.json"
510
+ STORAGE_SAMPLES_DIR_NAME: str = "samples"
511
+ DEFAULT_SAMPLE_LIMIT: int = 100
512
+ DEFAULT_MAX_SAMPLES: int = 50
513
+ ENCRYPTED_COLUMN_PREFIX: str = "#"
514
+ ENCRYPTED_COLUMN_MASK: str = "***ENCRYPTED***"
515
+
516
+ # --- Ignored Components ---
517
+ # Components that are always excluded from sync operations (pull/push/diff).
518
+ # These are managed through separate APIs and have volatile internal state.
519
+ ALWAYS_IGNORED_COMPONENTS: frozenset[str] = frozenset(
520
+ {
521
+ "keboola.sandboxes", # Workspaces API; parameters.id is volatile
522
+ }
523
+ )
524
+
525
+ # --- Diff Engine ---
526
+ DIFF_MAX_DEPTH: int = 3 # max nesting depth for deep_diff detail output
527
+ DIFF_MAX_LINES: int = 20 # max number of diff detail lines per config change
528
+ ENCRYPTED_PLACEHOLDER: str = "<ENCRYPTED>" # placeholder for encrypted values during comparison