Skip to content

Commit 74262f5

Browse files
authored
Enable ap-southeast in browser commands (#238)
## Summary - update the Go SDK dependency to v0.95.0 - accept `ap-southeast` for browser and browser-pool create/list commands - update command help, documentation, and region tests - adapt to the latest managed-auth and telemetry SDK types without changing behavior ## Test plan - `make test` - `make build` <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Mostly documentation, validation, and SDK alignment; region and telemetry/auth display changes are additive or equivalent mappings. > > **Overview** > Adds **`ap-southeast`** as a supported `--region` value for browser sessions and browser pools (list/create), wired through `availableRegions()` / `parseRegionFlag`, Cobra help text, and the README. Region tests now exercise `ap-southeast` against the new SDK enum constants. > > Bumps **`github.com/kernel/kernel-go-sdk`** from **v0.92.0** to **v0.95.0** and adapts to type changes without intended behavior shifts: managed-auth field display maps **replace-existing** from `Reason == "rejected"` instead of `ReplaceExisting`, and enabling **control** telemetry uses `BrowserTelemetryControlConfigParam` rather than the generic category param. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 007eac2. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY --> Co-authored-by: tnsardesai <18272584+tnsardesai@users.noreply.github.com>
1 parent 9565957 commit 74262f5

10 files changed

Lines changed: 29 additions & 27 deletions

‎README.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,14 +210,14 @@ Commands with JSON output support:
210210

211211
- `kernel browsers list` - List running browsers
212212
- `--query <q>` - Search by name, session ID, profile ID, proxy ID, or pool name
213-
- `--region us-east|eu-west` - Filter by geographic region; omit to list sessions in all regions
213+
- `--region us-east|eu-west|ap-southeast` - Filter by geographic region; omit to list sessions in all regions
214214
- `--tag <KEY=VALUE>` - Filter by tag, repeatable; a session must match every pair
215215
- `--output json`, `-o json` - Output raw JSON array
216216
- `kernel browsers create` - Create a new browser session
217217
- `-s, --stealth` - Launch browser in stealth mode to avoid detection
218218
- `-H, --headless` - Launch browser without GUI access
219219
- `--kiosk` - Launch browser in kiosk mode
220-
- `--region us-east|eu-west` - Geographic region for the session. Fixed once the session is created; requires a Start-Up or Enterprise plan and defaults to `us-east`.
220+
- `--region us-east|eu-west|ap-southeast` - Geographic region for the session. Fixed once the session is created; requires a Start-Up or Enterprise plan and defaults to `us-east`.
221221
- `--private-host <host>` - Destination the browser reaches directly through the session's own network instead of Kernel-managed egress, for private hosts on a VPN or tunnel the session joins (repeatable or comma-separated, max 32). Accepts hostname patterns (`*.example.ts.net`), IPs (`10.1.30.63`, `[fd00::1]`), and private CIDRs (`100.64.0.0/10`). Replaces the default private ranges (RFC1918, `100.64.0.0/10`, `fc00::/7`); omit to keep them. Fixed once the session is created. Unrelated to a proxy's `--bypass-host`, which only chooses between upstream proxy and Kernel-managed direct egress.
222222
- `--start-url <url>` - Initial page to open on launch
223223
- `--proxy-id <id>` / `--proxy-name <name>` - Use that proxy for the session regardless of stealth (mutually exclusive with each other and with `--proxy-mode`)
@@ -270,7 +270,7 @@ Commands with JSON output support:
270270
### Browser Pools
271271

272272
- `kernel browser-pools list` - List browser pools
273-
- `--region us-east|eu-west` - Filter by geographic region; omit to list pools in all regions
273+
- `--region us-east|eu-west|ap-southeast` - Filter by geographic region; omit to list pools in all regions
274274
- `--output json`, `-o json` - Output raw JSON array
275275
- `kernel browser-pools create` - Create a browser pool
276276
- `--name <name>` - Optional unique name for the pool

‎cmd/auth_connections.go‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ func (c AuthConnectionCmd) Get(ctx context.Context, in AuthConnectionGetInput) e
548548
Ref: f.Ref,
549549
Hint: f.Hint,
550550
Required: f.Required,
551-
ReplaceExisting: f.ReplaceExisting,
551+
ReplaceExisting: f.Reason == "rejected",
552552
}))
553553
}
554554
tableData = append(tableData, []string{"Fields", strings.Join(fields, "; ")})
@@ -1073,7 +1073,7 @@ func (c AuthConnectionCmd) Follow(ctx context.Context, in AuthConnectionFollowIn
10731073
Ref: f.Ref,
10741074
Hint: f.Hint,
10751075
Required: f.Required,
1076-
ReplaceExisting: f.ReplaceExisting,
1076+
ReplaceExisting: f.Reason == "rejected",
10771077
}))
10781078
}
10791079
pterm.Info.Printf(" Fields: %s\n", strings.Join(fields, ", "))

