Skip to content

Commit e735a19

Browse files
jsell-rhclaude
andcommitted
fix(sdk,cli): add extension files for methods lost during SDK regeneration
The SDK regeneration overwrote hand-written methods in generated files. This adds extension files (not overwritten by the generator) for: - ScheduledSession: project-scoped CRUD, Suspend, Resume, Trigger, Runs, GetByName - Credential: GetToken - Agent: rename Start→StartInProject to avoid conflict with generated Start Updates all CLI callers to use the new InProject method names. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent aa78a10 commit e735a19

10 files changed

Lines changed: 157 additions & 28 deletions

File tree

components/ambient-cli/cmd/acpctl/agent/cmd.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@ This operation is idempotent — calling it multiple times is safe.`,
435435
}
436436

437437
func startSingleAgent(ctx context.Context, cmd *cobra.Command, client *sdkclient.Client, projectID, agentID, displayName string) error {
438-
resp, err := client.Agents().Start(ctx, projectID, agentID, agentStartArgs.prompt)
438+
resp, err := client.Agents().StartInProject(ctx, projectID, agentID, agentStartArgs.prompt)
439439
if err != nil {
440440
return fmt.Errorf("start agent: %w", err)
441441
}

components/ambient-cli/cmd/acpctl/ambient/tui/client.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,7 @@ func (tc *TUIClient) StartAgent(projectID, agentID, prompt string) tea.Cmd {
468468
return StartAgentMsg{Err: err}
469469
}
470470

471-
resp, err := client.Agents().Start(ctx, projectID, agentID, prompt)
471+
resp, err := client.Agents().StartInProject(ctx, projectID, agentID, prompt)
472472
if err != nil {
473473
return StartAgentMsg{Err: err}
474474
}
@@ -837,7 +837,7 @@ func (tc *TUIClient) FetchScheduledSessions(projectID string) tea.Cmd {
837837
return ScheduledSessionsMsg{Err: err}
838838
}
839839

840-
list, err := client.ScheduledSessions().List(ctx, projectID, defaultListOpts())
840+
list, err := client.ScheduledSessions().ListInProject(ctx, projectID, defaultListOpts())
841841
if err != nil {
842842
return ScheduledSessionsMsg{Err: err}
843843
}
@@ -856,7 +856,7 @@ func (tc *TUIClient) DeleteScheduledSession(projectID, id string) tea.Cmd {
856856
return DeleteScheduledSessionMsg{Err: err}
857857
}
858858

859-
err = client.ScheduledSessions().Delete(ctx, projectID, id)
859+
err = client.ScheduledSessions().DeleteInProject(ctx, projectID, id)
860860
return DeleteScheduledSessionMsg{Err: err}
861861
}
862862
}
@@ -936,7 +936,7 @@ func (tc *TUIClient) CreateScheduledSession(projectID, name, agentID, schedule,
936936
Enabled: true,
937937
}
938938

939-
result, err := client.ScheduledSessions().Create(ctx, projectID, ss)
939+
result, err := client.ScheduledSessions().CreateInProject(ctx, projectID, ss)
940940
if err != nil {
941941
return CreateScheduledSessionMsg{Err: err}
942942
}
@@ -964,7 +964,7 @@ func (tc *TUIClient) UpdateScheduledSession(projectID, id string, patch map[stri
964964
return UpdateScheduledSessionMsg{Err: fmt.Errorf("unmarshal patch: %w", err)}
965965
}
966966

967-
result, err := client.ScheduledSessions().Update(ctx, projectID, id, &typedPatch)
967+
result, err := client.ScheduledSessions().UpdateInProject(ctx, projectID, id, &typedPatch)
968968
if err != nil {
969969
return UpdateScheduledSessionMsg{Err: err}
970970
}

components/ambient-cli/cmd/acpctl/ambient/tui/views/scheduledsessions.go

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -87,20 +87,9 @@ func ScheduledSessionDetail(ss sdktypes.ScheduledSession) []DetailLine {
8787
updatedAt = ss.UpdatedAt.Format(time.RFC3339)
8888
}
8989

90-
timeout := ""
91-
if ss.Timeout != nil {
92-
timeout = fmt.Sprintf("%d", *ss.Timeout)
93-
}
94-
95-
inactivityTimeout := ""
96-
if ss.InactivityTimeout != nil {
97-
inactivityTimeout = fmt.Sprintf("%d", *ss.InactivityTimeout)
98-
}
99-
100-
stopOnRunFinished := ""
101-
if ss.StopOnRunFinished != nil {
102-
stopOnRunFinished = fmt.Sprintf("%v", *ss.StopOnRunFinished)
103-
}
90+
timeout := fmt.Sprintf("%d", ss.Timeout)
91+
inactivityTimeout := fmt.Sprintf("%d", ss.InactivityTimeout)
92+
stopOnRunFinished := fmt.Sprintf("%v", ss.StopOnRunFinished)
10493

10594
return []DetailLine{
10695
{Key: "ID", Value: ss.ID},

components/ambient-cli/cmd/acpctl/scheduledsession/cmd.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ func resolveScheduledSession(ctx context.Context, projectID, arg string) (string
5353
if err != nil {
5454
return "", err
5555
}
56-
ss, err := client.ScheduledSessions().Get(ctx, projectID, arg)
56+
ss, err := client.ScheduledSessions().GetInProject(ctx, projectID, arg)
5757
if err != nil {
5858
ss, err = client.ScheduledSessions().GetByName(ctx, projectID, arg)
5959
if err != nil {
@@ -98,7 +98,7 @@ var listCmd = &cobra.Command{
9898
defer cancel()
9999

100100
opts := sdktypes.NewListOptions().Size(listArgs.limit).Build()
101-
list, err := client.ScheduledSessions().List(ctx, projectID, opts)
101+
list, err := client.ScheduledSessions().ListInProject(ctx, projectID, opts)
102102
if err != nil {
103103
return fmt.Errorf("list scheduled sessions: %w", err)
104104
}
@@ -150,7 +150,7 @@ var getCmd = &cobra.Command{
150150
ctx, cancel := context.WithTimeout(context.Background(), cfg.GetRequestTimeout())
151151
defer cancel()
152152

153-
ss, err := client.ScheduledSessions().Get(ctx, projectID, args[0])
153+
ss, err := client.ScheduledSessions().GetInProject(ctx, projectID, args[0])
154154
if err != nil {
155155
ss, err = client.ScheduledSessions().GetByName(ctx, projectID, args[0])
156156
if err != nil {
@@ -250,7 +250,7 @@ var createCmd = &cobra.Command{
250250
return fmt.Errorf("build scheduled session: %w", err)
251251
}
252252

253-
created, err := client.ScheduledSessions().Create(ctx, projectID, ss)
253+
created, err := client.ScheduledSessions().CreateInProject(ctx, projectID, ss)
254254
if err != nil {
255255
return fmt.Errorf("create scheduled session: %w", err)
256256
}
@@ -349,7 +349,7 @@ var updateCmd = &cobra.Command{
349349
patch = patch.RunnerType(updateArgs.runnerType)
350350
}
351351

352-
updated, err := client.ScheduledSessions().Update(ctx, projectID, id, patch.Build())
352+
updated, err := client.ScheduledSessions().UpdateInProject(ctx, projectID, id, patch.Build())
353353
if err != nil {
354354
return fmt.Errorf("update scheduled session: %w", err)
355355
}
@@ -401,7 +401,7 @@ var deleteCmd = &cobra.Command{
401401
return err
402402
}
403403

404-
if err := client.ScheduledSessions().Delete(ctx, projectID, id); err != nil {
404+
if err := client.ScheduledSessions().DeleteInProject(ctx, projectID, id); err != nil {
405405
return fmt.Errorf("delete scheduled session: %w", err)
406406
}
407407

components/ambient-cli/cmd/acpctl/start/cmd.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func run(cmd *cobra.Command, cmdArgs []string) error {
4848
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
4949
defer cancel()
5050

51-
resp, err := client.Agents().Start(ctx, startArgs.projectID, paID, startArgs.prompt)
51+
resp, err := client.Agents().StartInProject(ctx, startArgs.projectID, paID, startArgs.prompt)
5252
if err != nil {
5353
return fmt.Errorf("start agent %q: %w", paID, err)
5454
}

components/ambient-sdk/go-sdk/client/agent_extensions.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func (a *AgentAPI) DeleteInProject(ctx context.Context, projectID, agentID strin
5959
return a.client.do(ctx, http.MethodDelete, path, nil, http.StatusNoContent, nil)
6060
}
6161

62-
func (a *AgentAPI) Start(ctx context.Context, projectID, agentID, prompt string) (*types.StartResponse, error) {
62+
func (a *AgentAPI) StartInProject(ctx context.Context, projectID, agentID, prompt string) (*types.StartResponse, error) {
6363
req := types.StartRequest{Prompt: prompt}
6464
body, err := json.Marshal(req)
6565
if err != nil {
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package client
2+
3+
import (
4+
"context"
5+
"net/http"
6+
"net/url"
7+
8+
"github.com/ambient-code/platform/components/ambient-sdk/go-sdk/types"
9+
)
10+
11+
func (a *CredentialAPI) GetToken(ctx context.Context, id string) (*types.CredentialTokenResponse, error) {
12+
var result types.CredentialTokenResponse
13+
if err := a.client.do(ctx, http.MethodGet, a.basePath()+"/"+url.PathEscape(id)+"/token", nil, http.StatusOK, &result); err != nil {
14+
return nil, err
15+
}
16+
return &result, nil
17+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package client
2+
3+
import (
4+
"context"
5+
"encoding/json"
6+
"fmt"
7+
"net/http"
8+
"net/url"
9+
10+
"github.com/ambient-code/platform/components/ambient-sdk/go-sdk/types"
11+
)
12+
13+
func (a *ScheduledSessionAPI) projectPath(projectID string) string {
14+
return "/projects/" + url.PathEscape(projectID) + "/scheduled-sessions"
15+
}
16+
17+
func (a *ScheduledSessionAPI) ListInProject(ctx context.Context, projectID string, opts *types.ListOptions) (*types.ScheduledSessionList, error) {
18+
var result types.ScheduledSessionList
19+
if err := a.client.doWithQuery(ctx, http.MethodGet, a.projectPath(projectID), nil, http.StatusOK, &result, opts); err != nil {
20+
return nil, err
21+
}
22+
return &result, nil
23+
}
24+
25+
func (a *ScheduledSessionAPI) GetInProject(ctx context.Context, projectID, id string) (*types.ScheduledSession, error) {
26+
var result types.ScheduledSession
27+
path := a.projectPath(projectID) + "/" + url.PathEscape(id)
28+
if err := a.client.do(ctx, http.MethodGet, path, nil, http.StatusOK, &result); err != nil {
29+
return nil, err
30+
}
31+
return &result, nil
32+
}
33+
34+
func (a *ScheduledSessionAPI) CreateInProject(ctx context.Context, projectID string, resource *types.ScheduledSession) (*types.ScheduledSession, error) {
35+
body, err := json.Marshal(resource)
36+
if err != nil {
37+
return nil, fmt.Errorf("marshal scheduled session: %w", err)
38+
}
39+
var result types.ScheduledSession
40+
if err := a.client.do(ctx, http.MethodPost, a.projectPath(projectID), body, http.StatusCreated, &result); err != nil {
41+
return nil, err
42+
}
43+
return &result, nil
44+
}
45+
46+
func (a *ScheduledSessionAPI) UpdateInProject(ctx context.Context, projectID, id string, patch any) (*types.ScheduledSession, error) {
47+
body, err := json.Marshal(patch)
48+
if err != nil {
49+
return nil, fmt.Errorf("marshal patch: %w", err)
50+
}
51+
var result types.ScheduledSession
52+
path := a.projectPath(projectID) + "/" + url.PathEscape(id)
53+
if err := a.client.do(ctx, http.MethodPatch, path, body, http.StatusOK, &result); err != nil {
54+
return nil, err
55+
}
56+
return &result, nil
57+
}
58+
59+
func (a *ScheduledSessionAPI) DeleteInProject(ctx context.Context, projectID, id string) error {
60+
return a.client.do(ctx, http.MethodDelete, a.projectPath(projectID)+"/"+url.PathEscape(id), nil, http.StatusNoContent, nil)
61+
}
62+
63+
func (a *ScheduledSessionAPI) Suspend(ctx context.Context, projectID, id string) (*types.ScheduledSession, error) {
64+
var result types.ScheduledSession
65+
path := a.projectPath(projectID) + "/" + url.PathEscape(id) + "/suspend"
66+
if err := a.client.do(ctx, http.MethodPost, path, nil, http.StatusOK, &result); err != nil {
67+
return nil, err
68+
}
69+
return &result, nil
70+
}
71+
72+
func (a *ScheduledSessionAPI) Resume(ctx context.Context, projectID, id string) (*types.ScheduledSession, error) {
73+
var result types.ScheduledSession
74+
path := a.projectPath(projectID) + "/" + url.PathEscape(id) + "/resume"
75+
if err := a.client.do(ctx, http.MethodPost, path, nil, http.StatusOK, &result); err != nil {
76+
return nil, err
77+
}
78+
return &result, nil
79+
}
80+
81+
func (a *ScheduledSessionAPI) Trigger(ctx context.Context, projectID, id string) error {
82+
path := a.projectPath(projectID) + "/" + url.PathEscape(id) + "/trigger"
83+
return a.client.do(ctx, http.MethodPost, path, nil, http.StatusOK, nil)
84+
}
85+
86+
func (a *ScheduledSessionAPI) Runs(ctx context.Context, projectID, id string, opts *types.ListOptions) (*types.SessionList, error) {
87+
var result types.SessionList
88+
path := a.projectPath(projectID) + "/" + url.PathEscape(id) + "/runs"
89+
if err := a.client.doWithQuery(ctx, http.MethodGet, path, nil, http.StatusOK, &result, opts); err != nil {
90+
return nil, err
91+
}
92+
return &result, nil
93+
}
94+
95+
func (a *ScheduledSessionAPI) GetByName(ctx context.Context, projectID, name string) (*types.ScheduledSession, error) {
96+
list, err := a.ListInProject(ctx, projectID, &types.ListOptions{Search: "name = '" + name + "'"})
97+
if err != nil {
98+
return nil, err
99+
}
100+
for i := range list.Items {
101+
if list.Items[i].Name == name {
102+
return &list.Items[i], nil
103+
}
104+
}
105+
return nil, fmt.Errorf("scheduled session %q not found in project %q", name, projectID)
106+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package types
2+
3+
type CredentialTokenResponse struct {
4+
CredentialID string `json:"credential_id"`
5+
Provider string `json:"provider"`
6+
Token string `json:"token"`
7+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package types
2+
3+
type ScheduledSessionPatch struct {
4+
Name *string `json:"name,omitempty"`
5+
Description *string `json:"description,omitempty"`
6+
Schedule *string `json:"schedule,omitempty"`
7+
Timezone *string `json:"timezone,omitempty"`
8+
Enabled *bool `json:"enabled,omitempty"`
9+
SessionPrompt *string `json:"session_prompt,omitempty"`
10+
}

0 commit comments

Comments
 (0)