Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

chore(codersdk/toolsdk): improve static analyzability of toolsdk.Tools#17562

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Merged
johnstcn merged 12 commits intomainfromcj/toolsdk-refactor
Apr 29, 2025
Merged
Show file tree
Hide file tree
Changes from1 commit
Commits
Show all changes
12 commits
Select commitHold shift + click to select a range
4d2dbf0
chore(codersdk/toolsdk): add typed argument to toolsdk.Tool
johnstcnApr 24, 2025
a7784ea
chore(codersdk/toolsdk): add tool deps in toolbox struct instead of c…
johnstcnApr 24, 2025
5b30ea0
chore(codersdk/toolsdk): add panic recovery tool middleware
johnstcnApr 24, 2025
def3fcb
chore(coderd): improve tests for patchWorkspaceAgentAppStatus
johnstcnApr 24, 2025
5647b8b
simplify toolbox impl, rename to deps
johnstcnApr 24, 2025
c1057d9
add WithCleanContext middleware func
johnstcnApr 25, 2025
9edd5f7
fix(codersdk/toolsdk): address type incompatibility issues
johnstcnApr 25, 2025
0f1d4ac
fix tests
johnstcnApr 25, 2025
2462f76
address PR feedback
johnstcnApr 29, 2025
233f9da
address more PR comments
johnstcnApr 29, 2025
40b2fdc
unexport deps fields
johnstcnApr 29, 2025
6d7561f
Merge branch 'main' into cj/toolsdk-refactor
johnstcnApr 29, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
PrevPrevious commit
NextNext commit
address more PR comments
  • Loading branch information
@johnstcn
johnstcn committedApr 29, 2025
commit233f9da352dc7662913f4422fb33400bd89b99e7
21 changes: 12 additions & 9 deletionscli/exp_mcp.go
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -400,24 +400,27 @@ func mcpServerHandler(inv *serpent.Invocation, client *codersdk.Client, instruct
server.WithInstructions(instructions),
)

