From 519b8aab9dc62c944a18f7deaeb9c13d4a87d3a0 Mon Sep 17 00:00:00 2001 From: vishnu-ssuresh Date: Sun, 10 May 2026 00:13:56 -0700 Subject: [PATCH 1/3] hub: default auto-created repos to internal source --- internal/cmd/hub_repo_sdk.go | 31 +++++++++++++++++++++---------- internal/cmd/hub_repo_sdk_test.go | 3 +++ 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/internal/cmd/hub_repo_sdk.go b/internal/cmd/hub_repo_sdk.go index 963fea8..15f7e44 100644 --- a/internal/cmd/hub_repo_sdk.go +++ b/internal/cmd/hub_repo_sdk.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "net/http" + "strings" "time" "github.com/langchain-ai/langsmith-cli/internal/client" @@ -27,6 +28,13 @@ func isHTTP409(err error) bool { return isHTTPStatus(err, http.StatusConflict) } +func isRawHTTPStatus(err error, statusCode int) bool { + if err == nil { + return false + } + return strings.Contains(err.Error(), fmt.Sprintf("HTTP %d:", statusCode)) +} + func strPtrOrNil(s string) *string { if s == "" { return nil @@ -104,25 +112,28 @@ func ensureHubRepo(ctx context.Context, c *client.Client, owner, name, repoType if err != nil { return err } - create := langsmith.RepoNewParams{ - RepoHandle: langsmith.F(name), - RepoType: langsmith.F(sdkRepoType), - IsPublic: langsmith.F(false), + create := map[string]any{ + "repo_handle": name, + "repo_type": string(sdkRepoType), + "is_public": false, + // Hub-created repos should default to internal so Agent Builder + // workspace listings include them as first-party resources. + "source": "internal", } if meta.IsPublic != nil { - create.IsPublic = langsmith.F(*meta.IsPublic) + create["is_public"] = *meta.IsPublic } if meta.Description != nil { - create.Description = langsmith.F(*meta.Description) + create["description"] = *meta.Description } if meta.Readme != nil { - create.Readme = langsmith.F(*meta.Readme) + create["readme"] = *meta.Readme } if meta.Tags != nil { - create.Tags = langsmith.F(meta.Tags) + create["tags"] = meta.Tags } - if _, err := c.SDK.Repos.New(ctx, create); err != nil { - if isHTTP409(err) { + if err := c.RawPost(ctx, "/api/v1/repos", create, nil); err != nil { + if isHTTP409(err) || isRawHTTPStatus(err, http.StatusConflict) { return nil } return fmt.Errorf("creating %s/%s: %w", owner, name, err) diff --git a/internal/cmd/hub_repo_sdk_test.go b/internal/cmd/hub_repo_sdk_test.go index de1750f..2f60685 100644 --- a/internal/cmd/hub_repo_sdk_test.go +++ b/internal/cmd/hub_repo_sdk_test.go @@ -198,6 +198,9 @@ func TestEnsureHubRepo_404_CreatesRepo(t *testing.T) { if got, _ := body["is_public"].(bool); got { t.Fatalf("is_public = %v, want false", got) } + if got, _ := body["source"].(string); got != "internal" { + t.Fatalf("source = %q, want internal", got) + } } func TestEnsureHubRepo_404_CreateConflict_IsIgnored(t *testing.T) { From 3d381074fb8c49adf49f2310a1a08fb6e11cf021 Mon Sep 17 00:00:00 2001 From: vishnu-ssuresh Date: Sun, 10 May 2026 00:16:50 -0700 Subject: [PATCH 2/3] chore(hub): remove inline source default comment --- internal/cmd/hub_repo_sdk.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/internal/cmd/hub_repo_sdk.go b/internal/cmd/hub_repo_sdk.go index 15f7e44..577b419 100644 --- a/internal/cmd/hub_repo_sdk.go +++ b/internal/cmd/hub_repo_sdk.go @@ -116,8 +116,6 @@ func ensureHubRepo(ctx context.Context, c *client.Client, owner, name, repoType "repo_handle": name, "repo_type": string(sdkRepoType), "is_public": false, - // Hub-created repos should default to internal so Agent Builder - // workspace listings include them as first-party resources. "source": "internal", } if meta.IsPublic != nil { From f2ea9405d5ab33f027c5d89137618843984dff8b Mon Sep 17 00:00:00 2001 From: vishnu-ssuresh Date: Sun, 10 May 2026 00:18:39 -0700 Subject: [PATCH 3/3] refactor(hub): simplify 409 handling in repo create path --- internal/cmd/hub_repo_sdk.go | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/internal/cmd/hub_repo_sdk.go b/internal/cmd/hub_repo_sdk.go index 577b419..4a6136f 100644 --- a/internal/cmd/hub_repo_sdk.go +++ b/internal/cmd/hub_repo_sdk.go @@ -28,13 +28,6 @@ func isHTTP409(err error) bool { return isHTTPStatus(err, http.StatusConflict) } -func isRawHTTPStatus(err error, statusCode int) bool { - if err == nil { - return false - } - return strings.Contains(err.Error(), fmt.Sprintf("HTTP %d:", statusCode)) -} - func strPtrOrNil(s string) *string { if s == "" { return nil @@ -131,7 +124,7 @@ func ensureHubRepo(ctx context.Context, c *client.Client, owner, name, repoType create["tags"] = meta.Tags } if err := c.RawPost(ctx, "/api/v1/repos", create, nil); err != nil { - if isHTTP409(err) || isRawHTTPStatus(err, http.StatusConflict) { + if isHTTP409(err) || strings.Contains(err.Error(), "HTTP 409:") { return nil } return fmt.Errorf("creating %s/%s: %w", owner, name, err)