zen-cli 0.1.5__tar.gz → 0.1.6__tar.gz

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 (215) hide show
  1. {zen_cli-0.1.5 → zen_cli-0.1.6}/PKG-INFO +1 -1
  2. {zen_cli-0.1.5 → zen_cli-0.1.6}/pyproject.toml +1 -1
  3. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/auth.py +19 -10
  4. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/login_support.py +3 -0
  5. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/test_device_login.py +43 -1
  6. {zen_cli-0.1.5 → zen_cli-0.1.6}/.gitignore +0 -0
  7. {zen_cli-0.1.5 → zen_cli-0.1.6}/LICENSE +0 -0
  8. {zen_cli-0.1.5 → zen_cli-0.1.6}/README.md +0 -0
  9. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/__init__.py +0 -0
  10. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/__main__.py +0 -0
  11. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cli.py +0 -0
  12. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/activity/__init__.py +0 -0
  13. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/activity/get.py +0 -0
  14. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/activity/list.py +0 -0
  15. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/api.py +0 -0
  16. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/auth/__init__.py +0 -0
  17. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/auth/details.py +0 -0
  18. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/auth/refresh.py +0 -0
  19. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/auth/status.py +0 -0
  20. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/auth/token.py +0 -0
  21. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/completion.py +0 -0
  22. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/credential/__init__.py +0 -0
  23. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/credential/create.py +0 -0
  24. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/credential/delete.py +0 -0
  25. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/credential/get.py +0 -0
  26. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/credential/list.py +0 -0
  27. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/deployment/__init__.py +0 -0
  28. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/deployment/create.py +0 -0
  29. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/deployment/delete.py +0 -0
  30. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/deployment/get.py +0 -0
  31. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/deployment/list.py +0 -0
  32. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/entitlement/__init__.py +0 -0
  33. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/entitlement/create.py +0 -0
  34. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/entitlement/delete.py +0 -0
  35. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/entitlement/get.py +0 -0
  36. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/entitlement/list.py +0 -0
  37. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/group/__init__.py +0 -0
  38. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/group/create.py +0 -0
  39. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/group/delete.py +0 -0
  40. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/group/get.py +0 -0
  41. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/group/list.py +0 -0
  42. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/login.py +0 -0
  43. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/logout.py +0 -0
  44. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/mcp.py +0 -0
  45. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/network/__init__.py +0 -0
  46. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/network/create.py +0 -0
  47. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/network/delete.py +0 -0
  48. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/network/get.py +0 -0
  49. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/network/list.py +0 -0
  50. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/notification/__init__.py +0 -0
  51. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/notification/get.py +0 -0
  52. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/notification/list.py +0 -0
  53. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/org/__init__.py +0 -0
  54. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/org/create.py +0 -0
  55. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/org/get.py +0 -0
  56. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/org/list.py +0 -0
  57. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/org/use.py +0 -0
  58. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/pool/__init__.py +0 -0
  59. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/pool/create.py +0 -0
  60. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/pool/delete.py +0 -0
  61. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/pool/get.py +0 -0
  62. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/pool/list.py +0 -0
  63. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/pool/use.py +0 -0
  64. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/profile/__init__.py +0 -0
  65. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/profile/init.py +0 -0
  66. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/provider/__init__.py +0 -0
  67. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/provider/create.py +0 -0
  68. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/provider/delete.py +0 -0
  69. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/provider/get.py +0 -0
  70. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/provider/list.py +0 -0
  71. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/sag/__init__.py +0 -0
  72. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/sag/create.py +0 -0
  73. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/sag/delete.py +0 -0
  74. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/sag/get.py +0 -0
  75. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/sag/list.py +0 -0
  76. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/task/__init__.py +0 -0
  77. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/task/cancel.py +0 -0
  78. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/task/delete.py +0 -0
  79. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/task/duplicate.py +0 -0
  80. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/task/get.py +0 -0
  81. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/task/list.py +0 -0
  82. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/task/log.py +0 -0
  83. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/task/namespaces.py +0 -0
  84. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/task/use.py +0 -0
  85. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/task/wait.py +0 -0
  86. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/upgrade.py +0 -0
  87. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/vm/__init__.py +0 -0
  88. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/vm/delete.py +0 -0
  89. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/vm/get.py +0 -0
  90. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/vm/list.py +0 -0
  91. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/vm/poweroff.py +0 -0
  92. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/vm/poweron.py +0 -0
  93. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/vm/restart.py +0 -0
  94. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/vm/shutdown.py +0 -0
  95. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/vm/use.py +0 -0
  96. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/cmds/vm/wait.py +0 -0
  97. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/config/default.yaml +0 -0
  98. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/config/int.yaml +0 -0
  99. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/config/prod.yaml +0 -0
  100. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/config/stg.yaml +0 -0
  101. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/__init__.py +0 -0
  102. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/_init.py +0 -0
  103. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/built_in_cmds/__init__.py +0 -0
  104. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/built_in_cmds/_ut.py +0 -0
  105. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/built_in_cmds/context.py +0 -0
  106. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/built_in_cmds/profile.py +0 -0
  107. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/cli_options.py +0 -0
  108. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/cli_processor.py +0 -0
  109. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/cmd_util.py +0 -0
  110. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/config.py +0 -0
  111. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/context.py +0 -0
  112. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/data_util.py +0 -0
  113. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/dispatcher.py +0 -0
  114. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/extension.py +0 -0
  115. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/fn_util.py +0 -0
  116. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/fstore.py +0 -0
  117. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/jsondot.py +0 -0
  118. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/logger.py +0 -0
  119. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/profile.py +0 -0
  120. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/profile_store.py +0 -0
  121. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/recent.py +0 -0
  122. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/state.py +0 -0
  123. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/telemetry.py +0 -0
  124. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/template_util.py +0 -0
  125. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/timeutil.py +0 -0
  126. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/util.py +0 -0
  127. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/ctxp/var_template.py +0 -0
  128. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/__init__.py +0 -0
  129. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/_util.py +0 -0
  130. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/__init__.py +0 -0
  131. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/activity.py +0 -0
  132. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/api.py +0 -0
  133. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/credential.py +0 -0
  134. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/deployment.py +0 -0
  135. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/entitlement.py +0 -0
  136. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/group.py +0 -0
  137. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/network.py +0 -0
  138. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/notification.py +0 -0
  139. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/org.py +0 -0
  140. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/pool.py +0 -0
  141. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/provider.py +0 -0
  142. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/sag.py +0 -0
  143. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/task.py +0 -0
  144. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/resources/vm.py +0 -0
  145. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/mcp/server.py +0 -0
  146. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/__init__.py +0 -0
  147. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/activity.py +0 -0
  148. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/api.py +0 -0
  149. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/broker/__init__.py +0 -0
  150. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/broker/entitlement.py +0 -0
  151. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/broker/pool_group.py +0 -0
  152. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/cockpit/__init__.py +0 -0
  153. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/cockpit/network.py +0 -0
  154. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/cockpit/pool.py +0 -0
  155. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/cockpit/provider.py +0 -0
  156. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/cockpit/sag.py +0 -0
  157. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/cockpit/vm.py +0 -0
  158. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/credential.py +0 -0
  159. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/deployment.py +0 -0
  160. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/notification.py +0 -0
  161. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/org.py +0 -0
  162. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/service/task.py +0 -0
  163. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/__init__.py +0 -0
  164. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/cli_options.py +0 -0
  165. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/client_util.py +0 -0
  166. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/csp.py +0 -0
  167. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/ez_client.py +0 -0
  168. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/init.py +0 -0
  169. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/mdc.py +0 -0
  170. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/payload_util.py +0 -0
  171. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/requtil.py +0 -0
  172. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/utils.py +0 -0
  173. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/sglib/zds_client.py +0 -0
  174. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/support/auth.py +0 -0
  175. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/support/payload.py +0 -0
  176. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/support/profile.py +0 -0
  177. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/support/task.py +0 -0
  178. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/support/test_utils.py +0 -0
  179. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/support/use_util.py +0 -0
  180. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/support/vm.py +0 -0
  181. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/util/exec_util.py +0 -0
  182. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/util/exit.py +0 -0
  183. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/util/param_util.py +0 -0
  184. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/util/patch_util.py +0 -0
  185. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/util/query_util.py +0 -0
  186. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/util/readonly.py +0 -0
  187. {zen_cli-0.1.5 → zen_cli-0.1.6}/src/zen_cli/util/versions.py +0 -0
  188. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/__init__.py +0 -0
  189. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_api.py +0 -0
  190. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_auth.py +0 -0
  191. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_completion.py +0 -0
  192. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_context.py +0 -0
  193. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_credential.py +0 -0
  194. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_deployment.py +0 -0
  195. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_entitlement.py +0 -0
  196. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_errors.py +0 -0
  197. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_group.py +0 -0
  198. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_io.py +0 -0
  199. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_login.py +0 -0
  200. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_logout.py +0 -0
  201. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_mcp.py +0 -0
  202. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_network.py +0 -0
  203. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_org.py +0 -0
  204. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_pool.py +0 -0
  205. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_profile.py +0 -0
  206. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_provider.py +0 -0
  207. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_root.py +0 -0
  208. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_sag.py +0 -0
  209. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_task.py +0 -0
  210. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/test_vm.py +0 -0
  211. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/blackbox/util.py +0 -0
  212. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/test_auth_status.py +0 -0
  213. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/test_cli.py +0 -0
  214. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/test_mcp.py +0 -0
  215. {zen_cli-0.1.5 → zen_cli-0.1.6}/tests/test_payload.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: zen-cli
