Skip to content

Commit 6d54518

Browse files
CLI: Update SDK to 5e56fc5d99a6a64596f09f85c1530fa51f9d7a7a and add new commands/flags (#139)
This PR updates the Go SDK to 5e56fc5d99a6a64596f09f85c1530fa51f9d7a7a and adds CLI commands/flags for new SDK methods. ## SDK Update - Updated kernel-go-sdk to 5e56fc5d99a6a64596f09f85c1530fa51f9d7a7a ## Coverage Analysis This PR was generated by performing a full enumeration of SDK methods and CLI commands. ## New Commands - `kernel deploy get` for `client.Deployments.Get()` - `kernel invoke get`, `kernel invoke update`, and `kernel invoke delete-browsers` for the corresponding invocation SDK methods - `kernel auth connections update` for `client.AuthConnections.Update()` ## New Flags - `--region` for `kernel deploy` and `kernel deploy github` - `--app-version` for `kernel deploy history` - `--since` for async `kernel invoke`, plus `--action`, `--deployment-id`, `--offset`, `--since`, and `--status` for `kernel invoke history` - `--query` for `kernel app list` - `--invocation-id` for `kernel browsers create` and `--include-deleted` for `kernel browsers get` - `--name` for `kernel credential-providers create` and `kernel credential-providers update` - `--sign-in-option-id` and `--sso-provider` for `kernel auth connections submit`, plus the new update flags for `kernel auth connections update` Triggered by: kernel/kernel-go-sdk@5e56fc5 Reviewer: @masnwilliams Made with [Cursor](https://cursor.com) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Moderate risk: expands CLI surface area and request parameter mapping across deployments/invocations/auth connections, which could break workflows if flags or validation are incorrect, but changes are mostly additive and covered by new unit tests. > > **Overview** > Updates `kernel-go-sdk` to a newer commit and wires newly-available API methods into the CLI. > > Adds new CLI capabilities: `kernel deploy get`, `kernel invoke get|update|delete-browsers`, and `kernel auth connections update`, plus richer filtering/options across existing commands (e.g., `app list --query`, `deploy --region` + `deploy history --app-version`, `invoke --since` and `invoke history --action/--deployment-id/--offset/--since/--status`). > > Extends browser and credential-provider flows with new flags (`browsers create --invocation-id`, `browsers get --include-deleted`, and required/provider `--name` support), tightens/clarifies auth submit modes (now *exactly one* of field/MFA/sign-in/SSO selector/provider), and improves “Next:” pagination hints by quoting values and using consistent `pterm` output; includes accompanying tests for new param mappings. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 7bc97e1. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> Co-authored-by: kernel-internal[bot] <260533166+kernel-internal[bot]@users.noreply.github.com> Co-authored-by: Mason Williams <43387599+masnwilliams@users.noreply.github.com>
1 parent 2866e73 commit 6d54518

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)