Skip to content

Commit 7bc97e1

Browse files
CLI: Update SDK to 5e56fc5d99a6 and add missing coverage
Expose the new SDK methods and params added since v0.44.0 so the CLI stays aligned with the generated client surface across deploys, invocations, managed auth, browsers, apps, and credential providers. Tested: go test ./..., go build ./..., kernel deploy get eqo2jzrlf8msevs8n6mbn4bf, kernel deploy history ts-basic --app-version latest, kernel app list --query ts-basic, kernel invoke ts-basic get-page-title --since 10m, kernel invoke get apwmow9vgbs220iwnwhc8lc8, kernel invoke history --app ts-basic --action get-page-title --deployment-id eqo2jzrlf8msevs8n6mbn4bf --status succeeded --since 24h, kernel invoke update bmncbxisjg1nv95hr3fa05dw --status failed --output '{"error":"manual test"}', kernel invoke delete-browsers bmncbxisjg1nv95hr3fa05dw, kernel browsers create --invocation-id qkpb5v6chmvm6bbr7j2fkxxg -t 30, kernel browsers get 2l9r4s41c04qy6ge2v5w38s0 --include-deleted, kernel auth connections update 5d71e33b-a099-4a85-a850-a9d1a5d6456b --health-check-interval 30 --save-credentials, kernel credential-providers update cp_hcpp4bm210p1yxxbw61eg7b4 --name cli-coverage-provider-updated Made-with: Cursor
1 parent a439418 commit 7bc97e1

File tree

10 files changed

+687
-32
lines changed

10 files changed

+687
-32
lines changed