// Create a new context for the tools with all relevant information.
tb := toolsdk.Deps{
CoderClient: client,
}
// Get the workspace agent token from the environment.
toolOpts := make([]func(*toolsdk.Deps), 0)
var hasAgentClient bool
if agentToken, err := getAgentToken(fs); err == nil && agentToken != "" {
hasAgentClient = true
agentClient := agentsdk.New(client.URL)
agentClient.SetSessionToken(agentToken)
tb.AgentClient = agentClient
toolOpts =append(toolOpts, toolsdk.WithAgentClient(agentClient))
} else {
cliui.Warnf(inv.Stderr, "CODER_AGENT_TOKEN is not set, task reporting will not be available")
}
if appStatusSlug == "" {
cliui.Warnf(inv.Stderr, "CODER_MCP_APP_STATUS_SLUG is not set, task reporting will not be available.")

if appStatusSlug != "" {
toolOpts = append(toolOpts, toolsdk.WithAppStatusSlug(appStatusSlug))
} else {
tb.AppStatusSlug = appStatusSlug
cliui.Warnf(inv.Stderr, "CODER_MCP_APP_STATUS_SLUG is not set, task reporting will not be available.")
}

toolDeps, err := toolsdk.NewDeps(client, toolOpts...)
if err != nil {
return xerrors.Errorf("failed to initialize tool dependencies: %w", err)
}

// Register tools based on the allowlist (if specified)
Expand All@@ -430,7 +433,7 @@ func mcpServerHandler(inv *serpent.Invocation, client *codersdk.Client, instruct
if len(allowedTools) == 0 || slices.ContainsFunc(allowedTools, func(t string) bool {
return t == tool.Tool.Name
}) {
mcpSrv.AddTools(mcpFromSDK(tool,tb))
mcpSrv.AddTools(mcpFromSDK(tool,toolDeps))
}
}

Expand Down
27 changes: 26 additions & 1 deletioncodersdk/toolsdk/toolsdk.go
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,31 @@ import (
"github.com/coder/coder/v2/codersdk/agentsdk"
)

func NewDeps(client *codersdk.Client, opts ...func(*Deps)) (Deps, error) {
d := Deps{
CoderClient: client,
}
for _, opt := range opts {
opt(&d)
}
if d.CoderClient == nil {
return Deps{}, xerrors.New("developer error: coder client may not be nil")
}
return d, nil
}

func WithAgentClient(client *agentsdk.Client) func(*Deps) {
return func(d *Deps) {
d.AgentClient = client
}
}

func WithAppStatusSlug(slug string) func(*Deps) {
return func(d *Deps) {
d.AppStatusSlug = slug
}
}

// Deps provides access to tool dependencies.
type Deps struct {
CoderClient *codersdk.Client
Expand DownExpand Up@@ -175,7 +200,7 @@ var ReportTask = Tool[ReportTaskArgs, codersdk.Response]{
return codersdk.Response{}, xerrors.New("tool unavailable as CODER_AGENT_TOKEN or CODER_AGENT_TOKEN_FILE not set")
}
if deps.AppStatusSlug == "" {
return codersdk.Response{}, xerrors.New("workspace app status slugnotfound in toolbox")
return codersdk.Response{}, xerrors.New("tool unavailable as CODER_MCP_APP_STATUS_SLUG isnotset")
}
if len(args.Summary) > 160 {
return codersdk.Response{}, xerrors.New("summary must be less than 160 characters")
Expand Down
65 changes: 39 additions & 26 deletionscodersdk/toolsdk/toolsdk_test.go
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -72,12 +72,9 @@ func TestTools(t *testing.T) {
})

t.Run("ReportTask", func(t *testing.T) {
tb := toolsdk.Deps{
CoderClient: memberClient,
AgentClient: agentClient,
AppStatusSlug: "some-agent-app",
}
_, err := testTool(t, toolsdk.ReportTask, tb, toolsdk.ReportTaskArgs{
tb, err := toolsdk.NewDeps(memberClient, toolsdk.WithAgentClient(agentClient), toolsdk.WithAppStatusSlug("some-agent-app"))
require.NoError(t, err)
_, err = testTool(t, toolsdk.ReportTask, tb, toolsdk.ReportTaskArgs{
Summary: "test summary",
State: "complete",
Link: "https://example.com",
Expand All@@ -86,7 +83,8 @@ func TestTools(t *testing.T) {
})

t.Run("GetWorkspace", func(t *testing.T) {
tb := toolsdk.Deps{CoderClient: memberClient}
tb, err := toolsdk.NewDeps(memberClient)
require.NoError(t, err)
result, err := testTool(t, toolsdk.GetWorkspace, tb, toolsdk.GetWorkspaceArgs{
WorkspaceID: r.Workspace.ID.String(),
})
Expand All@@ -96,7 +94,8 @@ func TestTools(t *testing.T) {
})

t.Run("ListTemplates", func(t *testing.T) {
tb := toolsdk.Deps{CoderClient: memberClient}
tb, err := toolsdk.NewDeps(memberClient)
require.NoError(t, err)
// Get the templates directly for comparison
expected, err := memberClient.Templates(context.Background(), codersdk.TemplateFilter{})
require.NoError(t, err)
Expand All@@ -119,7 +118,8 @@ func TestTools(t *testing.T) {
})

t.Run("Whoami", func(t *testing.T) {
tb := toolsdk.Deps{CoderClient: memberClient}
tb, err := toolsdk.NewDeps(memberClient)
require.NoError(t, err)
result, err := testTool(t, toolsdk.GetAuthenticatedUser, tb, toolsdk.NoArgs{})

require.NoError(t, err)
Expand All@@ -128,7 +128,8 @@ func TestTools(t *testing.T) {
})

t.Run("ListWorkspaces", func(t *testing.T) {
tb := toolsdk.Deps{CoderClient: memberClient}
tb, err := toolsdk.NewDeps(memberClient)
require.NoError(t, err)
result, err := testTool(t, toolsdk.ListWorkspaces, tb, toolsdk.ListWorkspacesArgs{})

require.NoError(t, err)
Expand All@@ -140,7 +141,8 @@ func TestTools(t *testing.T) {
t.Run("CreateWorkspaceBuild", func(t *testing.T) {
t.Run("Stop", func(t *testing.T) {
ctx := testutil.Context(t, testutil.WaitShort)
tb := toolsdk.Deps{CoderClient: memberClient}
tb, err := toolsdk.NewDeps(memberClient)
require.NoError(t, err)
result, err := testTool(t, toolsdk.CreateWorkspaceBuild, tb, toolsdk.CreateWorkspaceBuildArgs{
WorkspaceID: r.Workspace.ID.String(),
Transition: "stop",
Expand All@@ -159,7 +161,8 @@ func TestTools(t *testing.T) {

t.Run("Start", func(t *testing.T) {
ctx := testutil.Context(t, testutil.WaitShort)
tb := toolsdk.Deps{CoderClient: memberClient}
tb, err := toolsdk.NewDeps(memberClient)
require.NoError(t, err)
result, err := testTool(t, toolsdk.CreateWorkspaceBuild, tb, toolsdk.CreateWorkspaceBuildArgs{
WorkspaceID: r.Workspace.ID.String(),
Transition: "start",
Expand All@@ -178,7 +181,8 @@ func TestTools(t *testing.T) {

t.Run("TemplateVersionChange", func(t *testing.T) {
ctx := testutil.Context(t, testutil.WaitShort)
tb := toolsdk.Deps{CoderClient: memberClient}
tb, err := toolsdk.NewDeps(memberClient)
require.NoError(t, err)
// Get the current template version ID before updating
workspace, err := memberClient.Workspace(ctx, r.Workspace.ID)
require.NoError(t, err)
Expand DownExpand Up@@ -222,7 +226,8 @@ func TestTools(t *testing.T) {
})

t.Run("ListTemplateVersionParameters", func(t *testing.T) {
tb := toolsdk.Deps{CoderClient: memberClient}
tb, err := toolsdk.NewDeps(memberClient)
require.NoError(t, err)
params, err := testTool(t, toolsdk.ListTemplateVersionParameters, tb, toolsdk.ListTemplateVersionParametersArgs{
TemplateVersionID: r.TemplateVersion.ID.String(),
})
Expand All@@ -232,7 +237,8 @@ func TestTools(t *testing.T) {
})

t.Run("GetWorkspaceAgentLogs", func(t *testing.T) {
tb := toolsdk.Deps{CoderClient: client}
tb, err := toolsdk.NewDeps(memberClient)
require.NoError(t, err)
logs, err := testTool(t, toolsdk.GetWorkspaceAgentLogs, tb, toolsdk.GetWorkspaceAgentLogsArgs{
WorkspaceAgentID: agentID.String(),
})
Expand All@@ -242,7 +248,8 @@ func TestTools(t *testing.T) {
})

t.Run("GetWorkspaceBuildLogs", func(t *testing.T) {
tb := toolsdk.Deps{CoderClient: memberClient}
tb, err := toolsdk.NewDeps(memberClient)
require.NoError(t, err)
logs, err := testTool(t, toolsdk.GetWorkspaceBuildLogs, tb, toolsdk.GetWorkspaceBuildLogsArgs{
WorkspaceBuildID: r.Build.ID.String(),
})
Expand All@@ -252,7 +259,8 @@ func TestTools(t *testing.T) {
})

t.Run("GetTemplateVersionLogs", func(t *testing.T) {
tb := toolsdk.Deps{CoderClient: memberClient}
tb, err := toolsdk.NewDeps(memberClient)
require.NoError(t, err)
logs, err := testTool(t, toolsdk.GetTemplateVersionLogs, tb, toolsdk.GetTemplateVersionLogsArgs{
TemplateVersionID: r.TemplateVersion.ID.String(),
})
Expand All@@ -262,7 +270,8 @@ func TestTools(t *testing.T) {
})

t.Run("UpdateTemplateActiveVersion", func(t *testing.T) {
tb := toolsdk.Deps{CoderClient: client}
tb, err := toolsdk.NewDeps(client)
require.NoError(t, err)
result, err := testTool(t, toolsdk.UpdateTemplateActiveVersion, tb, toolsdk.UpdateTemplateActiveVersionArgs{
TemplateID: r.Template.ID.String(),
TemplateVersionID: r.TemplateVersion.ID.String(),
Expand All@@ -273,8 +282,9 @@ func TestTools(t *testing.T) {
})

t.Run("DeleteTemplate", func(t *testing.T) {
tb := toolsdk.Deps{CoderClient: client}
_, err := testTool(t, toolsdk.DeleteTemplate, tb, toolsdk.DeleteTemplateArgs{
tb, err := toolsdk.NewDeps(client)
require.NoError(t, err)
_, err = testTool(t, toolsdk.DeleteTemplate, tb, toolsdk.DeleteTemplateArgs{
TemplateID: r.Template.ID.String(),
})

Expand All@@ -283,10 +293,11 @@ func TestTools(t *testing.T) {
})

t.Run("UploadTarFile", func(t *testing.T) {
tb := toolsdk.Deps{CoderClient: client}
files := map[string]string{
"main.tf": `resource "null_resource" "example" {}`,
}
tb, err := toolsdk.NewDeps(memberClient)
require.NoError(t, err)

result, err := testTool(t, toolsdk.UploadTarFile, tb, toolsdk.UploadTarFileArgs{
Files: files,
Expand All@@ -297,7 +308,8 @@ func TestTools(t *testing.T) {
})

t.Run("CreateTemplateVersion", func(t *testing.T) {
tb := toolsdk.Deps{CoderClient: client}
tb, err := toolsdk.NewDeps(client)
require.NoError(t, err)
// nolint:gocritic // This is in a test package and does not end up in the build
file := dbgen.File(t, store, database.File{})
t.Run("WithoutTemplateID", func(t *testing.T) {
Expand All@@ -308,7 +320,6 @@ func TestTools(t *testing.T) {
require.NotEmpty(t, tv)
})
t.Run("WithTemplateID", func(t *testing.T) {
tb := toolsdk.Deps{CoderClient: client}
tv, err := testTool(t, toolsdk.CreateTemplateVersion, tb, toolsdk.CreateTemplateVersionArgs{
FileID: file.ID.String(),
TemplateID: r.Template.ID.String(),
Expand All@@ -319,15 +330,16 @@ func TestTools(t *testing.T) {
})

t.Run("CreateTemplate", func(t *testing.T) {
tb := toolsdk.Deps{CoderClient: client}
tb, err := toolsdk.NewDeps(client)
require.NoError(t, err)
// Create a new template version for use here.
tv := dbfake.TemplateVersion(t, store).
// nolint:gocritic // This is in a test package and does not end up in the build
Seed(database.TemplateVersion{OrganizationID: owner.OrganizationID, CreatedBy: owner.UserID}).
SkipCreateTemplate().Do()

// We're going to re-use the pre-existing template version
_, err:= testTool(t, toolsdk.CreateTemplate, tb, toolsdk.CreateTemplateArgs{
_, err = testTool(t, toolsdk.CreateTemplate, tb, toolsdk.CreateTemplateArgs{
Name: testutil.GetRandomNameHyphenated(t),
DisplayName: "Test Template",
Description: "This is a test template",
Expand All@@ -338,7 +350,8 @@ func TestTools(t *testing.T) {
})

t.Run("CreateWorkspace", func(t *testing.T) {
tb := toolsdk.Deps{CoderClient: memberClient}
tb, err := toolsdk.NewDeps(client)
require.NoError(t, err)
// We need a template version ID to create a workspace
res, err := testTool(t, toolsdk.CreateWorkspace, tb, toolsdk.CreateWorkspaceArgs{
User: "me",
Expand Down
Loading

[8]ページ先頭

©2009-2025 Movatter.jp