‎cmd/browser_pools.go‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -726,7 +726,7 @@ func init() {
726726
browserPoolsListCmd.Flags().String("query", "", "Search browser pools by name (IDs match by exact value)")
727727
browserPoolsListCmd.Flags().Int("limit", 0, "Maximum number of pools to return")
728728
browserPoolsListCmd.Flags().Int("offset", 0, "Number of pools to skip (for pagination)")
729-
browserPoolsListCmd.Flags().String("region", "", "Filter by geographic region: 'us-east' or 'eu-west' (omit to list pools in all regions)")
729+
browserPoolsListCmd.Flags().String("region", "", "Filter by geographic region: 'us-east', 'eu-west', or 'ap-southeast' (omit to list pools in all regions)")
730730

731731
addJSONOutputFlag(browserPoolsCreateCmd)
732732
browserPoolsCreateCmd.Flags().String("name", "", "Optional unique name for the pool")
@@ -741,7 +741,7 @@ func init() {
741741
browserPoolsCreateCmd.Flags().String("profile-id", "", "Profile ID")
742742
browserPoolsCreateCmd.Flags().String("profile-name", "", "Profile name")
743743
browserPoolsCreateCmd.Flags().String("proxy-id", "", "Proxy ID")
744-
browserPoolsCreateCmd.Flags().String("region", "", "Geographic region for the pool: 'us-east' or 'eu-west'. Fixed once the pool is created; requires a Start-Up or Enterprise plan and defaults to us-east")
744+
browserPoolsCreateCmd.Flags().String("region", "", "Geographic region for the pool: 'us-east', 'eu-west', or 'ap-southeast'. Fixed once the pool is created; requires a Start-Up or Enterprise plan and defaults to us-east")
745745
browserPoolsCreateCmd.Flags().StringSlice("private-host", nil, "Destinations browsers in the pool reach directly through their own network instead of Kernel-managed egress, for private hosts on a VPN or tunnel they join (repeat or comma-separated, max 32). Accepts hostname patterns ('*.example.ts.net'), IPs ('10.1.30.63', '[fd00::1]'), and private CIDRs ('100.64.0.0/10'). Replaces the default private ranges (RFC1918, 100.64.0.0/10, fc00::/7); omit to keep them")
746746
browserPoolsCreateCmd.Flags().String("start-url", "", "Initial page to open for new browsers")
747747
browserPoolsCreateCmd.Flags().StringSlice("extension", []string{}, "Extension IDs or names")

‎cmd/browser_pools_test.go‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -137,17 +137,17 @@ func TestBrowserPoolsList_ForwardsRegion(t *testing.T) {
137137
ListFunc: func(ctx context.Context, query kernel.BrowserPoolListParams, opts ...option.RequestOption) (*pagination.OffsetPagination[kernel.BrowserPool], error) {
138138
captured = query
139139
return &pagination.OffsetPagination[kernel.BrowserPool]{Items: []kernel.BrowserPool{
140-
{ID: "pool-1", Region: kernel.BrowserPoolRegionEuWest},
140+
{ID: "pool-1", Region: kernel.BrowserPoolRegionApSoutheast},
141141
}}, nil
142142
},
143143
}
144144

145145
c := BrowserPoolsCmd{client: fake}
146-
err := c.List(context.Background(), BrowserPoolsListInput{Region: "eu-west"})
146+
err := c.List(context.Background(), BrowserPoolsListInput{Region: "ap-southeast"})
147147

148148
assert.NoError(t, err)
149-
assert.Equal(t, kernel.BrowserPoolListParamsRegionEuWest, captured.Region)
150-
assert.Contains(t, outBuf.String(), "eu-west")
149+
assert.Equal(t, kernel.BrowserPoolListParamsRegionApSoutheast, captured.Region)
150+
assert.Contains(t, outBuf.String(), "ap-southeast")
151151

152152
// Omitting the flag leaves the param unset, so all regions are listed.
153153
captured = kernel.BrowserPoolListParams{}
@@ -167,13 +167,13 @@ func TestBrowserPoolsCreate_WithRegion(t *testing.T) {
167167
fake := &FakeBrowserPoolsService{
168168
NewFunc: func(ctx context.Context, body kernel.BrowserPoolNewParams, opts ...option.RequestOption) (*kernel.BrowserPool, error) {
169169
captured = body
170-
return &kernel.BrowserPool{ID: "pool-1", Region: kernel.BrowserPoolRegionEuWest}, nil
170+
return &kernel.BrowserPool{ID: "pool-1", Region: kernel.BrowserPoolRegionApSoutheast}, nil
171171
},
172172
}
173173

174174
c := BrowserPoolsCmd{client: fake}
175-
require.NoError(t, c.Create(context.Background(), BrowserPoolsCreateInput{Size: 1, Region: "eu-west"}))
176-
assert.Equal(t, kernel.BrowserPoolNewParamsRegionEuWest, captured.Region)
175+
require.NoError(t, c.Create(context.Background(), BrowserPoolsCreateInput{Size: 1, Region: "ap-southeast"}))
176+
assert.Equal(t, kernel.BrowserPoolNewParamsRegionApSoutheast, captured.Region)
177177

178178
// Omitting the flag leaves the region unset so the API default applies.
179179
require.NoError(t, c.Create(context.Background(), BrowserPoolsCreateInput{Size: 1}))

‎cmd/browsers.go‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ func parseViewport(viewport string) (width, height, refreshRate int64, err error
165165
// availableRegions returns the geographic regions the API accepts for browser
166166
// sessions and pools.
167167
func availableRegions() []string {
168-
return []string{"us-east", "eu-west"}
168+
return []string{"us-east", "eu-west", "ap-southeast"}
169169
}
170170

171171
// parseRegionFlag validates a --region value. An empty value means the flag was
@@ -2659,7 +2659,7 @@ func init() {
26592659
browsersListCmd.Flags().Int("limit", 0, "Maximum number of results to return (default 20, max 100)")
26602660
browsersListCmd.Flags().Int("offset", 0, "Number of results to skip (for pagination)")
26612661
browsersListCmd.Flags().String("query", "", "Search browsers by name, session ID, profile ID, proxy ID, or pool name")
2662-
browsersListCmd.Flags().String("region", "", "Filter by geographic region: 'us-east' or 'eu-west' (omit to list sessions in all regions)")
2662+
browsersListCmd.Flags().String("region", "", "Filter by geographic region: 'us-east', 'eu-west', or 'ap-southeast' (omit to list sessions in all regions)")
26632663
browsersListCmd.Flags().StringArray("tag", nil, "Filter by tag KEY=VALUE (repeatable; a session must match every pair)")
26642664

26652665
// get flags
@@ -2954,7 +2954,7 @@ func init() {
29542954
browsersCreateCmd.Flags().String("proxy-id", "", "Proxy ID to use for the browser session (mutually exclusive with --proxy-name and --proxy-mode)")
29552955
browsersCreateCmd.Flags().String("proxy-name", "", "Proxy name to use for the browser session; must match exactly one active proxy in the project (mutually exclusive with --proxy-id and --proxy-mode)")
29562956
browsersCreateCmd.Flags().String("proxy-mode", "", "Proxy egress mode instead of a selected proxy: 'direct' for no proxy regardless of stealth, or 'default' for the browser default (Kernel's stealth proxy when --stealth is set, direct egress otherwise)")
2957-
browsersCreateCmd.Flags().String("region", "", "Geographic region for the session: 'us-east' or 'eu-west'. Fixed once the session is created; requires a Start-Up or Enterprise plan and defaults to us-east")
2957+
browsersCreateCmd.Flags().String("region", "", "Geographic region for the session: 'us-east', 'eu-west', or 'ap-southeast'. Fixed once the session is created; requires a Start-Up or Enterprise plan and defaults to us-east")
29582958
browsersCreateCmd.Flags().StringSlice("private-host", nil, "Destinations the browser reaches directly through its own network instead of Kernel-managed egress, for private hosts on a VPN or tunnel the session joins (repeat or comma-separated, max 32). Accepts hostname patterns ('*.example.ts.net'), IPs ('10.1.30.63', '[fd00::1]'), and private CIDRs ('100.64.0.0/10'). Replaces the default private ranges (RFC1918, 100.64.0.0/10, fc00::/7); omit to keep them. Fixed once the session is created")
29592959
browsersCreateCmd.Flags().String("start-url", "", "Initial page to open on launch")
29602960
browsersCreateCmd.Flags().StringSlice("extension", []string{}, "Extension IDs or names to load (repeatable; may be passed multiple times or comma-separated)")

‎cmd/browsers_telemetry.go‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func parseTelemetryCategories(s string) (kernel.BrowserTelemetryCategoriesConfig
7676
case "interaction":
7777
p.Interaction = on()
7878
case "control":
79-
p.Control = on()
79+
p.Control = kernel.BrowserTelemetryControlConfigParam{Enabled: kernel.Opt(true)}
8080
case "connection":
8181
p.Connection = on()
8282
case "system":

‎cmd/browsers_telemetry_test.go‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,10 +303,12 @@ func TestParseTelemetryCategories_OptInList(t *testing.T) {
303303

304304
assert.NoError(t, err)
305305
// Listed categories are enabled.
306-
for _, c := range []kernel.BrowserTelemetryCategoryConfigParam{p.Network, p.Control, p.Captcha} {
306+
for _, c := range []kernel.BrowserTelemetryCategoryConfigParam{p.Network, p.Captcha} {
307307
assert.True(t, c.Enabled.Valid())
308308
assert.True(t, c.Enabled.Value)
309309
}
310+
assert.True(t, p.Control.Enabled.Valid())
311+
assert.True(t, p.Control.Enabled.Value)
310312
// Unlisted categories are omitted (opt-in: the instance treats them as off).
311313
assert.False(t, p.Console.Enabled.Valid())
312314
assert.False(t, p.Page.Enabled.Valid())

‎cmd/browsers_test.go‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -467,9 +467,9 @@ func TestBrowsersList_WithRegion_PassesParam(t *testing.T) {
467467
}
468468
b := BrowsersCmd{browsers: fake}
469469

470-
err := b.List(context.Background(), BrowsersListInput{Region: "eu-west"})
470+
err := b.List(context.Background(), BrowsersListInput{Region: "ap-southeast"})
471471
assert.NoError(t, err)
472-
assert.Equal(t, kernel.BrowserListParamsRegionEuWest, captured.Region)
472+
assert.Equal(t, kernel.BrowserListParamsRegionApSoutheast, captured.Region)
473473

474474
// Omitting the flag leaves the param unset, so all regions are listed.
475475
captured = kernel.BrowserListParams{}
@@ -573,13 +573,13 @@ func TestBrowsersCreate_WithRegion(t *testing.T) {
573573
}
574574
b := BrowsersCmd{browsers: fake}
575575

576-
err := b.Create(context.Background(), BrowsersCreateInput{Region: "eu-west"})
576+
err := b.Create(context.Background(), BrowsersCreateInput{Region: "ap-southeast"})
577577
require.NoError(t, err)
578-
assert.Equal(t, kernel.BrowserNewParamsRegionEuWest, captured.Region)
578+
assert.Equal(t, kernel.BrowserNewParamsRegionApSoutheast, captured.Region)
579579

580580
raw, err := captured.MarshalJSON()
581581
require.NoError(t, err)
582-
assert.Contains(t, string(raw), `"region":"eu-west"`)
582+
assert.Contains(t, string(raw), `"region":"ap-southeast"`)
583583

584584
// Omitting the flag sends nothing; the server defaults to us-east.
585585
err = b.Create(context.Background(), BrowsersCreateInput{})

‎go.mod‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ require (
99
github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.1
1010
github.com/golang-jwt/jwt/v5 v5.2.2
1111
github.com/joho/godotenv v1.5.1
12-
github.com/kernel/kernel-go-sdk v0.92.0
12+
github.com/kernel/kernel-go-sdk v0.95.0
1313
github.com/klauspost/compress v1.18.5
1414
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c
1515
github.com/pterm/pterm v0.12.80

‎go.sum‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
6464
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
6565
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
6666
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
67-
github.com/kernel/kernel-go-sdk v0.92.0 h1:3EeoPahTcGEo97BCbwT50gu8QJnawfL166z12hc8Ucg=
68-
github.com/kernel/kernel-go-sdk v0.92.0/go.mod h1:EeZzSuHZVeHKxKCPUzxou2bovNGhXaz0RXrSqKNf1AQ=
67+
github.com/kernel/kernel-go-sdk v0.95.0 h1:VoEneqrqqT5i3cO1L6faoHo4PqrndG0pAEs6Abivd5A=
68+
github.com/kernel/kernel-go-sdk v0.95.0/go.mod h1:EeZzSuHZVeHKxKCPUzxou2bovNGhXaz0RXrSqKNf1AQ=
6969
github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE=
7070
github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ=
7171
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=

0 commit comments

Comments
 (0)