Skip to content

Commit 1ce98bb

Browse files
committed
refactor(config): centralize default API address handling
1 parent 36ecdb8 commit 1ce98bb

6 files changed

Lines changed: 38 additions & 17 deletions

File tree

cli/http_client.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"text/tabwriter"
1414

1515
"csgclaw/internal/agent"
16+
"csgclaw/internal/config"
1617
"csgclaw/internal/im"
1718
)
1819

@@ -28,7 +29,7 @@ type APIClient struct {
2829

2930
func NewAPIClient(endpoint, token string, client HTTPClient) *APIClient {
3031
if endpoint == "" {
31-
endpoint = "http://127.0.0.1:18080"
32+
endpoint = config.DefaultAPIBaseURL()
3233
}
3334
return &APIClient{
3435
endpoint: strings.TrimRight(endpoint, "/"),

cli/onboard.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ func (a *App) runOnboard(args []string, globals GlobalOptions) error {
3838
if !hasExistingConfig {
3939
cfg = config.Config{
4040
Server: config.ServerConfig{
41-
ListenAddr: config.DefaultListenAddr,
41+
ListenAddr: config.DefaultListenAddr(),
4242
AccessToken: config.DefaultAccessToken,
4343
},
4444
Bootstrap: config.BootstrapConfig{

cli/serve.go

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -290,15 +290,12 @@ func apiBaseURL(server config.ServerConfig) string {
290290
return strings.TrimRight(server.AdvertiseBaseURL, "/")
291291
}
292292

293-
host := "127.0.0.1"
294-
port := "18080"
293+
port := config.ListenPort(server.ListenAddr)
295294
if server.ListenAddr == "" {
296-
return "http://127.0.0.1:18080"
295+
return config.DefaultAPIBaseURL()
297296
}
298-
if parsedHost, parsedPort, err := net.SplitHostPort(server.ListenAddr); err == nil {
299-
if parsedPort != "" {
300-
port = parsedPort
301-
}
297+
host := "127.0.0.1"
298+
if parsedHost, _, err := net.SplitHostPort(server.ListenAddr); err == nil {
302299
if parsedHost != "" && parsedHost != "0.0.0.0" && parsedHost != "::" {
303300
host = parsedHost
304301
}

cli/serve_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,13 @@ func TestAPIBaseURLPrefersAdvertiseBaseURL(t *testing.T) {
7777
}
7878
}
7979

80+
func TestAPIBaseURLFallsBackToSharedDefault(t *testing.T) {
81+
got := apiBaseURL(config.ServerConfig{})
82+
if got != config.DefaultAPIBaseURL() {
83+
t.Fatalf("apiBaseURL() = %q, want %q", got, config.DefaultAPIBaseURL())
84+
}
85+
}
86+
8087
func TestValidateModelConfigRequiresOnboardWhenIncomplete(t *testing.T) {
8188
err := validateModelConfig(config.Config{})
8289
if err == nil {

internal/agent/manager_config.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,7 @@ func updateCSGClawChannel(cfg map[string]any, botID string, server config.Server
128128
}
129129

130130
func resolveManagerBaseURL(server config.ServerConfig) string {
131-
port := "18080"
132-
if server.ListenAddr != "" {
133-
if _, resolvedPort, err := net.SplitHostPort(server.ListenAddr); err == nil && resolvedPort != "" {
134-
port = resolvedPort
135-
}
136-
}
131+
port := config.ListenPort(server.ListenAddr)
137132
if ip := localIPv4Resolver(); ip != "" {
138133
return fmt.Sprintf("http://%s:%s", ip, port)
139134
}

internal/config/config.go

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"bufio"
55
"errors"
66
"fmt"
7+
"net"
78
"os"
89
"path/filepath"
910
"strings"
@@ -39,11 +40,31 @@ const (
3940
AgentsDirName = "agents"
4041
IMDirName = "im"
4142

42-
DefaultListenAddr = "0.0.0.0:18080"
43+
DefaultHTTPPort = "18080"
4344
DefaultAccessToken = "your_access_token"
4445
DefaultManagerImage = "ghcr.io/russellluo/picoclaw:2026.4.8.1"
4546
)
4647

48+
func DefaultListenAddr() string {
49+
return net.JoinHostPort("0.0.0.0", DefaultHTTPPort)
50+
}
51+
52+
func DefaultAPIBaseURL() string {
53+
return "http://" + net.JoinHostPort("127.0.0.1", DefaultHTTPPort)
54+
}
55+
56+
func ListenPort(listenAddr string) string {
57+
if listenAddr == "" {
58+
return DefaultHTTPPort
59+
}
60+
61+
_, port, err := net.SplitHostPort(listenAddr)
62+
if err != nil || port == "" {
63+
return DefaultHTTPPort
64+
}
65+
return port
66+
}
67+
4768
func (c ModelConfig) MissingFields() []string {
4869
var missing []string
4970
if strings.TrimSpace(c.BaseURL) == "" {
@@ -174,7 +195,7 @@ func Load(path string) (Config, error) {
174195
}
175196

176197
if cfg.Server.ListenAddr == "" {
177-
cfg.Server.ListenAddr = DefaultListenAddr
198+
cfg.Server.ListenAddr = DefaultListenAddr()
178199
}
179200
if cfg.Bootstrap.ManagerImage == "" {
180201
cfg.Bootstrap.ManagerImage = DefaultManagerImage

0 commit comments

Comments
 (0)