cmd/app.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ func init() {
5353

5454
// Add optional filters for list
5555
appListCmd.Flags().String("name", "", "Filter by application name")
56+
appListCmd.Flags().String("query", "", "Search apps by name")
5657
appListCmd.Flags().String("version", "", "Filter by version label")
5758
appListCmd.Flags().Int("limit", 20, "Max apps to return (default 20)")
5859
appListCmd.Flags().Int("per-page", 20, "Items per page (alias of --limit)")
@@ -67,6 +68,7 @@ func init() {
6768
func runAppList(cmd *cobra.Command, args []string) error {
6869
client := getKernelClient(cmd)
6970
appName, _ := cmd.Flags().GetString("name")
71+
query, _ := cmd.Flags().GetString("query")
7072
version, _ := cmd.Flags().GetString("version")
7173
lim, _ := cmd.Flags().GetInt("limit")
7274
perPage, _ := cmd.Flags().GetInt("per-page")
@@ -101,6 +103,9 @@ func runAppList(cmd *cobra.Command, args []string) error {
101103
if appName != "" {
102104
params.AppName = kernel.Opt(appName)
103105
}
106+
if query != "" {
107+
params.Query = kernel.Opt(query)
108+
}
104109
if version != "" {
105110
params.Version = kernel.Opt(version)
106111
}
@@ -170,17 +175,20 @@ func runAppList(cmd *cobra.Command, args []string) error {
170175
PrintTableNoPad(tableData, true)
171176

172177
// Footer with pagination details and next command suggestion
173-
fmt.Printf("\nPage: %d Per-page: %d Items this page: %d Has more: %s\n", page, perPage, itemsThisPage, lo.Ternary(hasMore, "yes", "no"))
178+
pterm.Printf("\nPage: %d Per-page: %d Items this page: %d Has more: %s\n", page, perPage, itemsThisPage, lo.Ternary(hasMore, "yes", "no"))
174179
if hasMore {
175180
nextPage := page + 1
176181
nextCmd := fmt.Sprintf("kernel app list --page %d --per-page %d", nextPage, perPage)
177182
if appName != "" {
178-
nextCmd += fmt.Sprintf(" --name %s", appName)
183+
nextCmd += fmt.Sprintf(" --name %s", quoteIfNeeded(appName))
184+
}
185+
if query != "" {
186+
nextCmd += fmt.Sprintf(" --query %s", quoteIfNeeded(query))
179187
}
180188
if version != "" {
181-
nextCmd += fmt.Sprintf(" --version %s", version)
189+
nextCmd += fmt.Sprintf(" --version %s", quoteIfNeeded(version))
182190
}
183-
fmt.Printf("Next: %s\n", nextCmd)
191+
pterm.Printf("Next: %s\n", nextCmd)
184192
}
185193
// Concise notes when user-specified per-page/limit/page are outside API-allowed range
186194
if cmd.Flags().Changed("per-page") {

cmd/auth_connections.go

Lines changed: 214 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
type AuthConnectionService interface {
2020
New(ctx context.Context, body kernel.AuthConnectionNewParams, opts ...option.RequestOption) (res *kernel.ManagedAuth, err error)
2121
Get(ctx context.Context, id string, opts ...option.RequestOption) (res *kernel.ManagedAuth, err error)
22+
Update(ctx context.Context, id string, body kernel.AuthConnectionUpdateParams, opts ...option.RequestOption) (res *kernel.ManagedAuth, err error)
2223
List(ctx context.Context, query kernel.AuthConnectionListParams, opts ...option.RequestOption) (res *pagination.OffsetPagination[kernel.ManagedAuth], err error)
2324
Delete(ctx context.Context, id string, opts ...option.RequestOption) (err error)
2425
Login(ctx context.Context, id string, body kernel.AuthConnectionLoginParams, opts ...option.RequestOption) (res *kernel.LoginResponse, err error)
@@ -53,6 +54,29 @@ type AuthConnectionGetInput struct {
5354
Output string
5455
}
5556

57+
type AuthConnectionUpdateInput struct {
58+
ID string
59+
LoginURL string
60+
LoginURLSet bool
61+
AllowedDomains []string
62+
AllowedDomainsSet bool
63+
CredentialName string
64+
CredentialNameSet bool
65+
CredentialProvider string
66+
CredentialProviderSet bool
67+
CredentialPath string
68+
CredentialPathSet bool
69+
CredentialAuto BoolFlag
70+
ProxyID string
71+
ProxyIDSet bool
72+
ProxyName string
73+
ProxyNameSet bool
74+
SaveCredentials BoolFlag
75+
HealthCheckInterval int
76+
HealthCheckIntervalSet bool
77+
Output string
78+
}
79+
5680
type AuthConnectionListInput struct {
5781
Domain string
5882
ProfileName string
@@ -77,7 +101,9 @@ type AuthConnectionSubmitInput struct {
77101
ID string
78102
FieldValues map[string]string
79103
MfaOptionID string
104+
SignInOptionID string
80105
SSOButtonSelector string
106+
SSOProvider string
81107
Output string
82108
}
83109

@@ -159,7 +185,11 @@ func (c AuthConnectionCmd) Create(ctx context.Context, in AuthConnectionCreateIn
159185
}
160186

161187
pterm.Success.Printf("Created managed auth: %s\n", auth.ID)
188+
printManagedAuthSummary(auth)
189+
return nil
190+
}
162191

192+
func printManagedAuthSummary(auth *kernel.ManagedAuth) {
163193
tableData := pterm.TableData{
164194
{"Property", "Value"},
165195
{"ID", auth.ID},
@@ -177,8 +207,91 @@ func (c AuthConnectionCmd) Create(ctx context.Context, in AuthConnectionCreateIn
177207
if auth.Credential.Provider != "" {
178208
tableData = append(tableData, []string{"Credential Provider", auth.Credential.Provider})
179209
}
180-
210+
if auth.ProxyID != "" {
211+
tableData = append(tableData, []string{"Proxy ID", auth.ProxyID})
212+
}
181213
PrintTableNoPad(tableData, true)
214+
}
215+
216+
func (c AuthConnectionCmd) Update(ctx context.Context, in AuthConnectionUpdateInput) error {
217+
if in.Output != "" && in.Output != "json" {
218+
return fmt.Errorf("unsupported --output value: use 'json'")
219+
}
220+
221+
params := kernel.AuthConnectionUpdateParams{
222+
ManagedAuthUpdateRequest: kernel.ManagedAuthUpdateRequestParam{},
223+
}
224+
hasChanges := false
225+
226+
if in.HealthCheckIntervalSet {
227+
params.ManagedAuthUpdateRequest.HealthCheckInterval = kernel.Opt(int64(in.HealthCheckInterval))
228+
hasChanges = true
229+
}
230+
if in.LoginURLSet {
231+
params.ManagedAuthUpdateRequest.LoginURL = kernel.Opt(in.LoginURL)
232+
hasChanges = true
233+
}
234+
if in.SaveCredentials.Set {
235+
params.ManagedAuthUpdateRequest.SaveCredentials = kernel.Opt(in.SaveCredentials.Value)
236+
hasChanges = true
237+
}
238+
if in.AllowedDomainsSet {
239+
params.ManagedAuthUpdateRequest.AllowedDomains = in.AllowedDomains
240+
hasChanges = true
241+
}
242+
243+
credentialChanged := in.CredentialNameSet || in.CredentialProviderSet || in.CredentialPathSet || in.CredentialAuto.Set
244+
if credentialChanged {
245+
if strings.TrimSpace(in.CredentialName) != "" && strings.TrimSpace(in.CredentialProvider) != "" {
246+
return fmt.Errorf("credential reference must use either --credential-name or --credential-provider")
247+
}
248+
params.ManagedAuthUpdateRequest.Credential = kernel.ManagedAuthUpdateRequestCredentialParam{}
249+
if in.CredentialNameSet {
250+
params.ManagedAuthUpdateRequest.Credential.Name = kernel.Opt(in.CredentialName)
251+
}
252+
if in.CredentialProviderSet {
253+
params.ManagedAuthUpdateRequest.Credential.Provider = kernel.Opt(in.CredentialProvider)
254+
}
255+
if in.CredentialPathSet {
256+
params.ManagedAuthUpdateRequest.Credential.Path = kernel.Opt(in.CredentialPath)
257+
}
258+
if in.CredentialAuto.Set {
259+
params.ManagedAuthUpdateRequest.Credential.Auto = kernel.Opt(in.CredentialAuto.Value)
260+
}
261+
hasChanges = true
262+
}
263+
264+
proxyChanged := in.ProxyIDSet || in.ProxyNameSet
265+
if proxyChanged {
266+
params.ManagedAuthUpdateRequest.Proxy = kernel.ManagedAuthUpdateRequestProxyParam{}
267+
if in.ProxyIDSet {
268+
params.ManagedAuthUpdateRequest.Proxy.ID = kernel.Opt(in.ProxyID)
269+
}
270+
if in.ProxyNameSet {
271+
params.ManagedAuthUpdateRequest.Proxy.Name = kernel.Opt(in.ProxyName)
272+
}
273+
hasChanges = true
274+
}
275+
276+
if !hasChanges {
277+
return fmt.Errorf("must provide at least one field to update")
278+
}
279+
280+
if in.Output != "json" {
281+
pterm.Info.Printf("Updating managed auth %s...\n", in.ID)
282+
}
283+
284+
auth, err := c.svc.Update(ctx, in.ID, params)
285+
if err != nil {
286+
return util.CleanedUpSdkError{Err: err}
287+
}
288+
289+
if in.Output == "json" {
290+
return util.PrintPrettyJSON(auth)
291+
}
292+
293+
pterm.Success.Printf("Updated managed auth: %s\n", auth.ID)
294+
printManagedAuthSummary(auth)
182295
return nil
183296
}
184297

@@ -444,10 +557,21 @@ func (c AuthConnectionCmd) Submit(ctx context.Context, in AuthConnectionSubmitIn
444557
// Validate that we have some input to submit
445558
hasFields := len(in.FieldValues) > 0
446559
hasMfaOption := in.MfaOptionID != ""
560+
hasSignInOption := in.SignInOptionID != ""
447561
hasSSOButton := in.SSOButtonSelector != ""
562+
hasSSOProvider := in.SSOProvider != ""
563+
submitModes := 0
564+
for _, active := range []bool{hasFields, hasMfaOption, hasSignInOption, hasSSOButton, hasSSOProvider} {
565+
if active {
566+
submitModes++
567+
}
568+
}
448569

449-
if !hasFields && !hasMfaOption && !hasSSOButton {
450-
return fmt.Errorf("must provide at least one of: --field, --mfa-option-id, or --sso-button-selector")
570+
if submitModes == 0 {
571+
return fmt.Errorf("must provide exactly one of: --field, --mfa-option-id, --sign-in-option-id, --sso-button-selector, or --sso-provider")
572+
}
573+
if submitModes > 1 {
574+
return fmt.Errorf("provide exactly one of: --field, --mfa-option-id, --sign-in-option-id, --sso-button-selector, or --sso-provider")
451575
}
452576

453577
// Resolve MFA option: the user may pass the label (e.g. "Get a text"), the
@@ -489,9 +613,15 @@ func (c AuthConnectionCmd) Submit(ctx context.Context, in AuthConnectionSubmitIn
489613
if hasMfaOption {
490614
params.SubmitFieldsRequest.MfaOptionID = kernel.Opt(in.MfaOptionID)
491615
}
616+
if hasSignInOption {
617+
params.SubmitFieldsRequest.SignInOptionID = kernel.Opt(in.SignInOptionID)
618+
}
492619
if hasSSOButton {
493620
params.SubmitFieldsRequest.SSOButtonSelector = kernel.Opt(in.SSOButtonSelector)
494621
}
622+
if hasSSOProvider {
623+
params.SubmitFieldsRequest.SSOProvider = kernel.Opt(in.SSOProvider)
624+
}
495625

496626
if in.Output != "json" {
497627
pterm.Info.Println("Submitting to managed auth...")
@@ -594,6 +724,14 @@ var authConnectionsCreateCmd = &cobra.Command{
594724
RunE: runAuthConnectionsCreate,
595725
}
596726

727+
var authConnectionsUpdateCmd = &cobra.Command{
728+
Use: "update <id>",
729+
Short: "Update a managed auth connection",
730+
Long: "Update managed authentication settings like login URL, health checks, credential source, and proxy.",
731+
Args: cobra.ExactArgs(1),
732+
RunE: runAuthConnectionsUpdate,
733+
}
734+
597735
var authConnectionsGetCmd = &cobra.Command{
598736
Use: "get <id>",
599737
Short: "Get a managed auth by ID",
@@ -666,10 +804,27 @@ func init() {
666804
authConnectionsCreateCmd.Flags().Int("health-check-interval", 0, "Interval in seconds between health checks (300-86400)")
667805
_ = authConnectionsCreateCmd.MarkFlagRequired("domain")
668806
_ = authConnectionsCreateCmd.MarkFlagRequired("profile-name")
807+
authConnectionsCreateCmd.MarkFlagsMutuallyExclusive("credential-name", "credential-provider")
669808

670809
// Get flags
671810
authConnectionsGetCmd.Flags().StringP("output", "o", "", "Output format: json for raw API response")
672811

812+
// Update flags
813+
authConnectionsUpdateCmd.Flags().StringP("output", "o", "", "Output format: json for raw API response")
814+
authConnectionsUpdateCmd.Flags().String("login-url", "", "Login page URL (set to empty string to clear)")
815+
authConnectionsUpdateCmd.Flags().StringSlice("allowed-domain", []string{}, "Additional allowed domains (replaces existing list)")
816+
authConnectionsUpdateCmd.Flags().String("credential-name", "", "Kernel credential name to use")
817+
authConnectionsUpdateCmd.Flags().String("credential-provider", "", "External credential provider name")
818+
authConnectionsUpdateCmd.Flags().String("credential-path", "", "Provider-specific path (e.g., VaultName/ItemName)")
819+
authConnectionsUpdateCmd.Flags().Bool("credential-auto", false, "Lookup by domain from the specified provider")
820+
authConnectionsUpdateCmd.Flags().String("proxy-id", "", "Proxy ID to use")
821+
authConnectionsUpdateCmd.Flags().String("proxy-name", "", "Proxy name to use")
822+
authConnectionsUpdateCmd.Flags().Bool("save-credentials", false, "Enable saving credentials after successful login")
823+
authConnectionsUpdateCmd.Flags().Bool("no-save-credentials", false, "Disable saving credentials after successful login")
824+
authConnectionsUpdateCmd.Flags().Int("health-check-interval", 0, "Interval in seconds between health checks")
825+
authConnectionsUpdateCmd.MarkFlagsMutuallyExclusive("credential-name", "credential-provider")
826+
authConnectionsUpdateCmd.MarkFlagsMutuallyExclusive("save-credentials", "no-save-credentials")
827+
673828
// List flags
674829
authConnectionsListCmd.Flags().StringP("output", "o", "", "Output format: json for raw API response")
675830
authConnectionsListCmd.Flags().String("domain", "", "Filter by domain")
@@ -689,13 +844,16 @@ func init() {
689844
authConnectionsSubmitCmd.Flags().StringP("output", "o", "", "Output format: json for raw API response")
690845
authConnectionsSubmitCmd.Flags().StringArray("field", []string{}, "Field name=value pair (repeatable)")
691846
authConnectionsSubmitCmd.Flags().String("mfa-option-id", "", "MFA option ID if user selected an MFA method")
847+
authConnectionsSubmitCmd.Flags().String("sign-in-option-id", "", "Sign-in option ID if the flow returned non-MFA choices")
692848
authConnectionsSubmitCmd.Flags().String("sso-button-selector", "", "XPath selector if user chose an SSO button")
849+
authConnectionsSubmitCmd.Flags().String("sso-provider", "", "SSO provider if user chose an SSO button by provider (e.g. google, github)")
693850

694851
// Follow flags
695852
authConnectionsFollowCmd.Flags().StringP("output", "o", "", "Output format: json for raw API response")
696853

697854
// Wire up commands
698855
authConnectionsCmd.AddCommand(authConnectionsCreateCmd)
856+
authConnectionsCmd.AddCommand(authConnectionsUpdateCmd)
699857
authConnectionsCmd.AddCommand(authConnectionsGetCmd)
700858
authConnectionsCmd.AddCommand(authConnectionsListCmd)
701859
authConnectionsCmd.AddCommand(authConnectionsDeleteCmd)
@@ -753,6 +911,55 @@ func runAuthConnectionsGet(cmd *cobra.Command, args []string) error {
753911
})
754912
}
755913

914+
func runAuthConnectionsUpdate(cmd *cobra.Command, args []string) error {
915+
client := getKernelClient(cmd)
916+
output, _ := cmd.Flags().GetString("output")
917+
loginURL, _ := cmd.Flags().GetString("login-url")
918+
allowedDomains, _ := cmd.Flags().GetStringSlice("allowed-domain")
919+
credentialName, _ := cmd.Flags().GetString("credential-name")
920+
credentialProvider, _ := cmd.Flags().GetString("credential-provider")
921+
credentialPath, _ := cmd.Flags().GetString("credential-path")
922+
credentialAuto, _ := cmd.Flags().GetBool("credential-auto")
923+
proxyID, _ := cmd.Flags().GetString("proxy-id")
924+
proxyName, _ := cmd.Flags().GetString("proxy-name")
925+
saveCredentials, _ := cmd.Flags().GetBool("save-credentials")
926+
noSaveCredentials, _ := cmd.Flags().GetBool("no-save-credentials")
927+
healthCheckInterval, _ := cmd.Flags().GetInt("health-check-interval")
928+
929+
saveCredentialsFlag := BoolFlag{}
930+
if cmd.Flags().Changed("save-credentials") {
931+
saveCredentialsFlag = BoolFlag{Set: true, Value: saveCredentials}
932+
}
933+
if cmd.Flags().Changed("no-save-credentials") {
934+
saveCredentialsFlag = BoolFlag{Set: true, Value: !noSaveCredentials}
935+
}
936+
937+
svc := client.Auth.Connections
938+
c := AuthConnectionCmd{svc: &svc}
939+
return c.Update(cmd.Context(), AuthConnectionUpdateInput{
940+
ID: args[0],
941+
LoginURL: loginURL,
942+
LoginURLSet: cmd.Flags().Changed("login-url"),
943+
AllowedDomains: allowedDomains,
944+
AllowedDomainsSet: cmd.Flags().Changed("allowed-domain"),
945+
CredentialName: credentialName,
946+
CredentialNameSet: cmd.Flags().Changed("credential-name"),
947+
CredentialProvider: credentialProvider,
948+
CredentialProviderSet: cmd.Flags().Changed("credential-provider"),
949+
CredentialPath: credentialPath,
950+
CredentialPathSet: cmd.Flags().Changed("credential-path"),
951+
CredentialAuto: BoolFlag{Set: cmd.Flags().Changed("credential-auto"), Value: credentialAuto},
952+
ProxyID: proxyID,
953+
ProxyIDSet: cmd.Flags().Changed("proxy-id"),
954+
ProxyName: proxyName,
955+
ProxyNameSet: cmd.Flags().Changed("proxy-name"),
956+
SaveCredentials: saveCredentialsFlag,
957+
HealthCheckInterval: healthCheckInterval,
958+
HealthCheckIntervalSet: cmd.Flags().Changed("health-check-interval"),
959+
Output: output,
960+
})
961+
}
962+
756963
func runAuthConnectionsList(cmd *cobra.Command, args []string) error {
757964
client := getKernelClient(cmd)
758965
output, _ := cmd.Flags().GetString("output")
@@ -805,7 +1012,9 @@ func runAuthConnectionsSubmit(cmd *cobra.Command, args []string) error {
8051012
output, _ := cmd.Flags().GetString("output")
8061013
fieldPairs, _ := cmd.Flags().GetStringArray("field")
8071014
mfaOptionID, _ := cmd.Flags().GetString("mfa-option-id")
1015+
signInOptionID, _ := cmd.Flags().GetString("sign-in-option-id")
8081016
ssoButtonSelector, _ := cmd.Flags().GetString("sso-button-selector")
1017+
ssoProvider, _ := cmd.Flags().GetString("sso-provider")
8091018

8101019
// Parse field pairs into map
8111020
fieldValues := make(map[string]string)
@@ -823,7 +1032,9 @@ func runAuthConnectionsSubmit(cmd *cobra.Command, args []string) error {
8231032
ID: args[0],
8241033
FieldValues: fieldValues,
8251034
MfaOptionID: mfaOptionID,
1035+
SignInOptionID: signInOptionID,
8261036
SSOButtonSelector: ssoButtonSelector,
1037+
SSOProvider: ssoProvider,
8271038
Output: output,
8281039
})
8291040
}

0 commit comments

Comments
 (0)