3
- Version: 0.1.5
3
+ Version: 0.1.6
4
4
  Summary: CLI for Zen Desktop Service. Designed for AI and Human.
5
5
  Project-URL: Homepage, https://pypi.org/project/zen-cli/
6
6
  Author: zen-cli authors
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "zen-cli"
7
- version = "0.1.5"
7
+ version = "0.1.6"
8
8
  description = "CLI for Zen Desktop Service. Designed for AI and Human."
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -54,6 +54,8 @@ def refresh_oauth_token(
54
54
  refresh_token = old_oauth_token.get("refresh_token")
55
55
  if not refresh_token:
56
56
  raise Exception("CSP auth refresh failed: missing refresh_token")
57
+ if not client_id:
58
+ client_id = old_oauth_token.get("client_id")
57
59
  if not client_id:
58
60
  from .login_support import identify_client_id
59
61
 
@@ -64,16 +66,23 @@ def refresh_oauth_token(
64
66
  "refresh_token": refresh_token,
65
67
  "client_id": client_id,
66
68
  }
69
+ post_kwargs: dict[str, Any] = {
70
+ "headers": {"Content-Type": "application/x-www-form-urlencoded", "Accept": "application/json"},
71
+ "timeout": 20,
72
+ }
67
73
  if client_secret:
68
74
  data["client_secret"] = client_secret
69
- resp = httpx2.post(
70
- url,
71
- data=data,
72
- auth=(client_id, client_secret or ""),
73
- headers={"Content-Type": "application/x-www-form-urlencoded"},
74
- timeout=20,
75
- )
76
- resp.raise_for_status()
75
+ # Confidential clients only. Native/device apps are OIDC_AUTH_METHOD_TYPE_NONE;
76
+ # HTTP Basic with an empty secret makes ZITADEL reject the refresh as invalid_client.
77
+ post_kwargs["auth"] = (client_id, client_secret)
78
+ resp = httpx2.post(url, data=data, **post_kwargs)
79
+ if not resp.is_success:
80
+ try:
81
+ body = resp.json()
82
+ desc = body.get("error_description") or body.get("error") or resp.text
83
+ except Exception:
84
+ desc = resp.text or str(resp.status_code)
85
+ raise Exception(f"CSP auth refresh failed: {desc}")
77
86
  new_token = resp.json()
78
87
  log.debug(f"New auth token: {new_token}")
79
88
  if not new_token or not new_token.get("access_token"):
@@ -193,7 +202,7 @@ def _populate_token_with_cache(auth_config: Any, force_refresh: bool = False, ve
193
202
  print("Provider: csp.")
194
203
  try:
195
204
  csp_url = _cfg_get(auth_config, "url")
196
- client_id = _cfg_get(auth_config, "clientId", "client_id")
205
+ client_id = token.get("client_id") or _cfg_get(auth_config, "clientId", "client_id")
197
206
  if not client_id and _cfg_get(auth_config, "device"):
198
207
  from .login_support import identify_device_client_id
199
208
 
@@ -205,7 +214,7 @@ def _populate_token_with_cache(auth_config: Any, force_refresh: bool = False, ve
205
214
  client_secret=_cfg_get(auth_config, "clientSecret", "client_secret"),
206
215
  )
207
216
  except Exception as e:
208
- log.debug(f"Failed to refresh OAuth token: {e}")
217
+ log.warning("Failed to refresh OAuth token: %s", e)
209
218
  token = None
210
219
  else:
211
220
  if verbose:
@@ -205,6 +205,8 @@ def do_oauth2_pkce(csp_url: str, client_id: str, org_id: str) -> Any:
205
205
  )
206
206
 
207
207
  log.debug("token: %s", token)
208
+ if isinstance(token, dict):
209
+ token.setdefault("client_id", client_id)
208
210
  return token
209
211
 
210
212
 
@@ -295,6 +297,7 @@ def poll_device_access_token(
295
297
  token = resp.json()
296
298
  if not isinstance(token, dict) or not token.get("access_token"):
297
299
  raise CtxpException("Device-code login failed: token response had no access_token.")
300
+ token.setdefault("client_id", client_id)
298
301
  return token
299
302
  err, desc = _oauth_error(resp)
300
303
  if err == "authorization_pending":
@@ -5,7 +5,7 @@ from unittest.mock import patch
5
5
 
6
6
  from zen_cli.cmds.login import _is_missing_session, _validate_auth_method
7
7
  from zen_cli.ctxp import CtxpException
8
- from zen_cli.sglib.auth import get_org_id_from_token, jwt_from_oauth_token
8
+ from zen_cli.sglib.auth import get_org_id_from_token, jwt_from_oauth_token, refresh_oauth_token
9
9
  from zen_cli.sglib.login_support import (
10
10
  _device_scope,
11
11
  identify_daas_project_id,
@@ -109,6 +109,48 @@ class TestDeviceLogin(unittest.TestCase):
109
109
  poll_device_access_token("https://csp.example", "dc", interval=1, expires_in=30)
110
110
  self.assertIn("denied", str(ctx.exception).lower())
111
111
 
112
+ def test_public_client_refresh_does_not_send_http_basic(self) -> None:
113
+ captured: dict[str, object] = {}
114
+
115
+ def fake_post(url: str, **kwargs: object) -> _Resp:
116
+ captured["url"] = url
117
+ captured["data"] = kwargs.get("data")
118
+ captured["auth"] = kwargs.get("auth")
119
+ return _Resp(200, {"access_token": "new", "refresh_token": "rt2", "expires_in": 60})
120
+
121
+ with patch("httpx2.post", fake_post):
122
+ token = refresh_oauth_token(
123
+ {"refresh_token": "rt1", "client_id": "391271953115120140"},
124
+ "https://csp.example",
125
+ client_id="391271953115120140",
126
+ )
127
+ self.assertEqual(token["access_token"], "new")
128
+ self.assertIsNone(captured.get("auth"))
129
+ self.assertEqual(
130
+ captured.get("data"),
131
+ {
132
+ "grant_type": "refresh_token",
133
+ "refresh_token": "rt1",
134
+ "client_id": "391271953115120140",
135
+ },
136
+ )
137
+
138
+ def test_refresh_uses_client_id_stamped_on_token(self) -> None:
139
+ captured: dict[str, object] = {}
140
+
141
+ def fake_post(_url: str, **kwargs: object) -> _Resp:
142
+ captured["data"] = kwargs.get("data")
143
+ return _Resp(200, {"access_token": "new", "expires_in": 60})
144
+
145
+ with patch("httpx2.post", fake_post):
146
+ refresh_oauth_token(
147
+ {"refresh_token": "rt1", "client_id": "391271953115120140"},
148
+ "https://csp.example",
149
+ )
150
+ data = captured.get("data")
151
+ assert isinstance(data, dict)
152
+ self.assertEqual(data.get("client_id"), "391271953115120140")
153
+
112
154
  def test_org_id_from_opaque_access_and_id_token(self) -> None:
113
155
  oauth = {
114
156
  "access_token": "opaque-not-a-jwt",
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes