From 470276333fcb5fd6157f874e46879281babfdb74 Mon Sep 17 00:00:00 2001 From: jsell-rh Date: Tue, 5 May 2026 15:34:18 +0000 Subject: [PATCH 1/4] feat(sdk): make token optional and accept relative baseUrl in TS SDK Enable browser-side usage of the TS SDK by making token and project optional in AmbientClientConfig, conditionally sending Authorization and X-Ambient-Project headers only when values are present, and accepting relative baseUrl paths (e.g. "/api/proxy") that skip URL parsing. Sub-resource APIs throw a clear error when project is needed but absent. Templates are updated to fix drift with generated output. Includes full SDK regeneration (Go, Python, TS) from latest spec. Co-Authored-By: Claude Opus 4.6 --- .../templates/ts/ambient_client.ts.tmpl | 36 ++- .../generator/templates/ts/base.ts.tmpl | 8 +- .../generator/templates/ts/client.ts.tmpl | 3 + .../ambient-sdk/go-sdk/client/agent_api.go | 12 +- .../ambient-sdk/go-sdk/client/client.go | 60 ++--- .../go-sdk/client/credential_api.go | 12 +- .../go-sdk/client/inbox_message_api.go | 4 +- .../ambient-sdk/go-sdk/client/iterator.go | 4 +- .../ambient-sdk/go-sdk/client/project_api.go | 4 +- .../go-sdk/client/project_settings_api.go | 4 +- .../ambient-sdk/go-sdk/client/role_api.go | 4 +- .../go-sdk/client/role_binding_api.go | 4 +- .../go-sdk/client/scheduled_session_api.go | 95 +++----- .../ambient-sdk/go-sdk/client/session_api.go | 4 +- .../go-sdk/client/session_message_api.go | 4 +- .../ambient-sdk/go-sdk/client/user_api.go | 4 +- components/ambient-sdk/go-sdk/types/agent.go | 4 +- components/ambient-sdk/go-sdk/types/base.go | 4 +- .../ambient-sdk/go-sdk/types/credential.go | 10 +- .../ambient-sdk/go-sdk/types/inbox_message.go | 4 +- .../ambient-sdk/go-sdk/types/list_options.go | 4 +- .../ambient-sdk/go-sdk/types/project.go | 4 +- .../go-sdk/types/project_settings.go | 4 +- components/ambient-sdk/go-sdk/types/role.go | 4 +- .../ambient-sdk/go-sdk/types/role_binding.go | 4 +- .../go-sdk/types/scheduled_session.go | 153 +++++++------ .../ambient-sdk/go-sdk/types/session.go | 4 +- .../go-sdk/types/session_message.go | 4 +- components/ambient-sdk/go-sdk/types/user.go | 4 +- .../python-sdk/ambient_platform/__init__.py | 18 +- .../python-sdk/ambient_platform/_agent_api.py | 23 +- .../python-sdk/ambient_platform/_base.py | 4 +- .../ambient_platform/_credential_api.py | 52 +++++ .../ambient_platform/_inbox_message_api.py | 22 +- .../python-sdk/ambient_platform/_iterator.py | 4 +- .../ambient_platform/_project_api.py | 4 +- .../ambient_platform/_project_settings_api.py | 4 +- .../python-sdk/ambient_platform/_role_api.py | 7 +- .../ambient_platform/_role_binding_api.py | 7 +- .../_scheduled_session_api.py | 52 +++++ .../ambient_platform/_session_api.py | 4 +- .../ambient_platform/_session_message_api.py | 14 +- .../python-sdk/ambient_platform/_user_api.py | 4 +- .../python-sdk/ambient_platform/agent.py | 132 ++++++++++- .../python-sdk/ambient_platform/client.py | 40 +++- .../python-sdk/ambient_platform/credential.py | 164 ++++++++++++++ .../ambient_platform/inbox_message.py | 4 +- .../python-sdk/ambient_platform/project.py | 14 +- .../ambient_platform/project_settings.py | 4 +- .../python-sdk/ambient_platform/role.py | 4 +- .../ambient_platform/role_binding.py | 4 +- .../ambient_platform/scheduled_session.py | 206 +++++++++++++++++ .../python-sdk/ambient_platform/session.py | 4 +- .../ambient_platform/session_message.py | 4 +- .../python-sdk/ambient_platform/user.py | 4 +- components/ambient-sdk/ts-sdk/src/agent.ts | 137 +++++++++++- .../ambient-sdk/ts-sdk/src/agent_api.ts | 76 ++----- components/ambient-sdk/ts-sdk/src/base.ts | 8 +- components/ambient-sdk/ts-sdk/src/client.ts | 41 ++-- .../ambient-sdk/ts-sdk/src/credential.ts | 157 +++++++++++++ .../ambient-sdk/ts-sdk/src/credential_api.ts | 53 +++++ .../ambient-sdk/ts-sdk/src/inbox_message.ts | 4 +- .../ts-sdk/src/inbox_message_api.ts | 51 ++++- components/ambient-sdk/ts-sdk/src/index.ts | 24 +- components/ambient-sdk/ts-sdk/src/project.ts | 17 +- .../ambient-sdk/ts-sdk/src/project_api.ts | 4 +- .../ts-sdk/src/project_settings.ts | 4 +- .../ts-sdk/src/project_settings_api.ts | 4 +- components/ambient-sdk/ts-sdk/src/role.ts | 4 +- components/ambient-sdk/ts-sdk/src/role_api.ts | 8 +- .../ambient-sdk/ts-sdk/src/role_binding.ts | 4 +- .../ts-sdk/src/role_binding_api.ts | 8 +- .../ts-sdk/src/scheduled_session.ts | 210 ++++++++++++++++++ .../ts-sdk/src/scheduled_session_api.ts | 53 +++++ components/ambient-sdk/ts-sdk/src/session.ts | 4 +- .../ambient-sdk/ts-sdk/src/session_api.ts | 4 +- .../ambient-sdk/ts-sdk/src/session_message.ts | 4 +- .../ts-sdk/src/session_message_api.ts | 17 +- components/ambient-sdk/ts-sdk/src/user.ts | 4 +- components/ambient-sdk/ts-sdk/src/user_api.ts | 4 +- .../ambient-sdk/ts-sdk/tests/client.test.ts | 37 ++- 81 files changed, 1728 insertions(+), 485 deletions(-) create mode 100644 components/ambient-sdk/python-sdk/ambient_platform/_credential_api.py create mode 100644 components/ambient-sdk/python-sdk/ambient_platform/_scheduled_session_api.py create mode 100644 components/ambient-sdk/python-sdk/ambient_platform/credential.py create mode 100644 components/ambient-sdk/python-sdk/ambient_platform/scheduled_session.py create mode 100644 components/ambient-sdk/ts-sdk/src/credential.ts create mode 100644 components/ambient-sdk/ts-sdk/src/credential_api.ts create mode 100644 components/ambient-sdk/ts-sdk/src/scheduled_session.ts create mode 100644 components/ambient-sdk/ts-sdk/src/scheduled_session_api.ts diff --git a/components/ambient-sdk/generator/templates/ts/ambient_client.ts.tmpl b/components/ambient-sdk/generator/templates/ts/ambient_client.ts.tmpl index 03c0382320..f29c485c3c 100644 --- a/components/ambient-sdk/generator/templates/ts/ambient_client.ts.tmpl +++ b/components/ambient-sdk/generator/templates/ts/ambient_client.ts.tmpl @@ -17,25 +17,24 @@ export class AmbientClient { if (!config.baseUrl) { throw new Error('baseUrl is required'); } - if (!config.token) { - throw new Error('token is required'); - } - if (config.token.length < 20) { - throw new Error('token is too short (minimum 20 characters)'); - } - if (config.token === 'YOUR_TOKEN_HERE' || config.token === 'PLACEHOLDER_TOKEN') { - throw new Error('placeholder token is not allowed'); - } - if (!config.project) { - throw new Error('project is required'); - } - if (config.project.length > 63) { + if (config.token) { + if (config.token.length < 20) { + throw new Error('token is too short (minimum 20 characters)'); + } + if (config.token === 'YOUR_TOKEN_HERE' || config.token === 'PLACEHOLDER_TOKEN') { + throw new Error('placeholder token is not allowed'); + } + } + if (config.project && config.project.length > 63) { throw new Error('project name cannot exceed 63 characters'); } - const url = new URL(config.baseUrl); - if (url.protocol !== 'http:' && url.protocol !== 'https:') { - throw new Error('only HTTP and HTTPS schemes are supported'); + // Skip URL parsing for relative paths (e.g. "/api/proxy") + if (!config.baseUrl.startsWith('/')) { + const url = new URL(config.baseUrl); + if (url.protocol !== 'http:' && url.protocol !== 'https:') { + throw new Error('only HTTP and HTTPS schemes are supported'); + } } this.config = { @@ -54,10 +53,7 @@ export class AmbientClient { if (!token) { throw new Error('AMBIENT_TOKEN environment variable is required'); } - if (!project) { - throw new Error('AMBIENT_PROJECT environment variable is required'); - } - return new AmbientClient({ baseUrl, token, project }); + return new AmbientClient({ baseUrl, token, ...(project ? { project } : {}) }); } } diff --git a/components/ambient-sdk/generator/templates/ts/base.ts.tmpl b/components/ambient-sdk/generator/templates/ts/base.ts.tmpl index ba0ae525da..376edc44ee 100644 --- a/components/ambient-sdk/generator/templates/ts/base.ts.tmpl +++ b/components/ambient-sdk/generator/templates/ts/base.ts.tmpl @@ -70,8 +70,8 @@ export type RequestOptions = { export type AmbientClientConfig = { baseUrl: string; - token: string; - project: string; + token?: string; + project?: string; }; export async function ambientFetch( @@ -83,8 +83,8 @@ export async function ambientFetch( ): Promise { const url = `${config.baseUrl}{{.Spec.BasePath}}${path}`; const headers: Record = { - 'Authorization': `Bearer ${config.token}`, - 'X-Ambient-Project': config.project, + ...(config.token ? { 'Authorization': `Bearer ${config.token}` } : {}), + ...(config.project ? { 'X-Ambient-Project': config.project } : {}), }; if (body !== undefined) { headers['Content-Type'] = 'application/json'; diff --git a/components/ambient-sdk/generator/templates/ts/client.ts.tmpl b/components/ambient-sdk/generator/templates/ts/client.ts.tmpl index e99d175b28..36fb73839e 100644 --- a/components/ambient-sdk/generator/templates/ts/client.ts.tmpl +++ b/components/ambient-sdk/generator/templates/ts/client.ts.tmpl @@ -12,6 +12,9 @@ export class {{.Resource.Name}}API { {{- if .Resource.IsSubResource}} private basePath(): string { + if (!this.config.project) { + throw new Error('project is required for {{.Resource.Name}} operations'); + } return '/{{.Resource.PathSegment}}'.replace('{id}', encodeURIComponent(this.config.project)); } {{end}} diff --git a/components/ambient-sdk/go-sdk/client/agent_api.go b/components/ambient-sdk/go-sdk/client/agent_api.go index 84f5496229..c5cbb0ddb1 100644 --- a/components/ambient-sdk/go-sdk/client/agent_api.go +++ b/components/ambient-sdk/go-sdk/client/agent_api.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z package client @@ -70,6 +70,14 @@ func (a *AgentAPI) Delete(ctx context.Context, id string) error { return a.client.do(ctx, http.MethodDelete, a.basePath()+"/"+url.PathEscape(id), nil, http.StatusNoContent, nil) } +func (a *AgentAPI) Start(ctx context.Context, id string) (*types.Agent, error) { + var result types.Agent + if err := a.client.do(ctx, http.MethodPost, a.basePath()+"/"+url.PathEscape(id)+"/start", nil, http.StatusOK, &result); err != nil { + return nil, err + } + return &result, nil +} + func (a *AgentAPI) ListAll(ctx context.Context, opts *types.ListOptions) *Iterator[types.Agent] { return NewIterator(func(page int) (*types.AgentList, error) { o := *opts diff --git a/components/ambient-sdk/go-sdk/client/client.go b/components/ambient-sdk/go-sdk/client/client.go index cd095b14f3..2de65fe650 100644 --- a/components/ambient-sdk/go-sdk/client/client.go +++ b/components/ambient-sdk/go-sdk/client/client.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 9a8e623edcfae33acf56edf974d1859a127c22915d4831cb786daba2b398ca37 -// Generated: 2026-03-21T21:30:53Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z package client @@ -25,7 +25,6 @@ import ( type Client struct { httpClient *http.Client - streamingClient *http.Client baseURL string token string project string @@ -45,21 +44,17 @@ func WithTimeout(timeout time.Duration) ClientOption { func WithInsecureSkipVerify() ClientOption { return func(c *Client) { c.insecureSkipVerify = true - applyInsecure := func(hc *http.Client) { - t, ok := hc.Transport.(*http.Transport) - if !ok || t == nil { - t = http.DefaultTransport.(*http.Transport).Clone() - } else { - t = t.Clone() - } - if t.TLSClientConfig == nil { - t.TLSClientConfig = &tls.Config{MinVersion: tls.VersionTLS12} - } - t.TLSClientConfig.InsecureSkipVerify = true //nolint:gosec - hc.Transport = t + t, ok := c.httpClient.Transport.(*http.Transport) + if !ok || t == nil { + t = http.DefaultTransport.(*http.Transport).Clone() + } else { + t = t.Clone() } - applyInsecure(c.httpClient) - applyInsecure(c.streamingClient) + if t.TLSClientConfig == nil { + t.TLSClientConfig = &tls.Config{MinVersion: tls.VersionTLS12} + } + t.TLSClientConfig.InsecureSkipVerify = true //nolint:gosec + c.httpClient.Transport = t } } @@ -100,19 +95,15 @@ func NewClient(baseURL, token, project string, opts ...ClientOption) (*Client, e return nil, fmt.Errorf("invalid base URL: %w", err) } - streamingTransport := http.DefaultTransport.(*http.Transport).Clone() - streamingTransport.DisableCompression = true - c := &Client{ httpClient: &http.Client{ Timeout: 30 * time.Second, }, - streamingClient: &http.Client{Transport: streamingTransport}, - baseURL: strings.TrimSuffix(baseURL, "/"), - token: token, - project: project, - logger: slog.Default(), - userAgent: "ambient-go-sdk/1.0.0", + baseURL: strings.TrimSuffix(baseURL, "/"), + token: token, + project: project, + logger: slog.Default(), + userAgent: "ambient-go-sdk/1.0.0", } for _, opt := range opts { @@ -124,10 +115,6 @@ func NewClient(baseURL, token, project string, opts ...ClientOption) (*Client, e return c, nil } -func (c *Client) Project() string { - return c.project -} - func NewClientFromEnv(opts ...ClientOption) (*Client, error) { baseURL := os.Getenv("AMBIENT_API_URL") if baseURL == "" { @@ -148,10 +135,6 @@ func NewClientFromEnv(opts ...ClientOption) (*Client, error) { } func (c *Client) do(ctx context.Context, method, path string, body []byte, expectedStatus int, result interface{}) error { - return c.doMultiStatus(ctx, method, path, body, result, expectedStatus) -} - -func (c *Client) doMultiStatus(ctx context.Context, method, path string, body []byte, result interface{}, expectedStatuses ...int) error { url := c.baseURL + "/api/ambient/v1" + path req, err := http.NewRequestWithContext(ctx, method, url, nil) @@ -192,14 +175,7 @@ func (c *Client) doMultiStatus(ctx context.Context, method, path string, body [] slog.Int("body_len", len(respBody)), ) - statusOK := false - for _, s := range expectedStatuses { - if resp.StatusCode == s { - statusOK = true - break - } - } - if !statusOK { + if resp.StatusCode != expectedStatus { var apiErr types.APIError if json.Unmarshal(respBody, &apiErr) == nil && apiErr.Code != "" { apiErr.StatusCode = resp.StatusCode diff --git a/components/ambient-sdk/go-sdk/client/credential_api.go b/components/ambient-sdk/go-sdk/client/credential_api.go index 558b5ec2d1..4adc344b05 100644 --- a/components/ambient-sdk/go-sdk/client/credential_api.go +++ b/components/ambient-sdk/go-sdk/client/credential_api.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z package client @@ -70,14 +70,6 @@ func (a *CredentialAPI) Delete(ctx context.Context, id string) error { return a.client.do(ctx, http.MethodDelete, a.basePath()+"/"+url.PathEscape(id), nil, http.StatusNoContent, nil) } -func (a *CredentialAPI) GetToken(ctx context.Context, id string) (*types.CredentialTokenResponse, error) { - var result types.CredentialTokenResponse - if err := a.client.do(ctx, http.MethodGet, a.basePath()+"/"+url.PathEscape(id)+"/token", nil, http.StatusOK, &result); err != nil { - return nil, err - } - return &result, nil -} - func (a *CredentialAPI) ListAll(ctx context.Context, opts *types.ListOptions) *Iterator[types.Credential] { return NewIterator(func(page int) (*types.CredentialList, error) { o := *opts diff --git a/components/ambient-sdk/go-sdk/client/inbox_message_api.go b/components/ambient-sdk/go-sdk/client/inbox_message_api.go index 23d8b635ba..7fb191bcc6 100644 --- a/components/ambient-sdk/go-sdk/client/inbox_message_api.go +++ b/components/ambient-sdk/go-sdk/client/inbox_message_api.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z package client diff --git a/components/ambient-sdk/go-sdk/client/iterator.go b/components/ambient-sdk/go-sdk/client/iterator.go index da5030716b..3d351bb186 100644 --- a/components/ambient-sdk/go-sdk/client/iterator.go +++ b/components/ambient-sdk/go-sdk/client/iterator.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z package client diff --git a/components/ambient-sdk/go-sdk/client/project_api.go b/components/ambient-sdk/go-sdk/client/project_api.go index 1aefbb7404..4b4fc91896 100644 --- a/components/ambient-sdk/go-sdk/client/project_api.go +++ b/components/ambient-sdk/go-sdk/client/project_api.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z package client diff --git a/components/ambient-sdk/go-sdk/client/project_settings_api.go b/components/ambient-sdk/go-sdk/client/project_settings_api.go index 47660e3509..7c1de751bd 100644 --- a/components/ambient-sdk/go-sdk/client/project_settings_api.go +++ b/components/ambient-sdk/go-sdk/client/project_settings_api.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z package client diff --git a/components/ambient-sdk/go-sdk/client/role_api.go b/components/ambient-sdk/go-sdk/client/role_api.go index 1e19ae5c4d..7a44277bcc 100644 --- a/components/ambient-sdk/go-sdk/client/role_api.go +++ b/components/ambient-sdk/go-sdk/client/role_api.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z package client diff --git a/components/ambient-sdk/go-sdk/client/role_binding_api.go b/components/ambient-sdk/go-sdk/client/role_binding_api.go index ad3e628e67..cc9aa8e2ee 100644 --- a/components/ambient-sdk/go-sdk/client/role_binding_api.go +++ b/components/ambient-sdk/go-sdk/client/role_binding_api.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z package client diff --git a/components/ambient-sdk/go-sdk/client/scheduled_session_api.go b/components/ambient-sdk/go-sdk/client/scheduled_session_api.go index daa07bdf9e..ab5989a999 100644 --- a/components/ambient-sdk/go-sdk/client/scheduled_session_api.go +++ b/components/ambient-sdk/go-sdk/client/scheduled_session_api.go @@ -1,3 +1,8 @@ +// Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. +// Source: ../../ambient-api-server/openapi/openapi.yaml +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z + package client import ( @@ -6,6 +11,7 @@ import ( "fmt" "net/http" "net/url" + "strings" "github.com/ambient-code/platform/components/ambient-sdk/go-sdk/types" ) @@ -17,98 +23,57 @@ type ScheduledSessionAPI struct { func (c *Client) ScheduledSessions() *ScheduledSessionAPI { return &ScheduledSessionAPI{client: c} } - -func (a *ScheduledSessionAPI) basePath(projectID string) string { - return "/projects/" + url.PathEscape(projectID) + "/scheduled-sessions" -} - -func (a *ScheduledSessionAPI) List(ctx context.Context, projectID string, opts *types.ListOptions) (*types.ScheduledSessionList, error) { - var result types.ScheduledSessionList - if err := a.client.doWithQuery(ctx, http.MethodGet, a.basePath(projectID), nil, http.StatusOK, &result, opts); err != nil { - return nil, err - } - return &result, nil -} - -func (a *ScheduledSessionAPI) Get(ctx context.Context, projectID, id string) (*types.ScheduledSession, error) { - var result types.ScheduledSession - path := a.basePath(projectID) + "/" + url.PathEscape(id) - if err := a.client.do(ctx, http.MethodGet, path, nil, http.StatusOK, &result); err != nil { - return nil, err - } - return &result, nil +func (a *ScheduledSessionAPI) basePath() string { + return strings.NewReplacer("{id}", url.PathEscape(a.client.project)).Replace("/projects/{id}/scheduled-sessions") } -func (a *ScheduledSessionAPI) Create(ctx context.Context, projectID string, resource *types.ScheduledSession) (*types.ScheduledSession, error) { +func (a *ScheduledSessionAPI) Create(ctx context.Context, resource *types.ScheduledSession) (*types.ScheduledSession, error) { body, err := json.Marshal(resource) if err != nil { - return nil, fmt.Errorf("marshal scheduled session: %w", err) + return nil, fmt.Errorf("marshal scheduled_session: %w", err) } var result types.ScheduledSession - if err := a.client.do(ctx, http.MethodPost, a.basePath(projectID), body, http.StatusCreated, &result); err != nil { + if err := a.client.do(ctx, http.MethodPost, a.basePath(), body, http.StatusCreated, &result); err != nil { return nil, err } return &result, nil } -func (a *ScheduledSessionAPI) Update(ctx context.Context, projectID, id string, patch *types.ScheduledSessionPatch) (*types.ScheduledSession, error) { - body, err := json.Marshal(patch) - if err != nil { - return nil, fmt.Errorf("marshal patch: %w", err) - } +func (a *ScheduledSessionAPI) Get(ctx context.Context, id string) (*types.ScheduledSession, error) { var result types.ScheduledSession - path := a.basePath(projectID) + "/" + url.PathEscape(id) - if err := a.client.do(ctx, http.MethodPatch, path, body, http.StatusOK, &result); err != nil { + if err := a.client.do(ctx, http.MethodGet, a.basePath()+"/"+url.PathEscape(id), nil, http.StatusOK, &result); err != nil { return nil, err } return &result, nil } -func (a *ScheduledSessionAPI) Delete(ctx context.Context, projectID, id string) error { - return a.client.do(ctx, http.MethodDelete, a.basePath(projectID)+"/"+url.PathEscape(id), nil, http.StatusNoContent, nil) -} - -func (a *ScheduledSessionAPI) Suspend(ctx context.Context, projectID, id string) (*types.ScheduledSession, error) { - var result types.ScheduledSession - path := a.basePath(projectID) + "/" + url.PathEscape(id) + "/suspend" - if err := a.client.do(ctx, http.MethodPost, path, nil, http.StatusOK, &result); err != nil { +func (a *ScheduledSessionAPI) List(ctx context.Context, opts *types.ListOptions) (*types.ScheduledSessionList, error) { + var result types.ScheduledSessionList + if err := a.client.doWithQuery(ctx, http.MethodGet, a.basePath(), nil, http.StatusOK, &result, opts); err != nil { return nil, err } return &result, nil } - -func (a *ScheduledSessionAPI) Resume(ctx context.Context, projectID, id string) (*types.ScheduledSession, error) { +func (a *ScheduledSessionAPI) Update(ctx context.Context, id string, patch map[string]any) (*types.ScheduledSession, error) { + body, err := json.Marshal(patch) + if err != nil { + return nil, fmt.Errorf("marshal patch: %w", err) + } var result types.ScheduledSession - path := a.basePath(projectID) + "/" + url.PathEscape(id) + "/resume" - if err := a.client.do(ctx, http.MethodPost, path, nil, http.StatusOK, &result); err != nil { + if err := a.client.do(ctx, http.MethodPatch, a.basePath()+"/"+url.PathEscape(id), body, http.StatusOK, &result); err != nil { return nil, err } return &result, nil } -func (a *ScheduledSessionAPI) Trigger(ctx context.Context, projectID, id string) error { - path := a.basePath(projectID) + "/" + url.PathEscape(id) + "/trigger" - return a.client.do(ctx, http.MethodPost, path, nil, http.StatusOK, nil) +func (a *ScheduledSessionAPI) Delete(ctx context.Context, id string) error { + return a.client.do(ctx, http.MethodDelete, a.basePath()+"/"+url.PathEscape(id), nil, http.StatusNoContent, nil) } -func (a *ScheduledSessionAPI) Runs(ctx context.Context, projectID, id string, opts *types.ListOptions) (*types.SessionList, error) { - var result types.SessionList - path := a.basePath(projectID) + "/" + url.PathEscape(id) + "/runs" - if err := a.client.doWithQuery(ctx, http.MethodGet, path, nil, http.StatusOK, &result, opts); err != nil { - return nil, err - } - return &result, nil -} - -func (a *ScheduledSessionAPI) GetByName(ctx context.Context, projectID, name string) (*types.ScheduledSession, error) { - list, err := a.List(ctx, projectID, &types.ListOptions{Search: "name = '" + name + "'"}) - if err != nil { - return nil, err - } - for i := range list.Items { - if list.Items[i].Name == name { - return &list.Items[i], nil - } - } - return nil, fmt.Errorf("scheduled session %q not found in project %q", name, projectID) +func (a *ScheduledSessionAPI) ListAll(ctx context.Context, opts *types.ListOptions) *Iterator[types.ScheduledSession] { + return NewIterator(func(page int) (*types.ScheduledSessionList, error) { + o := *opts + o.Page = page + return a.List(ctx, &o) + }) } diff --git a/components/ambient-sdk/go-sdk/client/session_api.go b/components/ambient-sdk/go-sdk/client/session_api.go index 2e3afb1927..c693562023 100644 --- a/components/ambient-sdk/go-sdk/client/session_api.go +++ b/components/ambient-sdk/go-sdk/client/session_api.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z package client diff --git a/components/ambient-sdk/go-sdk/client/session_message_api.go b/components/ambient-sdk/go-sdk/client/session_message_api.go index 0f0e43c80d..b34b0a5b31 100644 --- a/components/ambient-sdk/go-sdk/client/session_message_api.go +++ b/components/ambient-sdk/go-sdk/client/session_message_api.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z package client diff --git a/components/ambient-sdk/go-sdk/client/user_api.go b/components/ambient-sdk/go-sdk/client/user_api.go index c78f7cbb85..fabb4924da 100644 --- a/components/ambient-sdk/go-sdk/client/user_api.go +++ b/components/ambient-sdk/go-sdk/client/user_api.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z package client diff --git a/components/ambient-sdk/go-sdk/types/agent.go b/components/ambient-sdk/go-sdk/types/agent.go index e880327d45..36bd1ffe3d 100644 --- a/components/ambient-sdk/go-sdk/types/agent.go +++ b/components/ambient-sdk/go-sdk/types/agent.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z package types diff --git a/components/ambient-sdk/go-sdk/types/base.go b/components/ambient-sdk/go-sdk/types/base.go index b3a3734baa..1a7a4984c2 100644 --- a/components/ambient-sdk/go-sdk/types/base.go +++ b/components/ambient-sdk/go-sdk/types/base.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z package types diff --git a/components/ambient-sdk/go-sdk/types/credential.go b/components/ambient-sdk/go-sdk/types/credential.go index 2c2429be3b..435fbe007f 100644 --- a/components/ambient-sdk/go-sdk/types/credential.go +++ b/components/ambient-sdk/go-sdk/types/credential.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z package types @@ -155,9 +155,3 @@ func (b *CredentialPatchBuilder) URL(v string) *CredentialPatchBuilder { func (b *CredentialPatchBuilder) Build() map[string]any { return b.patch } - -type CredentialTokenResponse struct { - CredentialID string `json:"credential_id"` - Provider string `json:"provider"` - Token string `json:"token"` -} diff --git a/components/ambient-sdk/go-sdk/types/inbox_message.go b/components/ambient-sdk/go-sdk/types/inbox_message.go index eb851499d7..706279faf8 100644 --- a/components/ambient-sdk/go-sdk/types/inbox_message.go +++ b/components/ambient-sdk/go-sdk/types/inbox_message.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z package types diff --git a/components/ambient-sdk/go-sdk/types/list_options.go b/components/ambient-sdk/go-sdk/types/list_options.go index bf7d638d68..49c6393039 100644 --- a/components/ambient-sdk/go-sdk/types/list_options.go +++ b/components/ambient-sdk/go-sdk/types/list_options.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z package types diff --git a/components/ambient-sdk/go-sdk/types/project.go b/components/ambient-sdk/go-sdk/types/project.go index d22837b1c1..f08f53449d 100644 --- a/components/ambient-sdk/go-sdk/types/project.go +++ b/components/ambient-sdk/go-sdk/types/project.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z package types diff --git a/components/ambient-sdk/go-sdk/types/project_settings.go b/components/ambient-sdk/go-sdk/types/project_settings.go index 1a5a07d61c..f2be17a9f7 100644 --- a/components/ambient-sdk/go-sdk/types/project_settings.go +++ b/components/ambient-sdk/go-sdk/types/project_settings.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z package types diff --git a/components/ambient-sdk/go-sdk/types/role.go b/components/ambient-sdk/go-sdk/types/role.go index 3bc87ba6b3..28f59a6a33 100644 --- a/components/ambient-sdk/go-sdk/types/role.go +++ b/components/ambient-sdk/go-sdk/types/role.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z package types diff --git a/components/ambient-sdk/go-sdk/types/role_binding.go b/components/ambient-sdk/go-sdk/types/role_binding.go index 37a09d474d..b957a453d9 100644 --- a/components/ambient-sdk/go-sdk/types/role_binding.go +++ b/components/ambient-sdk/go-sdk/types/role_binding.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z package types diff --git a/components/ambient-sdk/go-sdk/types/scheduled_session.go b/components/ambient-sdk/go-sdk/types/scheduled_session.go index 2b3f9d2ceb..1313662edc 100755 --- a/components/ambient-sdk/go-sdk/types/scheduled_session.go +++ b/components/ambient-sdk/go-sdk/types/scheduled_session.go @@ -1,3 +1,8 @@ +// Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. +// Source: ../../ambient-api-server/openapi/openapi.yaml +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z + package types import ( @@ -12,16 +17,16 @@ type ScheduledSession struct { AgentID string `json:"agent_id,omitempty"` Description string `json:"description,omitempty"` Enabled bool `json:"enabled,omitempty"` - InactivityTimeout *int32 `json:"inactivity_timeout,omitempty"` + InactivityTimeout int32 `json:"inactivity_timeout,omitempty"` LastRunAt *time.Time `json:"last_run_at,omitempty"` Name string `json:"name"` NextRunAt *time.Time `json:"next_run_at,omitempty"` - ProjectID string `json:"project_id,omitempty"` + ProjectID string `json:"project_id"` RunnerType string `json:"runner_type,omitempty"` - Schedule string `json:"schedule,omitempty"` + Schedule string `json:"schedule"` SessionPrompt string `json:"session_prompt,omitempty"` - StopOnRunFinished *bool `json:"stop_on_run_finished,omitempty"` - Timeout *int32 `json:"timeout,omitempty"` + StopOnRunFinished bool `json:"stop_on_run_finished,omitempty"` + Timeout int32 `json:"timeout,omitempty"` Timezone string `json:"timezone,omitempty"` } @@ -35,164 +40,164 @@ func (l *ScheduledSessionList) GetTotal() int { return l.Total } func (l *ScheduledSessionList) GetPage() int { return l.Page } func (l *ScheduledSessionList) GetSize() int { return l.Size } -// ScheduledSessionPatch is the request body for a PATCH operation. -// Only set fields that should be changed; omitted (nil) fields are left unchanged. -type ScheduledSessionPatch struct { - Name *string `json:"name,omitempty"` - Description *string `json:"description,omitempty"` - AgentID *string `json:"agent_id,omitempty"` - Schedule *string `json:"schedule,omitempty"` - Timezone *string `json:"timezone,omitempty"` - Enabled *bool `json:"enabled,omitempty"` - SessionPrompt *string `json:"session_prompt,omitempty"` - Timeout *int32 `json:"timeout,omitempty"` - InactivityTimeout *int32 `json:"inactivity_timeout,omitempty"` - StopOnRunFinished *bool `json:"stop_on_run_finished,omitempty"` - RunnerType *string `json:"runner_type,omitempty"` -} - -// ScheduledSessionBuilder builds a ScheduledSession for creation. type ScheduledSessionBuilder struct { resource ScheduledSession - errs []error + errors []error } func NewScheduledSessionBuilder() *ScheduledSessionBuilder { return &ScheduledSessionBuilder{} } -func (b *ScheduledSessionBuilder) Name(v string) *ScheduledSessionBuilder { - b.resource.Name = v +func (b *ScheduledSessionBuilder) AgentID(v string) *ScheduledSessionBuilder { + b.resource.AgentID = v return b } -func (b *ScheduledSessionBuilder) ProjectID(v string) *ScheduledSessionBuilder { - b.resource.ProjectID = v +func (b *ScheduledSessionBuilder) Description(v string) *ScheduledSessionBuilder { + b.resource.Description = v return b } -func (b *ScheduledSessionBuilder) AgentID(v string) *ScheduledSessionBuilder { - b.resource.AgentID = v +func (b *ScheduledSessionBuilder) Enabled(v bool) *ScheduledSessionBuilder { + b.resource.Enabled = v return b } -func (b *ScheduledSessionBuilder) Schedule(v string) *ScheduledSessionBuilder { - b.resource.Schedule = v +func (b *ScheduledSessionBuilder) InactivityTimeout(v int32) *ScheduledSessionBuilder { + b.resource.InactivityTimeout = v return b } -func (b *ScheduledSessionBuilder) Timezone(v string) *ScheduledSessionBuilder { - b.resource.Timezone = v +func (b *ScheduledSessionBuilder) LastRunAt(v *time.Time) *ScheduledSessionBuilder { + b.resource.LastRunAt = v return b } -func (b *ScheduledSessionBuilder) SessionPrompt(v string) *ScheduledSessionBuilder { - b.resource.SessionPrompt = v +func (b *ScheduledSessionBuilder) Name(v string) *ScheduledSessionBuilder { + b.resource.Name = v return b } -func (b *ScheduledSessionBuilder) Description(v string) *ScheduledSessionBuilder { - b.resource.Description = v +func (b *ScheduledSessionBuilder) NextRunAt(v *time.Time) *ScheduledSessionBuilder { + b.resource.NextRunAt = v return b } -func (b *ScheduledSessionBuilder) Timeout(v int32) *ScheduledSessionBuilder { - b.resource.Timeout = &v +func (b *ScheduledSessionBuilder) ProjectID(v string) *ScheduledSessionBuilder { + b.resource.ProjectID = v return b } -func (b *ScheduledSessionBuilder) InactivityTimeout(v int32) *ScheduledSessionBuilder { - b.resource.InactivityTimeout = &v +func (b *ScheduledSessionBuilder) RunnerType(v string) *ScheduledSessionBuilder { + b.resource.RunnerType = v + return b +} + +func (b *ScheduledSessionBuilder) Schedule(v string) *ScheduledSessionBuilder { + b.resource.Schedule = v + return b +} + +func (b *ScheduledSessionBuilder) SessionPrompt(v string) *ScheduledSessionBuilder { + b.resource.SessionPrompt = v return b } func (b *ScheduledSessionBuilder) StopOnRunFinished(v bool) *ScheduledSessionBuilder { - b.resource.StopOnRunFinished = &v + b.resource.StopOnRunFinished = v return b } -func (b *ScheduledSessionBuilder) RunnerType(v string) *ScheduledSessionBuilder { - b.resource.RunnerType = v +func (b *ScheduledSessionBuilder) Timeout(v int32) *ScheduledSessionBuilder { + b.resource.Timeout = v + return b +} + +func (b *ScheduledSessionBuilder) Timezone(v string) *ScheduledSessionBuilder { + b.resource.Timezone = v return b } func (b *ScheduledSessionBuilder) Build() (*ScheduledSession, error) { if b.resource.Name == "" { - b.errs = append(b.errs, fmt.Errorf("name is required")) + b.errors = append(b.errors, fmt.Errorf("name is required")) + } + if b.resource.ProjectID == "" { + b.errors = append(b.errors, fmt.Errorf("project_id is required")) } if b.resource.Schedule == "" { - b.errs = append(b.errs, fmt.Errorf("schedule is required")) + b.errors = append(b.errors, fmt.Errorf("schedule is required")) } - if len(b.errs) > 0 { - return nil, fmt.Errorf("validation failed: %w", errors.Join(b.errs...)) + if len(b.errors) > 0 { + return nil, fmt.Errorf("validation failed: %w", errors.Join(b.errors...)) } return &b.resource, nil } -// ScheduledSessionPatchBuilder builds a ScheduledSessionPatch for update operations. type ScheduledSessionPatchBuilder struct { - patch ScheduledSessionPatch + patch map[string]any } func NewScheduledSessionPatchBuilder() *ScheduledSessionPatchBuilder { - return &ScheduledSessionPatchBuilder{} + return &ScheduledSessionPatchBuilder{patch: make(map[string]any)} } -func (b *ScheduledSessionPatchBuilder) Name(v string) *ScheduledSessionPatchBuilder { - b.patch.Name = &v +func (b *ScheduledSessionPatchBuilder) AgentID(v string) *ScheduledSessionPatchBuilder { + b.patch["agent_id"] = v return b } func (b *ScheduledSessionPatchBuilder) Description(v string) *ScheduledSessionPatchBuilder { - b.patch.Description = &v + b.patch["description"] = v return b } -func (b *ScheduledSessionPatchBuilder) Schedule(v string) *ScheduledSessionPatchBuilder { - b.patch.Schedule = &v +func (b *ScheduledSessionPatchBuilder) Enabled(v bool) *ScheduledSessionPatchBuilder { + b.patch["enabled"] = v return b } -func (b *ScheduledSessionPatchBuilder) Timezone(v string) *ScheduledSessionPatchBuilder { - b.patch.Timezone = &v +func (b *ScheduledSessionPatchBuilder) InactivityTimeout(v int32) *ScheduledSessionPatchBuilder { + b.patch["inactivity_timeout"] = v return b } -func (b *ScheduledSessionPatchBuilder) Enabled(v bool) *ScheduledSessionPatchBuilder { - b.patch.Enabled = &v +func (b *ScheduledSessionPatchBuilder) Name(v string) *ScheduledSessionPatchBuilder { + b.patch["name"] = v return b } -func (b *ScheduledSessionPatchBuilder) SessionPrompt(v string) *ScheduledSessionPatchBuilder { - b.patch.SessionPrompt = &v +func (b *ScheduledSessionPatchBuilder) RunnerType(v string) *ScheduledSessionPatchBuilder { + b.patch["runner_type"] = v return b } -func (b *ScheduledSessionPatchBuilder) AgentID(v string) *ScheduledSessionPatchBuilder { - b.patch.AgentID = &v +func (b *ScheduledSessionPatchBuilder) Schedule(v string) *ScheduledSessionPatchBuilder { + b.patch["schedule"] = v return b } -func (b *ScheduledSessionPatchBuilder) Timeout(v int32) *ScheduledSessionPatchBuilder { - b.patch.Timeout = &v +func (b *ScheduledSessionPatchBuilder) SessionPrompt(v string) *ScheduledSessionPatchBuilder { + b.patch["session_prompt"] = v return b } -func (b *ScheduledSessionPatchBuilder) InactivityTimeout(v int32) *ScheduledSessionPatchBuilder { - b.patch.InactivityTimeout = &v +func (b *ScheduledSessionPatchBuilder) StopOnRunFinished(v bool) *ScheduledSessionPatchBuilder { + b.patch["stop_on_run_finished"] = v return b } -func (b *ScheduledSessionPatchBuilder) StopOnRunFinished(v bool) *ScheduledSessionPatchBuilder { - b.patch.StopOnRunFinished = &v +func (b *ScheduledSessionPatchBuilder) Timeout(v int32) *ScheduledSessionPatchBuilder { + b.patch["timeout"] = v return b } -func (b *ScheduledSessionPatchBuilder) RunnerType(v string) *ScheduledSessionPatchBuilder { - b.patch.RunnerType = &v +func (b *ScheduledSessionPatchBuilder) Timezone(v string) *ScheduledSessionPatchBuilder { + b.patch["timezone"] = v return b } -func (b *ScheduledSessionPatchBuilder) Build() *ScheduledSessionPatch { - return &b.patch +func (b *ScheduledSessionPatchBuilder) Build() map[string]any { + return b.patch } diff --git a/components/ambient-sdk/go-sdk/types/session.go b/components/ambient-sdk/go-sdk/types/session.go index 98459dd051..59c96e5c13 100644 --- a/components/ambient-sdk/go-sdk/types/session.go +++ b/components/ambient-sdk/go-sdk/types/session.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z package types diff --git a/components/ambient-sdk/go-sdk/types/session_message.go b/components/ambient-sdk/go-sdk/types/session_message.go index 82b37c6035..ef159eaca8 100644 --- a/components/ambient-sdk/go-sdk/types/session_message.go +++ b/components/ambient-sdk/go-sdk/types/session_message.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z package types diff --git a/components/ambient-sdk/go-sdk/types/user.go b/components/ambient-sdk/go-sdk/types/user.go index 35682b8e61..7d626e7a31 100644 --- a/components/ambient-sdk/go-sdk/types/user.go +++ b/components/ambient-sdk/go-sdk/types/user.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z package types diff --git a/components/ambient-sdk/python-sdk/ambient_platform/__init__.py b/components/ambient-sdk/python-sdk/ambient_platform/__init__.py index 57b230f4e8..3e2c045744 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/__init__.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/__init__.py @@ -1,18 +1,20 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: 9a8e623edcfae33acf56edf974d1859a127c22915d4831cb786daba2b398ca37 -# Generated: 2026-03-21T21:30:53Z +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z """Ambient Platform SDK for Python.""" from .client import AmbientClient from ._base import APIError, ListOptions -from .inbox_message import InboxMessage +from .agent import Agent, AgentPatch +from .credential import Credential, CredentialPatch +from .inbox_message import InboxMessage, InboxMessagePatch from .project import Project, ProjectPatch -from .agent import Agent from .project_settings import ProjectSettings, ProjectSettingsPatch from .role import Role, RolePatch from .role_binding import RoleBinding, RoleBindingPatch +from .scheduled_session import ScheduledSession, ScheduledSessionPatch from .session import Session, SessionPatch, SessionStatusPatch from .session_message import SessionMessage from .user import User, UserPatch @@ -23,16 +25,22 @@ "AmbientClient", "APIError", "ListOptions", + "Agent", + "AgentPatch", + "Credential", + "CredentialPatch", "InboxMessage", + "InboxMessagePatch", "Project", "ProjectPatch", - "Agent", "ProjectSettings", "ProjectSettingsPatch", "Role", "RolePatch", "RoleBinding", "RoleBindingPatch", + "ScheduledSession", + "ScheduledSessionPatch", "Session", "SessionPatch", "SessionStatusPatch", diff --git a/components/ambient-sdk/python-sdk/ambient_platform/_agent_api.py b/components/ambient-sdk/python-sdk/ambient_platform/_agent_api.py index 531a9a9268..d3508c4ecf 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/_agent_api.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/_agent_api.py @@ -1,11 +1,12 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: 404b5671af96841f4a876b6192afc6358b4fb8e082ca2b6da499efcf3f72c781 -# Generated: 2026-03-20T16:48:23Z +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z from __future__ import annotations from typing import Any, Iterator, Optional, TYPE_CHECKING +from urllib.parse import quote from ._base import ListOptions from .agent import Agent, AgentList @@ -17,22 +18,32 @@ class AgentAPI: def __init__(self, client: AmbientClient) -> None: self._client = client + def _base_path(self) -> str: + return "/projects/{id}/agents".replace("{id}", quote(self._client._project, safe="")) + def create(self, data: dict) -> Agent: - resp = self._client._request("POST", "/agents", json=data) + resp = self._client._request("POST", self._base_path(), json=data) return Agent.from_dict(resp) def get(self, resource_id: str) -> Agent: - resp = self._client._request("GET", f"/agents/{resource_id}") + resp = self._client._request("GET", f"{self._base_path()}/{resource_id}") return Agent.from_dict(resp) def list(self, opts: Optional[ListOptions] = None) -> AgentList: params = opts.to_params() if opts else None - resp = self._client._request("GET", "/agents", params=params) + resp = self._client._request("GET", self._base_path(), params=params) return AgentList.from_dict(resp) def update(self, resource_id: str, patch: Any) -> Agent: data = patch.to_dict() if hasattr(patch, "to_dict") else patch - resp = self._client._request("PATCH", f"/agents/{resource_id}", json=data) + resp = self._client._request("PATCH", f"{self._base_path()}/{resource_id}", json=data) + return Agent.from_dict(resp) + + def delete(self, resource_id: str) -> None: + self._client._request("DELETE", f"{self._base_path()}/{resource_id}", expect_json=False) + + def start(self, resource_id: str) -> Agent: + resp = self._client._request("POST", f"{self._base_path()}/{resource_id}/start") return Agent.from_dict(resp) def list_all(self, size: int = 100, **kwargs: Any) -> Iterator[Agent]: diff --git a/components/ambient-sdk/python-sdk/ambient_platform/_base.py b/components/ambient-sdk/python-sdk/ambient_platform/_base.py index 89dd7058a1..1299d34c2d 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/_base.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/_base.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -# Generated: 2026-04-18T21:11:11Z +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z from __future__ import annotations diff --git a/components/ambient-sdk/python-sdk/ambient_platform/_credential_api.py b/components/ambient-sdk/python-sdk/ambient_platform/_credential_api.py new file mode 100644 index 0000000000..b22bae1fd3 --- /dev/null +++ b/components/ambient-sdk/python-sdk/ambient_platform/_credential_api.py @@ -0,0 +1,52 @@ +# Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. +# Source: ../../ambient-api-server/openapi/openapi.yaml +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z + +from __future__ import annotations + +from typing import Any, Iterator, Optional, TYPE_CHECKING +from urllib.parse import quote + +from ._base import ListOptions +from .credential import Credential, CredentialList + +if TYPE_CHECKING: + from .client import AmbientClient + + +class CredentialAPI: + def __init__(self, client: AmbientClient) -> None: + self._client = client + def _base_path(self) -> str: + return "/projects/{id}/credentials".replace("{id}", quote(self._client._project, safe="")) + + + def create(self, data: dict) -> Credential: + resp = self._client._request("POST", self._base_path(), json=data) + return Credential.from_dict(resp) + + def get(self, resource_id: str) -> Credential: + resp = self._client._request("GET", f"{self._base_path()}/{resource_id}") + return Credential.from_dict(resp) + + def list(self, opts: Optional[ListOptions] = None) -> CredentialList: + params = opts.to_params() if opts else None + resp = self._client._request("GET", self._base_path(), params=params) + return CredentialList.from_dict(resp) + def update(self, resource_id: str, patch: Any) -> Credential: + data = patch.to_dict() if hasattr(patch, "to_dict") else patch + resp = self._client._request("PATCH", f"{self._base_path()}/{resource_id}", json=data) + return Credential.from_dict(resp) + + def delete(self, resource_id: str) -> None: + self._client._request("DELETE", f"{self._base_path()}/{resource_id}", expect_json=False) + + def list_all(self, size: int = 100, **kwargs: Any) -> Iterator[Credential]: + page = 1 + while True: + result = self.list(ListOptions().page(page).size(size)) + yield from result.items + if page * size >= result.total: + break + page += 1 diff --git a/components/ambient-sdk/python-sdk/ambient_platform/_inbox_message_api.py b/components/ambient-sdk/python-sdk/ambient_platform/_inbox_message_api.py index 7fb6582f5a..f08107219d 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/_inbox_message_api.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/_inbox_message_api.py @@ -1,11 +1,12 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: 9a8e623edcfae33acf56edf974d1859a127c22915d4831cb786daba2b398ca37 -# Generated: 2026-03-21T21:30:53Z +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z from __future__ import annotations from typing import Any, Iterator, Optional, TYPE_CHECKING +from urllib.parse import quote from ._base import ListOptions from .inbox_message import InboxMessage, InboxMessageList @@ -17,19 +18,30 @@ class InboxMessageAPI: def __init__(self, client: AmbientClient) -> None: self._client = client + def _base_path(self) -> str: + return "/projects/{id}/agents/{agent_id}/inbox".replace("{id}", quote(self._client._project, safe="")) + def create(self, data: dict) -> InboxMessage: - resp = self._client._request("POST", "/projects", json=data) + resp = self._client._request("POST", self._base_path(), json=data) return InboxMessage.from_dict(resp) def get(self, resource_id: str) -> InboxMessage: - resp = self._client._request("GET", f"/projects/{resource_id}") + resp = self._client._request("GET", f"{self._base_path()}/{resource_id}") return InboxMessage.from_dict(resp) def list(self, opts: Optional[ListOptions] = None) -> InboxMessageList: params = opts.to_params() if opts else None - resp = self._client._request("GET", "/projects", params=params) + resp = self._client._request("GET", self._base_path(), params=params) return InboxMessageList.from_dict(resp) + def update(self, resource_id: str, patch: Any) -> InboxMessage: + data = patch.to_dict() if hasattr(patch, "to_dict") else patch + resp = self._client._request("PATCH", f"{self._base_path()}/{resource_id}", json=data) + return InboxMessage.from_dict(resp) + + def delete(self, resource_id: str) -> None: + self._client._request("DELETE", f"{self._base_path()}/{resource_id}", expect_json=False) + def list_all(self, size: int = 100, **kwargs: Any) -> Iterator[InboxMessage]: page = 1 while True: diff --git a/components/ambient-sdk/python-sdk/ambient_platform/_iterator.py b/components/ambient-sdk/python-sdk/ambient_platform/_iterator.py index 920933d385..e85c67a355 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/_iterator.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/_iterator.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -# Generated: 2026-04-18T21:11:11Z +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z from __future__ import annotations diff --git a/components/ambient-sdk/python-sdk/ambient_platform/_project_api.py b/components/ambient-sdk/python-sdk/ambient_platform/_project_api.py index 31054debe4..bab3c333f3 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/_project_api.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/_project_api.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -# Generated: 2026-04-18T21:11:11Z +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z from __future__ import annotations diff --git a/components/ambient-sdk/python-sdk/ambient_platform/_project_settings_api.py b/components/ambient-sdk/python-sdk/ambient_platform/_project_settings_api.py index fcb507970a..349dba65d0 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/_project_settings_api.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/_project_settings_api.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -# Generated: 2026-04-18T21:11:11Z +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z from __future__ import annotations diff --git a/components/ambient-sdk/python-sdk/ambient_platform/_role_api.py b/components/ambient-sdk/python-sdk/ambient_platform/_role_api.py index 611bcffc58..863aae7083 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/_role_api.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/_role_api.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: 9a8e623edcfae33acf56edf974d1859a127c22915d4831cb786daba2b398ca37 -# Generated: 2026-03-21T21:30:53Z +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z from __future__ import annotations @@ -35,6 +35,9 @@ def update(self, resource_id: str, patch: Any) -> Role: resp = self._client._request("PATCH", f"/roles/{resource_id}", json=data) return Role.from_dict(resp) + def delete(self, resource_id: str) -> None: + self._client._request("DELETE", f"/roles/{resource_id}", expect_json=False) + def list_all(self, size: int = 100, **kwargs: Any) -> Iterator[Role]: page = 1 while True: diff --git a/components/ambient-sdk/python-sdk/ambient_platform/_role_binding_api.py b/components/ambient-sdk/python-sdk/ambient_platform/_role_binding_api.py index 391c6d5361..84a861d07c 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/_role_binding_api.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/_role_binding_api.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: 9a8e623edcfae33acf56edf974d1859a127c22915d4831cb786daba2b398ca37 -# Generated: 2026-03-21T21:30:53Z +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z from __future__ import annotations @@ -35,6 +35,9 @@ def update(self, resource_id: str, patch: Any) -> RoleBinding: resp = self._client._request("PATCH", f"/role_bindings/{resource_id}", json=data) return RoleBinding.from_dict(resp) + def delete(self, resource_id: str) -> None: + self._client._request("DELETE", f"/role_bindings/{resource_id}", expect_json=False) + def list_all(self, size: int = 100, **kwargs: Any) -> Iterator[RoleBinding]: page = 1 while True: diff --git a/components/ambient-sdk/python-sdk/ambient_platform/_scheduled_session_api.py b/components/ambient-sdk/python-sdk/ambient_platform/_scheduled_session_api.py new file mode 100644 index 0000000000..ce52c9a55f --- /dev/null +++ b/components/ambient-sdk/python-sdk/ambient_platform/_scheduled_session_api.py @@ -0,0 +1,52 @@ +# Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. +# Source: ../../ambient-api-server/openapi/openapi.yaml +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z + +from __future__ import annotations + +from typing import Any, Iterator, Optional, TYPE_CHECKING +from urllib.parse import quote + +from ._base import ListOptions +from .scheduled_session import ScheduledSession, ScheduledSessionList + +if TYPE_CHECKING: + from .client import AmbientClient + + +class ScheduledSessionAPI: + def __init__(self, client: AmbientClient) -> None: + self._client = client + def _base_path(self) -> str: + return "/projects/{id}/scheduled-sessions".replace("{id}", quote(self._client._project, safe="")) + + + def create(self, data: dict) -> ScheduledSession: + resp = self._client._request("POST", self._base_path(), json=data) + return ScheduledSession.from_dict(resp) + + def get(self, resource_id: str) -> ScheduledSession: + resp = self._client._request("GET", f"{self._base_path()}/{resource_id}") + return ScheduledSession.from_dict(resp) + + def list(self, opts: Optional[ListOptions] = None) -> ScheduledSessionList: + params = opts.to_params() if opts else None + resp = self._client._request("GET", self._base_path(), params=params) + return ScheduledSessionList.from_dict(resp) + def update(self, resource_id: str, patch: Any) -> ScheduledSession: + data = patch.to_dict() if hasattr(patch, "to_dict") else patch + resp = self._client._request("PATCH", f"{self._base_path()}/{resource_id}", json=data) + return ScheduledSession.from_dict(resp) + + def delete(self, resource_id: str) -> None: + self._client._request("DELETE", f"{self._base_path()}/{resource_id}", expect_json=False) + + def list_all(self, size: int = 100, **kwargs: Any) -> Iterator[ScheduledSession]: + page = 1 + while True: + result = self.list(ListOptions().page(page).size(size)) + yield from result.items + if page * size >= result.total: + break + page += 1 diff --git a/components/ambient-sdk/python-sdk/ambient_platform/_session_api.py b/components/ambient-sdk/python-sdk/ambient_platform/_session_api.py index c006ab9238..aaa841d939 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/_session_api.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/_session_api.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -# Generated: 2026-04-18T21:11:11Z +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z from __future__ import annotations diff --git a/components/ambient-sdk/python-sdk/ambient_platform/_session_message_api.py b/components/ambient-sdk/python-sdk/ambient_platform/_session_message_api.py index 0e1bd918fb..2fea71f2a6 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/_session_message_api.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/_session_message_api.py @@ -1,11 +1,12 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: 9a8e623edcfae33acf56edf974d1859a127c22915d4831cb786daba2b398ca37 -# Generated: 2026-03-21T21:30:53Z +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z from __future__ import annotations from typing import Any, Iterator, Optional, TYPE_CHECKING +from urllib.parse import quote from ._base import ListOptions from .session_message import SessionMessage, SessionMessageList @@ -17,18 +18,21 @@ class SessionMessageAPI: def __init__(self, client: AmbientClient) -> None: self._client = client + def _base_path(self) -> str: + return "/sessions/{id}/messages".replace("{id}", quote(self._client._project, safe="")) + def create(self, data: dict) -> SessionMessage: - resp = self._client._request("POST", "/sessions", json=data) + resp = self._client._request("POST", self._base_path(), json=data) return SessionMessage.from_dict(resp) def get(self, resource_id: str) -> SessionMessage: - resp = self._client._request("GET", f"/sessions/{resource_id}") + resp = self._client._request("GET", f"{self._base_path()}/{resource_id}") return SessionMessage.from_dict(resp) def list(self, opts: Optional[ListOptions] = None) -> SessionMessageList: params = opts.to_params() if opts else None - resp = self._client._request("GET", "/sessions", params=params) + resp = self._client._request("GET", self._base_path(), params=params) return SessionMessageList.from_dict(resp) def list_all(self, size: int = 100, **kwargs: Any) -> Iterator[SessionMessage]: page = 1 diff --git a/components/ambient-sdk/python-sdk/ambient_platform/_user_api.py b/components/ambient-sdk/python-sdk/ambient_platform/_user_api.py index 9d00255e63..0028278b51 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/_user_api.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/_user_api.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -# Generated: 2026-04-18T21:11:11Z +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z from __future__ import annotations diff --git a/components/ambient-sdk/python-sdk/ambient_platform/agent.py b/components/ambient-sdk/python-sdk/ambient_platform/agent.py index 207c8669c2..71a48d81fe 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/agent.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/agent.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: 404b5671af96841f4a876b6192afc6358b4fb8e082ca2b6da499efcf3f72c781 -# Generated: 2026-03-20T16:48:23Z +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z from __future__ import annotations @@ -19,10 +19,24 @@ class Agent: href: str = "" created_at: Optional[datetime] = None updated_at: Optional[datetime] = None + annotations: str = "" + bot_account_name: str = "" + current_session_id: str = "" + description: str = "" + display_name: str = "" + environment_variables: str = "" + labels: str = "" + llm_max_tokens: int = 0 + llm_model: str = "" + llm_temperature: float = 0.0 name: str = "" owner_user_id: str = "" + parent_agent_id: str = "" + project_id: str = "" prompt: str = "" - version: int = 0 + repo_url: str = "" + resource_overrides: str = "" + workflow_id: str = "" @classmethod def from_dict(cls, data: dict) -> Agent: @@ -32,10 +46,24 @@ def from_dict(cls, data: dict) -> Agent: href=data.get("href", ""), created_at=_parse_datetime(data.get("created_at")), updated_at=_parse_datetime(data.get("updated_at")), + annotations=data.get("annotations", ""), + bot_account_name=data.get("bot_account_name", ""), + current_session_id=data.get("current_session_id", ""), + description=data.get("description", ""), + display_name=data.get("display_name", ""), + environment_variables=data.get("environment_variables", ""), + labels=data.get("labels", ""), + llm_max_tokens=data.get("llm_max_tokens", 0), + llm_model=data.get("llm_model", ""), + llm_temperature=data.get("llm_temperature", 0.0), name=data.get("name", ""), owner_user_id=data.get("owner_user_id", ""), + parent_agent_id=data.get("parent_agent_id", ""), + project_id=data.get("project_id", ""), prompt=data.get("prompt", ""), - version=data.get("version", 0), + repo_url=data.get("repo_url", ""), + resource_overrides=data.get("resource_overrides", ""), + workflow_id=data.get("workflow_id", ""), ) @classmethod @@ -67,6 +95,42 @@ def __init__(self) -> None: self._data: dict[str, Any] = {} + def annotations(self, value: str) -> AgentBuilder: + self._data["annotations"] = value + return self + + def bot_account_name(self, value: str) -> AgentBuilder: + self._data["bot_account_name"] = value + return self + + def description(self, value: str) -> AgentBuilder: + self._data["description"] = value + return self + + def display_name(self, value: str) -> AgentBuilder: + self._data["display_name"] = value + return self + + def environment_variables(self, value: str) -> AgentBuilder: + self._data["environment_variables"] = value + return self + + def labels(self, value: str) -> AgentBuilder: + self._data["labels"] = value + return self + + def llm_max_tokens(self, value: int) -> AgentBuilder: + self._data["llm_max_tokens"] = value + return self + + def llm_model(self, value: str) -> AgentBuilder: + self._data["llm_model"] = value + return self + + def llm_temperature(self, value: float) -> AgentBuilder: + self._data["llm_temperature"] = value + return self + def name(self, value: str) -> AgentBuilder: self._data["name"] = value return self @@ -75,15 +139,35 @@ def owner_user_id(self, value: str) -> AgentBuilder: self._data["owner_user_id"] = value return self + def parent_agent_id(self, value: str) -> AgentBuilder: + self._data["parent_agent_id"] = value + return self + + def project_id(self, value: str) -> AgentBuilder: + self._data["project_id"] = value + return self + def prompt(self, value: str) -> AgentBuilder: self._data["prompt"] = value return self + def repo_url(self, value: str) -> AgentBuilder: + self._data["repo_url"] = value + return self + + def resource_overrides(self, value: str) -> AgentBuilder: + self._data["resource_overrides"] = value + return self + + def workflow_id(self, value: str) -> AgentBuilder: + self._data["workflow_id"] = value + return self + def build(self) -> dict: if "name" not in self._data: raise ValueError("name is required") - if "owner_user_id" not in self._data: - raise ValueError("owner_user_id is required") + if "project_id" not in self._data: + raise ValueError("project_id is required") return dict(self._data) @@ -92,9 +176,45 @@ def __init__(self) -> None: self._data: dict[str, Any] = {} + def annotations(self, value: str) -> AgentPatch: + self._data["annotations"] = value + return self + + def description(self, value: str) -> AgentPatch: + self._data["description"] = value + return self + + def display_name(self, value: str) -> AgentPatch: + self._data["display_name"] = value + return self + + def labels(self, value: str) -> AgentPatch: + self._data["labels"] = value + return self + + def llm_max_tokens(self, value: int) -> AgentPatch: + self._data["llm_max_tokens"] = value + return self + + def llm_model(self, value: str) -> AgentPatch: + self._data["llm_model"] = value + return self + + def llm_temperature(self, value: float) -> AgentPatch: + self._data["llm_temperature"] = value + return self + + def name(self, value: str) -> AgentPatch: + self._data["name"] = value + return self + def prompt(self, value: str) -> AgentPatch: self._data["prompt"] = value return self + def repo_url(self, value: str) -> AgentPatch: + self._data["repo_url"] = value + return self + def to_dict(self) -> dict: return dict(self._data) diff --git a/components/ambient-sdk/python-sdk/ambient_platform/client.py b/components/ambient-sdk/python-sdk/ambient_platform/client.py index 39dd3f037b..fe12f1f85c 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/client.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/client.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: 9a8e623edcfae33acf56edf974d1859a127c22915d4831cb786daba2b398ca37 -# Generated: 2026-03-21T21:30:53Z +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z from __future__ import annotations @@ -16,12 +16,14 @@ from ._base import APIError, ListOptions if TYPE_CHECKING: + from ._agent_api import AgentAPI + from ._credential_api import CredentialAPI from ._inbox_message_api import InboxMessageAPI from ._project_api import ProjectAPI - from ._agent_api import AgentAPI from ._project_settings_api import ProjectSettingsAPI from ._role_api import RoleAPI from ._role_binding_api import RoleBindingAPI + from ._scheduled_session_api import ScheduledSessionAPI from ._session_api import SessionAPI from ._session_message_api import SessionMessageAPI from ._user_api import UserAPI @@ -58,12 +60,14 @@ def __init__( ) # Initialize API interfaces + self._agent_api: Optional[AgentAPI] = None + self._credential_api: Optional[CredentialAPI] = None self._inbox_message_api: Optional[InboxMessageAPI] = None self._project_api: Optional[ProjectAPI] = None - self._agent_api: Optional[AgentAPI] = None self._project_settings_api: Optional[ProjectSettingsAPI] = None self._role_api: Optional[RoleAPI] = None self._role_binding_api: Optional[RoleBindingAPI] = None + self._scheduled_session_api: Optional[ScheduledSessionAPI] = None self._session_api: Optional[SessionAPI] = None self._session_message_api: Optional[SessionMessageAPI] = None self._user_api: Optional[UserAPI] = None @@ -180,6 +184,20 @@ def __enter__(self) -> AmbientClient: def __exit__(self, *args: Any) -> None: self.close() @property + def agents(self) -> AgentAPI: + """Get the Agent API interface.""" + if self._agent_api is None: + from ._agent_api import AgentAPI + self._agent_api = AgentAPI(self) + return self._agent_api + @property + def credentials(self) -> CredentialAPI: + """Get the Credential API interface.""" + if self._credential_api is None: + from ._credential_api import CredentialAPI + self._credential_api = CredentialAPI(self) + return self._credential_api + @property def inbox_messages(self) -> InboxMessageAPI: """Get the InboxMessage API interface.""" if self._inbox_message_api is None: @@ -194,13 +212,6 @@ def projects(self) -> ProjectAPI: self._project_api = ProjectAPI(self) return self._project_api @property - def agents(self) -> AgentAPI: - """Get the Agent API interface.""" - if self._agent_api is None: - from ._agent_api import AgentAPI - self._agent_api = AgentAPI(self) - return self._agent_api - @property def project_settings(self) -> ProjectSettingsAPI: """Get the ProjectSettings API interface.""" if self._project_settings_api is None: @@ -222,6 +233,13 @@ def role_bindings(self) -> RoleBindingAPI: self._role_binding_api = RoleBindingAPI(self) return self._role_binding_api @property + def scheduled_sessions(self) -> ScheduledSessionAPI: + """Get the ScheduledSession API interface.""" + if self._scheduled_session_api is None: + from ._scheduled_session_api import ScheduledSessionAPI + self._scheduled_session_api = ScheduledSessionAPI(self) + return self._scheduled_session_api + @property def sessions(self) -> SessionAPI: """Get the Session API interface.""" if self._session_api is None: diff --git a/components/ambient-sdk/python-sdk/ambient_platform/credential.py b/components/ambient-sdk/python-sdk/ambient_platform/credential.py new file mode 100644 index 0000000000..3b7f75a1c8 --- /dev/null +++ b/components/ambient-sdk/python-sdk/ambient_platform/credential.py @@ -0,0 +1,164 @@ +# Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. +# Source: ../../ambient-api-server/openapi/openapi.yaml +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z + +from __future__ import annotations + +from dataclasses import dataclass +from datetime import datetime +from typing import Any, Optional + +from ._base import ListMeta, _parse_datetime + + +@dataclass(frozen=True) +class Credential: + id: str = "" + kind: str = "" + href: str = "" + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None + annotations: str = "" + description: str = "" + email: str = "" + labels: str = "" + name: str = "" + project_id: str = "" + provider: str = "" + token: str = "" + url: str = "" + + @classmethod + def from_dict(cls, data: dict) -> Credential: + return cls( + id=data.get("id", ""), + kind=data.get("kind", ""), + href=data.get("href", ""), + created_at=_parse_datetime(data.get("created_at")), + updated_at=_parse_datetime(data.get("updated_at")), + annotations=data.get("annotations", ""), + description=data.get("description", ""), + email=data.get("email", ""), + labels=data.get("labels", ""), + name=data.get("name", ""), + project_id=data.get("project_id", ""), + provider=data.get("provider", ""), + token=data.get("token", ""), + url=data.get("url", ""), + ) + + @classmethod + def builder(cls) -> CredentialBuilder: + return CredentialBuilder() + + +@dataclass(frozen=True) +class CredentialList: + kind: str = "" + page: int = 0 + size: int = 0 + total: int = 0 + items: list[Credential] = () + + @classmethod + def from_dict(cls, data: dict) -> CredentialList: + return cls( + kind=data.get("kind", ""), + page=data.get("page", 0), + size=data.get("size", 0), + total=data.get("total", 0), + items=[Credential.from_dict(item) for item in data.get("items", [])], + ) + + +class CredentialBuilder: + def __init__(self) -> None: + self._data: dict[str, Any] = {} + + + def annotations(self, value: str) -> CredentialBuilder: + self._data["annotations"] = value + return self + + def description(self, value: str) -> CredentialBuilder: + self._data["description"] = value + return self + + def email(self, value: str) -> CredentialBuilder: + self._data["email"] = value + return self + + def labels(self, value: str) -> CredentialBuilder: + self._data["labels"] = value + return self + + def name(self, value: str) -> CredentialBuilder: + self._data["name"] = value + return self + + def project_id(self, value: str) -> CredentialBuilder: + self._data["project_id"] = value + return self + + def provider(self, value: str) -> CredentialBuilder: + self._data["provider"] = value + return self + + def token(self, value: str) -> CredentialBuilder: + self._data["token"] = value + return self + + def url(self, value: str) -> CredentialBuilder: + self._data["url"] = value + return self + + def build(self) -> dict: + if "name" not in self._data: + raise ValueError("name is required") + if "project_id" not in self._data: + raise ValueError("project_id is required") + if "provider" not in self._data: + raise ValueError("provider is required") + return dict(self._data) + + +class CredentialPatch: + def __init__(self) -> None: + self._data: dict[str, Any] = {} + + + def annotations(self, value: str) -> CredentialPatch: + self._data["annotations"] = value + return self + + def description(self, value: str) -> CredentialPatch: + self._data["description"] = value + return self + + def email(self, value: str) -> CredentialPatch: + self._data["email"] = value + return self + + def labels(self, value: str) -> CredentialPatch: + self._data["labels"] = value + return self + + def name(self, value: str) -> CredentialPatch: + self._data["name"] = value + return self + + def provider(self, value: str) -> CredentialPatch: + self._data["provider"] = value + return self + + def token(self, value: str) -> CredentialPatch: + self._data["token"] = value + return self + + def url(self, value: str) -> CredentialPatch: + self._data["url"] = value + return self + + def to_dict(self) -> dict: + return dict(self._data) diff --git a/components/ambient-sdk/python-sdk/ambient_platform/inbox_message.py b/components/ambient-sdk/python-sdk/ambient_platform/inbox_message.py index a6bdf6cced..73893331d3 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/inbox_message.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/inbox_message.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -# Generated: 2026-04-18T21:11:11Z +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z from __future__ import annotations diff --git a/components/ambient-sdk/python-sdk/ambient_platform/project.py b/components/ambient-sdk/python-sdk/ambient_platform/project.py index b8b6a30531..04716154a0 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/project.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/project.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: 9a8e623edcfae33acf56edf974d1859a127c22915d4831cb786daba2b398ca37 -# Generated: 2026-03-21T21:30:53Z +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z from __future__ import annotations @@ -21,6 +21,7 @@ class Project: updated_at: Optional[datetime] = None annotations: str = "" description: str = "" + display_name: str = "" labels: str = "" name: str = "" prompt: str = "" @@ -36,6 +37,7 @@ def from_dict(cls, data: dict) -> Project: updated_at=_parse_datetime(data.get("updated_at")), annotations=data.get("annotations", ""), description=data.get("description", ""), + display_name=data.get("display_name", ""), labels=data.get("labels", ""), name=data.get("name", ""), prompt=data.get("prompt", ""), @@ -79,6 +81,10 @@ def description(self, value: str) -> ProjectBuilder: self._data["description"] = value return self + def display_name(self, value: str) -> ProjectBuilder: + self._data["display_name"] = value + return self + def labels(self, value: str) -> ProjectBuilder: self._data["labels"] = value return self @@ -114,6 +120,10 @@ def description(self, value: str) -> ProjectPatch: self._data["description"] = value return self + def display_name(self, value: str) -> ProjectPatch: + self._data["display_name"] = value + return self + def labels(self, value: str) -> ProjectPatch: self._data["labels"] = value return self diff --git a/components/ambient-sdk/python-sdk/ambient_platform/project_settings.py b/components/ambient-sdk/python-sdk/ambient_platform/project_settings.py index 2e405b190d..e68fbdd330 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/project_settings.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/project_settings.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -# Generated: 2026-04-18T21:11:11Z +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z from __future__ import annotations diff --git a/components/ambient-sdk/python-sdk/ambient_platform/role.py b/components/ambient-sdk/python-sdk/ambient_platform/role.py index f258bd4ab1..8cfb241304 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/role.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/role.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -# Generated: 2026-04-18T21:11:11Z +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z from __future__ import annotations diff --git a/components/ambient-sdk/python-sdk/ambient_platform/role_binding.py b/components/ambient-sdk/python-sdk/ambient_platform/role_binding.py index 23b5fdc8bf..a76ae483d5 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/role_binding.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/role_binding.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -# Generated: 2026-04-18T21:11:11Z +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z from __future__ import annotations diff --git a/components/ambient-sdk/python-sdk/ambient_platform/scheduled_session.py b/components/ambient-sdk/python-sdk/ambient_platform/scheduled_session.py new file mode 100644 index 0000000000..28a2b976a4 --- /dev/null +++ b/components/ambient-sdk/python-sdk/ambient_platform/scheduled_session.py @@ -0,0 +1,206 @@ +# Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. +# Source: ../../ambient-api-server/openapi/openapi.yaml +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z + +from __future__ import annotations + +from dataclasses import dataclass +from datetime import datetime +from typing import Any, Optional + +from ._base import ListMeta, _parse_datetime + + +@dataclass(frozen=True) +class ScheduledSession: + id: str = "" + kind: str = "" + href: str = "" + created_at: Optional[datetime] = None + updated_at: Optional[datetime] = None + agent_id: str = "" + description: str = "" + enabled: bool = False + inactivity_timeout: int = 0 + last_run_at: Optional[datetime] = None + name: str = "" + next_run_at: Optional[datetime] = None + project_id: str = "" + runner_type: str = "" + schedule: str = "" + session_prompt: str = "" + stop_on_run_finished: bool = False + timeout: int = 0 + timezone: str = "" + + @classmethod + def from_dict(cls, data: dict) -> ScheduledSession: + return cls( + id=data.get("id", ""), + kind=data.get("kind", ""), + href=data.get("href", ""), + created_at=_parse_datetime(data.get("created_at")), + updated_at=_parse_datetime(data.get("updated_at")), + agent_id=data.get("agent_id", ""), + description=data.get("description", ""), + enabled=data.get("enabled", False), + inactivity_timeout=data.get("inactivity_timeout", 0), + last_run_at=_parse_datetime(data.get("last_run_at")), + name=data.get("name", ""), + next_run_at=_parse_datetime(data.get("next_run_at")), + project_id=data.get("project_id", ""), + runner_type=data.get("runner_type", ""), + schedule=data.get("schedule", ""), + session_prompt=data.get("session_prompt", ""), + stop_on_run_finished=data.get("stop_on_run_finished", False), + timeout=data.get("timeout", 0), + timezone=data.get("timezone", ""), + ) + + @classmethod + def builder(cls) -> ScheduledSessionBuilder: + return ScheduledSessionBuilder() + + +@dataclass(frozen=True) +class ScheduledSessionList: + kind: str = "" + page: int = 0 + size: int = 0 + total: int = 0 + items: list[ScheduledSession] = () + + @classmethod + def from_dict(cls, data: dict) -> ScheduledSessionList: + return cls( + kind=data.get("kind", ""), + page=data.get("page", 0), + size=data.get("size", 0), + total=data.get("total", 0), + items=[ScheduledSession.from_dict(item) for item in data.get("items", [])], + ) + + +class ScheduledSessionBuilder: + def __init__(self) -> None: + self._data: dict[str, Any] = {} + + + def agent_id(self, value: str) -> ScheduledSessionBuilder: + self._data["agent_id"] = value + return self + + def description(self, value: str) -> ScheduledSessionBuilder: + self._data["description"] = value + return self + + def enabled(self, value: bool) -> ScheduledSessionBuilder: + self._data["enabled"] = value + return self + + def inactivity_timeout(self, value: int) -> ScheduledSessionBuilder: + self._data["inactivity_timeout"] = value + return self + + def last_run_at(self, value: Optional[datetime]) -> ScheduledSessionBuilder: + self._data["last_run_at"] = value + return self + + def name(self, value: str) -> ScheduledSessionBuilder: + self._data["name"] = value + return self + + def next_run_at(self, value: Optional[datetime]) -> ScheduledSessionBuilder: + self._data["next_run_at"] = value + return self + + def project_id(self, value: str) -> ScheduledSessionBuilder: + self._data["project_id"] = value + return self + + def runner_type(self, value: str) -> ScheduledSessionBuilder: + self._data["runner_type"] = value + return self + + def schedule(self, value: str) -> ScheduledSessionBuilder: + self._data["schedule"] = value + return self + + def session_prompt(self, value: str) -> ScheduledSessionBuilder: + self._data["session_prompt"] = value + return self + + def stop_on_run_finished(self, value: bool) -> ScheduledSessionBuilder: + self._data["stop_on_run_finished"] = value + return self + + def timeout(self, value: int) -> ScheduledSessionBuilder: + self._data["timeout"] = value + return self + + def timezone(self, value: str) -> ScheduledSessionBuilder: + self._data["timezone"] = value + return self + + def build(self) -> dict: + if "name" not in self._data: + raise ValueError("name is required") + if "project_id" not in self._data: + raise ValueError("project_id is required") + if "schedule" not in self._data: + raise ValueError("schedule is required") + return dict(self._data) + + +class ScheduledSessionPatch: + def __init__(self) -> None: + self._data: dict[str, Any] = {} + + + def agent_id(self, value: str) -> ScheduledSessionPatch: + self._data["agent_id"] = value + return self + + def description(self, value: str) -> ScheduledSessionPatch: + self._data["description"] = value + return self + + def enabled(self, value: bool) -> ScheduledSessionPatch: + self._data["enabled"] = value + return self + + def inactivity_timeout(self, value: int) -> ScheduledSessionPatch: + self._data["inactivity_timeout"] = value + return self + + def name(self, value: str) -> ScheduledSessionPatch: + self._data["name"] = value + return self + + def runner_type(self, value: str) -> ScheduledSessionPatch: + self._data["runner_type"] = value + return self + + def schedule(self, value: str) -> ScheduledSessionPatch: + self._data["schedule"] = value + return self + + def session_prompt(self, value: str) -> ScheduledSessionPatch: + self._data["session_prompt"] = value + return self + + def stop_on_run_finished(self, value: bool) -> ScheduledSessionPatch: + self._data["stop_on_run_finished"] = value + return self + + def timeout(self, value: int) -> ScheduledSessionPatch: + self._data["timeout"] = value + return self + + def timezone(self, value: str) -> ScheduledSessionPatch: + self._data["timezone"] = value + return self + + def to_dict(self) -> dict: + return dict(self._data) diff --git a/components/ambient-sdk/python-sdk/ambient_platform/session.py b/components/ambient-sdk/python-sdk/ambient_platform/session.py index ef7b62db5a..6e75f69e72 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/session.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/session.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -# Generated: 2026-04-18T21:11:11Z +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z from __future__ import annotations diff --git a/components/ambient-sdk/python-sdk/ambient_platform/session_message.py b/components/ambient-sdk/python-sdk/ambient_platform/session_message.py index 383cbd6344..03b54e2d5d 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/session_message.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/session_message.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -# Generated: 2026-04-18T21:11:11Z +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z from __future__ import annotations diff --git a/components/ambient-sdk/python-sdk/ambient_platform/user.py b/components/ambient-sdk/python-sdk/ambient_platform/user.py index da72aaecc5..891c55e0a1 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/user.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/user.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -# Generated: 2026-04-18T21:11:11Z +# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +# Generated: 2026-05-05T15:33:32Z from __future__ import annotations diff --git a/components/ambient-sdk/ts-sdk/src/agent.ts b/components/ambient-sdk/ts-sdk/src/agent.ts index a4788819dd..eb8801c6e4 100644 --- a/components/ambient-sdk/ts-sdk/src/agent.ts +++ b/components/ambient-sdk/ts-sdk/src/agent.ts @@ -1,19 +1,29 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 404b5671af96841f4a876b6192afc6358b4fb8e082ca2b6da499efcf3f72c781 -// Generated: 2026-03-20T16:48:23Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z import type { ObjectReference, ListMeta } from './base'; export type Agent = ObjectReference & { - annotations?: string; - current_session_id?: string; - labels?: string; + annotations: string; + bot_account_name: string; + current_session_id: string; + description: string; + display_name: string; + environment_variables: string; + labels: string; + llm_max_tokens: number; + llm_model: string; + llm_temperature: number; name: string; - owner_user_id?: string; - project_id?: string; - prompt?: string; - version?: number; + owner_user_id: string; + parent_agent_id: string; + project_id: string; + prompt: string; + repo_url: string; + resource_overrides: string; + workflow_id: string; }; export type AgentList = ListMeta & { @@ -22,33 +32,86 @@ export type AgentList = ListMeta & { export type AgentCreateRequest = { annotations?: string; + bot_account_name?: string; + description?: string; + display_name?: string; + environment_variables?: string; labels?: string; + llm_max_tokens?: number; + llm_model?: string; + llm_temperature?: number; name: string; owner_user_id?: string; - project_id?: string; + parent_agent_id?: string; + project_id: string; prompt?: string; + repo_url?: string; + resource_overrides?: string; + workflow_id?: string; }; export type AgentPatchRequest = { annotations?: string; + description?: string; + display_name?: string; labels?: string; + llm_max_tokens?: number; + llm_model?: string; + llm_temperature?: number; name?: string; prompt?: string; + repo_url?: string; }; export class AgentBuilder { private data: Record = {}; + annotations(value: string): this { this.data['annotations'] = value; return this; } + botAccountName(value: string): this { + this.data['bot_account_name'] = value; + return this; + } + + description(value: string): this { + this.data['description'] = value; + return this; + } + + displayName(value: string): this { + this.data['display_name'] = value; + return this; + } + + environmentVariables(value: string): this { + this.data['environment_variables'] = value; + return this; + } + labels(value: string): this { this.data['labels'] = value; return this; } + llmMaxTokens(value: number): this { + this.data['llm_max_tokens'] = value; + return this; + } + + llmModel(value: string): this { + this.data['llm_model'] = value; + return this; + } + + llmTemperature(value: number): this { + this.data['llm_temperature'] = value; + return this; + } + name(value: string): this { this.data['name'] = value; return this; @@ -59,6 +122,11 @@ export class AgentBuilder { return this; } + parentAgentId(value: string): this { + this.data['parent_agent_id'] = value; + return this; + } + projectId(value: string): this { this.data['project_id'] = value; return this; @@ -69,10 +137,28 @@ export class AgentBuilder { return this; } + repoUrl(value: string): this { + this.data['repo_url'] = value; + return this; + } + + resourceOverrides(value: string): this { + this.data['resource_overrides'] = value; + return this; + } + + workflowId(value: string): this { + this.data['workflow_id'] = value; + return this; + } + build(): AgentCreateRequest { if (!this.data['name']) { throw new Error('name is required'); } + if (!this.data['project_id']) { + throw new Error('project_id is required'); + } return this.data as AgentCreateRequest; } } @@ -80,16 +166,42 @@ export class AgentBuilder { export class AgentPatchBuilder { private data: Record = {}; + annotations(value: string): this { this.data['annotations'] = value; return this; } + description(value: string): this { + this.data['description'] = value; + return this; + } + + displayName(value: string): this { + this.data['display_name'] = value; + return this; + } + labels(value: string): this { this.data['labels'] = value; return this; } + llmMaxTokens(value: number): this { + this.data['llm_max_tokens'] = value; + return this; + } + + llmModel(value: string): this { + this.data['llm_model'] = value; + return this; + } + + llmTemperature(value: number): this { + this.data['llm_temperature'] = value; + return this; + } + name(value: string): this { this.data['name'] = value; return this; @@ -100,6 +212,11 @@ export class AgentPatchBuilder { return this; } + repoUrl(value: string): this { + this.data['repo_url'] = value; + return this; + } + build(): AgentPatchRequest { return this.data as AgentPatchRequest; } diff --git a/components/ambient-sdk/ts-sdk/src/agent_api.ts b/components/ambient-sdk/ts-sdk/src/agent_api.ts index e90a05cece..6a1a7da988 100644 --- a/components/ambient-sdk/ts-sdk/src/agent_api.ts +++ b/components/ambient-sdk/ts-sdk/src/agent_api.ts @@ -1,42 +1,44 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 404b5671af96841f4a876b6192afc6358b4fb8e082ca2b6da499efcf3f72c781 -// Generated: 2026-03-20T16:48:23Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z -import type { AmbientClientConfig, ListOptions, RequestOptions, ListMeta } from './base'; +import type { AmbientClientConfig, ListOptions, RequestOptions } from './base'; import { ambientFetch, buildQueryString } from './base'; import type { Agent, AgentList, AgentCreateRequest, AgentPatchRequest } from './agent'; -import type { Session } from './session'; - -export type AgentSessionList = ListMeta & { items: Session[] }; - -export type StartRequest = { - prompt?: string; -}; - -export type StartResponse = { - session?: Session; - starting_prompt?: string; -}; export class AgentAPI { constructor(private readonly config: AmbientClientConfig) {} + private basePath(): string { + if (!this.config.project) { + throw new Error('project is required for Agent operations'); + } + return '/projects/{id}/agents'.replace('{id}', encodeURIComponent(this.config.project)); + } + async create(data: AgentCreateRequest, opts?: RequestOptions): Promise { - return ambientFetch(this.config, 'POST', '/agents', data, opts); + return ambientFetch(this.config, 'POST', this.basePath(), data, opts); } async get(id: string, opts?: RequestOptions): Promise { - return ambientFetch(this.config, 'GET', `/agents/${id}`, undefined, opts); + return ambientFetch(this.config, 'GET', `${this.basePath()}/${id}`, undefined, opts); } async list(listOpts?: ListOptions, opts?: RequestOptions): Promise { const qs = buildQueryString(listOpts); - return ambientFetch(this.config, 'GET', `/agents${qs}`, undefined, opts); + return ambientFetch(this.config, 'GET', `${this.basePath()}${qs}`, undefined, opts); } - async update(id: string, patch: AgentPatchRequest, opts?: RequestOptions): Promise { - return ambientFetch(this.config, 'PATCH', `/agents/${id}`, patch, opts); + return ambientFetch(this.config, 'PATCH', `${this.basePath()}/${id}`, patch, opts); + } + + async delete(id: string, opts?: RequestOptions): Promise { + return ambientFetch(this.config, 'DELETE', `${this.basePath()}/${id}`, undefined, opts); + } + + async start(id: string, opts?: RequestOptions): Promise { + return ambientFetch(this.config, 'POST', `${this.basePath()}/${id}/start`, undefined, opts); } async *listAll(size: number = 100, opts?: RequestOptions): AsyncGenerator { @@ -52,38 +54,4 @@ export class AgentAPI { page++; } } - - async listByProject(projectId: string, listOpts?: ListOptions, opts?: RequestOptions): Promise { - const qs = buildQueryString(listOpts); - return ambientFetch(this.config, 'GET', `/projects/${encodeURIComponent(projectId)}/agents${qs}`, undefined, opts); - } - - async getByProject(projectId: string, agentId: string, opts?: RequestOptions): Promise { - return ambientFetch(this.config, 'GET', `/projects/${encodeURIComponent(projectId)}/agents/${encodeURIComponent(agentId)}`, undefined, opts); - } - - async createInProject(projectId: string, data: AgentCreateRequest, opts?: RequestOptions): Promise { - return ambientFetch(this.config, 'POST', `/projects/${encodeURIComponent(projectId)}/agents`, data, opts); - } - - async updateInProject(projectId: string, agentId: string, patch: AgentPatchRequest, opts?: RequestOptions): Promise { - return ambientFetch(this.config, 'PATCH', `/projects/${encodeURIComponent(projectId)}/agents/${encodeURIComponent(agentId)}`, patch, opts); - } - - async deleteInProject(projectId: string, agentId: string, opts?: RequestOptions): Promise { - return ambientFetch(this.config, 'DELETE', `/projects/${encodeURIComponent(projectId)}/agents/${encodeURIComponent(agentId)}`, undefined, opts); - } - - async start(projectId: string, agentId: string, prompt?: string, opts?: RequestOptions): Promise { - return ambientFetch(this.config, 'POST', `/projects/${encodeURIComponent(projectId)}/agents/${encodeURIComponent(agentId)}/start`, { prompt }, opts); - } - - async getStartPreview(projectId: string, agentId: string, opts?: RequestOptions): Promise { - return ambientFetch(this.config, 'GET', `/projects/${encodeURIComponent(projectId)}/agents/${encodeURIComponent(agentId)}/start`, undefined, opts); - } - - async sessions(projectId: string, agentId: string, listOpts?: ListOptions, opts?: RequestOptions): Promise { - const qs = buildQueryString(listOpts); - return ambientFetch(this.config, 'GET', `/projects/${encodeURIComponent(projectId)}/agents/${encodeURIComponent(agentId)}/sessions${qs}`, undefined, opts); - } } diff --git a/components/ambient-sdk/ts-sdk/src/base.ts b/components/ambient-sdk/ts-sdk/src/base.ts index 5994cb43b6..0ec9a605e3 100644 --- a/components/ambient-sdk/ts-sdk/src/base.ts +++ b/components/ambient-sdk/ts-sdk/src/base.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 9a8e623edcfae33acf56edf974d1859a127c22915d4831cb786daba2b398ca37 -// Generated: 2026-03-21T21:30:53Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z export type ObjectReference = { id: string; @@ -70,7 +70,7 @@ export type RequestOptions = { export type AmbientClientConfig = { baseUrl: string; - token: string; + token?: string; project?: string; }; @@ -83,7 +83,7 @@ export async function ambientFetch( ): Promise { const url = `${config.baseUrl}/api/ambient/v1${path}`; const headers: Record = { - 'Authorization': `Bearer ${config.token}`, + ...(config.token ? { 'Authorization': `Bearer ${config.token}` } : {}), ...(config.project ? { 'X-Ambient-Project': config.project } : {}), }; if (body !== undefined) { diff --git a/components/ambient-sdk/ts-sdk/src/client.ts b/components/ambient-sdk/ts-sdk/src/client.ts index 941a077ea3..ee3b4c929a 100644 --- a/components/ambient-sdk/ts-sdk/src/client.ts +++ b/components/ambient-sdk/ts-sdk/src/client.ts @@ -1,15 +1,17 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 9a8e623edcfae33acf56edf974d1859a127c22915d4831cb786daba2b398ca37 -// Generated: 2026-03-21T21:30:53Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z import type { AmbientClientConfig } from './base'; +import { AgentAPI } from './agent_api'; +import { CredentialAPI } from './credential_api'; import { InboxMessageAPI } from './inbox_message_api'; import { ProjectAPI } from './project_api'; -import { AgentAPI } from './agent_api'; import { ProjectSettingsAPI } from './project_settings_api'; import { RoleAPI } from './role_api'; import { RoleBindingAPI } from './role_binding_api'; +import { ScheduledSessionAPI } from './scheduled_session_api'; import { SessionAPI } from './session_api'; import { SessionMessageAPI } from './session_message_api'; import { UserAPI } from './user_api'; @@ -18,12 +20,14 @@ import { UserAPI } from './user_api'; export class AmbientClient { private readonly config: AmbientClientConfig; + readonly agents: AgentAPI; + readonly credentials: CredentialAPI; readonly inboxMessages: InboxMessageAPI; readonly projects: ProjectAPI; - readonly agents: AgentAPI; readonly projectSettings: ProjectSettingsAPI; readonly roles: RoleAPI; readonly roleBindings: RoleBindingAPI; + readonly scheduledSessions: ScheduledSessionAPI; readonly sessions: SessionAPI; readonly sessionMessages: SessionMessageAPI; readonly users: UserAPI; @@ -32,22 +36,24 @@ export class AmbientClient { if (!config.baseUrl) { throw new Error('baseUrl is required'); } - if (!config.token) { - throw new Error('token is required'); - } - if (config.token.length < 20) { - throw new Error('token is too short (minimum 20 characters)'); - } - if (config.token === 'YOUR_TOKEN_HERE' || config.token === 'PLACEHOLDER_TOKEN') { - throw new Error('placeholder token is not allowed'); + if (config.token) { + if (config.token.length < 20) { + throw new Error('token is too short (minimum 20 characters)'); + } + if (config.token === 'YOUR_TOKEN_HERE' || config.token === 'PLACEHOLDER_TOKEN') { + throw new Error('placeholder token is not allowed'); + } } if (config.project && config.project.length > 63) { throw new Error('project name cannot exceed 63 characters'); } - const url = new URL(config.baseUrl); - if (url.protocol !== 'http:' && url.protocol !== 'https:') { - throw new Error('only HTTP and HTTPS schemes are supported'); + // Skip URL parsing for relative paths (e.g. "/api/proxy") + if (!config.baseUrl.startsWith('/')) { + const url = new URL(config.baseUrl); + if (url.protocol !== 'http:' && url.protocol !== 'https:') { + throw new Error('only HTTP and HTTPS schemes are supported'); + } } this.config = { @@ -55,12 +61,14 @@ export class AmbientClient { baseUrl: config.baseUrl.replace(/\/+$/, ''), }; + this.agents = new AgentAPI(this.config); + this.credentials = new CredentialAPI(this.config); this.inboxMessages = new InboxMessageAPI(this.config); this.projects = new ProjectAPI(this.config); - this.agents = new AgentAPI(this.config); this.projectSettings = new ProjectSettingsAPI(this.config); this.roles = new RoleAPI(this.config); this.roleBindings = new RoleBindingAPI(this.config); + this.scheduledSessions = new ScheduledSessionAPI(this.config); this.sessions = new SessionAPI(this.config); this.sessionMessages = new SessionMessageAPI(this.config); this.users = new UserAPI(this.config); @@ -74,6 +82,7 @@ export class AmbientClient { if (!token) { throw new Error('AMBIENT_TOKEN environment variable is required'); } + return new AmbientClient({ baseUrl, token, ...(project ? { project } : {}) }); } } diff --git a/components/ambient-sdk/ts-sdk/src/credential.ts b/components/ambient-sdk/ts-sdk/src/credential.ts new file mode 100644 index 0000000000..c0a30f80db --- /dev/null +++ b/components/ambient-sdk/ts-sdk/src/credential.ts @@ -0,0 +1,157 @@ +// Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. +// Source: ../../ambient-api-server/openapi/openapi.yaml +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z + +import type { ObjectReference, ListMeta } from './base'; + +export type Credential = ObjectReference & { + annotations: string; + description: string; + email: string; + labels: string; + name: string; + project_id: string; + provider: string; + token: string; + url: string; +}; + +export type CredentialList = ListMeta & { + items: Credential[]; +}; + +export type CredentialCreateRequest = { + annotations?: string; + description?: string; + email?: string; + labels?: string; + name: string; + project_id: string; + provider: string; + token?: string; + url?: string; +}; + +export type CredentialPatchRequest = { + annotations?: string; + description?: string; + email?: string; + labels?: string; + name?: string; + provider?: string; + token?: string; + url?: string; +}; + +export class CredentialBuilder { + private data: Record = {}; + + + annotations(value: string): this { + this.data['annotations'] = value; + return this; + } + + description(value: string): this { + this.data['description'] = value; + return this; + } + + email(value: string): this { + this.data['email'] = value; + return this; + } + + labels(value: string): this { + this.data['labels'] = value; + return this; + } + + name(value: string): this { + this.data['name'] = value; + return this; + } + + projectId(value: string): this { + this.data['project_id'] = value; + return this; + } + + provider(value: string): this { + this.data['provider'] = value; + return this; + } + + token(value: string): this { + this.data['token'] = value; + return this; + } + + url(value: string): this { + this.data['url'] = value; + return this; + } + + build(): CredentialCreateRequest { + if (!this.data['name']) { + throw new Error('name is required'); + } + if (!this.data['project_id']) { + throw new Error('project_id is required'); + } + if (!this.data['provider']) { + throw new Error('provider is required'); + } + return this.data as CredentialCreateRequest; + } +} + +export class CredentialPatchBuilder { + private data: Record = {}; + + + annotations(value: string): this { + this.data['annotations'] = value; + return this; + } + + description(value: string): this { + this.data['description'] = value; + return this; + } + + email(value: string): this { + this.data['email'] = value; + return this; + } + + labels(value: string): this { + this.data['labels'] = value; + return this; + } + + name(value: string): this { + this.data['name'] = value; + return this; + } + + provider(value: string): this { + this.data['provider'] = value; + return this; + } + + token(value: string): this { + this.data['token'] = value; + return this; + } + + url(value: string): this { + this.data['url'] = value; + return this; + } + + build(): CredentialPatchRequest { + return this.data as CredentialPatchRequest; + } +} diff --git a/components/ambient-sdk/ts-sdk/src/credential_api.ts b/components/ambient-sdk/ts-sdk/src/credential_api.ts new file mode 100644 index 0000000000..e79c0c16fa --- /dev/null +++ b/components/ambient-sdk/ts-sdk/src/credential_api.ts @@ -0,0 +1,53 @@ +// Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. +// Source: ../../ambient-api-server/openapi/openapi.yaml +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z + +import type { AmbientClientConfig, ListOptions, RequestOptions } from './base'; +import { ambientFetch, buildQueryString } from './base'; +import type { Credential, CredentialList, CredentialCreateRequest, CredentialPatchRequest } from './credential'; + +export class CredentialAPI { + constructor(private readonly config: AmbientClientConfig) {} + private basePath(): string { + if (!this.config.project) { + throw new Error('project is required for Credential operations'); + } + return '/projects/{id}/credentials'.replace('{id}', encodeURIComponent(this.config.project)); + } + + + async create(data: CredentialCreateRequest, opts?: RequestOptions): Promise { + return ambientFetch(this.config, 'POST', this.basePath(), data, opts); + } + + async get(id: string, opts?: RequestOptions): Promise { + return ambientFetch(this.config, 'GET', `${this.basePath()}/${id}`, undefined, opts); + } + + async list(listOpts?: ListOptions, opts?: RequestOptions): Promise { + const qs = buildQueryString(listOpts); + return ambientFetch(this.config, 'GET', `${this.basePath()}${qs}`, undefined, opts); + } + async update(id: string, patch: CredentialPatchRequest, opts?: RequestOptions): Promise { + return ambientFetch(this.config, 'PATCH', `${this.basePath()}/${id}`, patch, opts); + } + + async delete(id: string, opts?: RequestOptions): Promise { + return ambientFetch(this.config, 'DELETE', `${this.basePath()}/${id}`, undefined, opts); + } + + async *listAll(size: number = 100, opts?: RequestOptions): AsyncGenerator { + let page = 1; + while (true) { + const result = await this.list({ page, size }, opts); + for (const item of result.items) { + yield item; + } + if (page * size >= result.total) { + break; + } + page++; + } + } +} diff --git a/components/ambient-sdk/ts-sdk/src/inbox_message.ts b/components/ambient-sdk/ts-sdk/src/inbox_message.ts index 59a1199482..8705574522 100644 --- a/components/ambient-sdk/ts-sdk/src/inbox_message.ts +++ b/components/ambient-sdk/ts-sdk/src/inbox_message.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z import type { ObjectReference, ListMeta } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/inbox_message_api.ts b/components/ambient-sdk/ts-sdk/src/inbox_message_api.ts index dce744c326..5b7af1a9f8 100644 --- a/components/ambient-sdk/ts-sdk/src/inbox_message_api.ts +++ b/components/ambient-sdk/ts-sdk/src/inbox_message_api.ts @@ -1,26 +1,53 @@ -import type { AmbientClientConfig, ListOptions, RequestOptions, ListMeta } from './base'; -import { ambientFetch, buildQueryString } from './base'; -import type { InboxMessage, InboxMessageCreateRequest } from './inbox_message'; +// Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. +// Source: ../../ambient-api-server/openapi/openapi.yaml +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z -export type InboxMessageList = ListMeta & { items: InboxMessage[] }; +import type { AmbientClientConfig, ListOptions, RequestOptions } from './base'; +import { ambientFetch, buildQueryString } from './base'; +import type { InboxMessage, InboxMessageList, InboxMessageCreateRequest, InboxMessagePatchRequest } from './inbox_message'; export class InboxMessageAPI { constructor(private readonly config: AmbientClientConfig) {} + private basePath(): string { + if (!this.config.project) { + throw new Error('project is required for InboxMessage operations'); + } + return '/projects/{id}/agents/{agent_id}/inbox'.replace('{id}', encodeURIComponent(this.config.project)); + } + - async send(projectId: string, agentId: string, data: InboxMessageCreateRequest, opts?: RequestOptions): Promise { - return ambientFetch(this.config, 'POST', `/projects/${encodeURIComponent(projectId)}/agents/${encodeURIComponent(agentId)}/inbox`, data, opts); + async create(data: InboxMessageCreateRequest, opts?: RequestOptions): Promise { + return ambientFetch(this.config, 'POST', this.basePath(), data, opts); } - async listByAgent(projectId: string, agentId: string, listOpts?: ListOptions, opts?: RequestOptions): Promise { + async get(id: string, opts?: RequestOptions): Promise { + return ambientFetch(this.config, 'GET', `${this.basePath()}/${id}`, undefined, opts); + } + + async list(listOpts?: ListOptions, opts?: RequestOptions): Promise { const qs = buildQueryString(listOpts); - return ambientFetch(this.config, 'GET', `/projects/${encodeURIComponent(projectId)}/agents/${encodeURIComponent(agentId)}/inbox${qs}`, undefined, opts); + return ambientFetch(this.config, 'GET', `${this.basePath()}${qs}`, undefined, opts); + } + async update(id: string, patch: InboxMessagePatchRequest, opts?: RequestOptions): Promise { + return ambientFetch(this.config, 'PATCH', `${this.basePath()}/${id}`, patch, opts); } - async markRead(projectId: string, agentId: string, msgId: string, opts?: RequestOptions): Promise { - return ambientFetch(this.config, 'PATCH', `/projects/${encodeURIComponent(projectId)}/agents/${encodeURIComponent(agentId)}/inbox/${encodeURIComponent(msgId)}`, { read: true }, opts); + async delete(id: string, opts?: RequestOptions): Promise { + return ambientFetch(this.config, 'DELETE', `${this.basePath()}/${id}`, undefined, opts); } - async deleteMessage(projectId: string, agentId: string, msgId: string, opts?: RequestOptions): Promise { - return ambientFetch(this.config, 'DELETE', `/projects/${encodeURIComponent(projectId)}/agents/${encodeURIComponent(agentId)}/inbox/${encodeURIComponent(msgId)}`, undefined, opts); + async *listAll(size: number = 100, opts?: RequestOptions): AsyncGenerator { + let page = 1; + while (true) { + const result = await this.list({ page, size }, opts); + for (const item of result.items) { + yield item; + } + if (page * size >= result.total) { + break; + } + page++; + } } } diff --git a/components/ambient-sdk/ts-sdk/src/index.ts b/components/ambient-sdk/ts-sdk/src/index.ts index 73f97681df..034905b036 100644 --- a/components/ambient-sdk/ts-sdk/src/index.ts +++ b/components/ambient-sdk/ts-sdk/src/index.ts @@ -1,26 +1,28 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 9a8e623edcfae33acf56edf974d1859a127c22915d4831cb786daba2b398ca37 -// Generated: 2026-03-21T21:30:53Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z export { AmbientClient } from './client'; export type { AmbientClientConfig, ListOptions, RequestOptions, ObjectReference, ListMeta, APIError } from './base'; export { AmbientAPIError, buildQueryString } from './base'; -export type { InboxMessage, InboxMessageCreateRequest, InboxMessagePatchRequest } from './inbox_message'; +export type { Agent, AgentList, AgentCreateRequest, AgentPatchRequest } from './agent'; +export { AgentBuilder, AgentPatchBuilder } from './agent'; +export { AgentAPI } from './agent_api'; + +export type { Credential, CredentialList, CredentialCreateRequest, CredentialPatchRequest } from './credential'; +export { CredentialBuilder, CredentialPatchBuilder } from './credential'; +export { CredentialAPI } from './credential_api'; + +export type { InboxMessage, InboxMessageList, InboxMessageCreateRequest, InboxMessagePatchRequest } from './inbox_message'; export { InboxMessageBuilder, InboxMessagePatchBuilder } from './inbox_message'; export { InboxMessageAPI } from './inbox_message_api'; -export type { InboxMessageList } from './inbox_message_api'; export type { Project, ProjectList, ProjectCreateRequest, ProjectPatchRequest } from './project'; export { ProjectBuilder, ProjectPatchBuilder } from './project'; export { ProjectAPI } from './project_api'; -export type { Agent, AgentList, AgentCreateRequest, AgentPatchRequest } from './agent'; -export { AgentBuilder, AgentPatchBuilder } from './agent'; -export { AgentAPI } from './agent_api'; -export type { AgentSessionList, StartRequest, StartResponse } from './agent_api'; - export type { ProjectSettings, ProjectSettingsList, ProjectSettingsCreateRequest, ProjectSettingsPatchRequest } from './project_settings'; export { ProjectSettingsBuilder, ProjectSettingsPatchBuilder } from './project_settings'; export { ProjectSettingsAPI } from './project_settings_api'; @@ -33,6 +35,10 @@ export type { RoleBinding, RoleBindingList, RoleBindingCreateRequest, RoleBindin export { RoleBindingBuilder, RoleBindingPatchBuilder } from './role_binding'; export { RoleBindingAPI } from './role_binding_api'; +export type { ScheduledSession, ScheduledSessionList, ScheduledSessionCreateRequest, ScheduledSessionPatchRequest } from './scheduled_session'; +export { ScheduledSessionBuilder, ScheduledSessionPatchBuilder } from './scheduled_session'; +export { ScheduledSessionAPI } from './scheduled_session_api'; + export type { Session, SessionList, SessionCreateRequest, SessionPatchRequest, SessionStatusPatchRequest } from './session'; export { SessionBuilder, SessionPatchBuilder, SessionStatusPatchBuilder } from './session'; export { SessionAPI } from './session_api'; diff --git a/components/ambient-sdk/ts-sdk/src/project.ts b/components/ambient-sdk/ts-sdk/src/project.ts index 6a999a5832..251feeb9e7 100644 --- a/components/ambient-sdk/ts-sdk/src/project.ts +++ b/components/ambient-sdk/ts-sdk/src/project.ts @@ -1,13 +1,14 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 9a8e623edcfae33acf56edf974d1859a127c22915d4831cb786daba2b398ca37 -// Generated: 2026-03-21T21:30:53Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z import type { ObjectReference, ListMeta } from './base'; export type Project = ObjectReference & { annotations: string; description: string; + display_name: string; labels: string; name: string; prompt: string; @@ -21,6 +22,7 @@ export type ProjectList = ListMeta & { export type ProjectCreateRequest = { annotations?: string; description?: string; + display_name?: string; labels?: string; name: string; prompt?: string; @@ -30,6 +32,7 @@ export type ProjectCreateRequest = { export type ProjectPatchRequest = { annotations?: string; description?: string; + display_name?: string; labels?: string; name?: string; prompt?: string; @@ -50,6 +53,11 @@ export class ProjectBuilder { return this; } + displayName(value: string): this { + this.data['display_name'] = value; + return this; + } + labels(value: string): this { this.data['labels'] = value; return this; @@ -92,6 +100,11 @@ export class ProjectPatchBuilder { return this; } + displayName(value: string): this { + this.data['display_name'] = value; + return this; + } + labels(value: string): this { this.data['labels'] = value; return this; diff --git a/components/ambient-sdk/ts-sdk/src/project_api.ts b/components/ambient-sdk/ts-sdk/src/project_api.ts index 2fc1dc0fc1..75eee2f809 100644 --- a/components/ambient-sdk/ts-sdk/src/project_api.ts +++ b/components/ambient-sdk/ts-sdk/src/project_api.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z import type { AmbientClientConfig, ListOptions, RequestOptions } from './base'; import { ambientFetch, buildQueryString } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/project_settings.ts b/components/ambient-sdk/ts-sdk/src/project_settings.ts index d231fa40fb..dec3731304 100644 --- a/components/ambient-sdk/ts-sdk/src/project_settings.ts +++ b/components/ambient-sdk/ts-sdk/src/project_settings.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z import type { ObjectReference, ListMeta } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/project_settings_api.ts b/components/ambient-sdk/ts-sdk/src/project_settings_api.ts index 11cae53457..ee38368c5c 100644 --- a/components/ambient-sdk/ts-sdk/src/project_settings_api.ts +++ b/components/ambient-sdk/ts-sdk/src/project_settings_api.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z import type { AmbientClientConfig, ListOptions, RequestOptions } from './base'; import { ambientFetch, buildQueryString } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/role.ts b/components/ambient-sdk/ts-sdk/src/role.ts index b6952464a9..544f8dcd43 100644 --- a/components/ambient-sdk/ts-sdk/src/role.ts +++ b/components/ambient-sdk/ts-sdk/src/role.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z import type { ObjectReference, ListMeta } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/role_api.ts b/components/ambient-sdk/ts-sdk/src/role_api.ts index b5350904fa..ca423fdb9d 100644 --- a/components/ambient-sdk/ts-sdk/src/role_api.ts +++ b/components/ambient-sdk/ts-sdk/src/role_api.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 9a8e623edcfae33acf56edf974d1859a127c22915d4831cb786daba2b398ca37 -// Generated: 2026-03-21T21:30:53Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z import type { AmbientClientConfig, ListOptions, RequestOptions } from './base'; import { ambientFetch, buildQueryString } from './base'; @@ -26,6 +26,10 @@ export class RoleAPI { return ambientFetch(this.config, 'PATCH', `/roles/${id}`, patch, opts); } + async delete(id: string, opts?: RequestOptions): Promise { + return ambientFetch(this.config, 'DELETE', `/roles/${id}`, undefined, opts); + } + async *listAll(size: number = 100, opts?: RequestOptions): AsyncGenerator { let page = 1; while (true) { diff --git a/components/ambient-sdk/ts-sdk/src/role_binding.ts b/components/ambient-sdk/ts-sdk/src/role_binding.ts index 5dcc338161..da82558b82 100644 --- a/components/ambient-sdk/ts-sdk/src/role_binding.ts +++ b/components/ambient-sdk/ts-sdk/src/role_binding.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z import type { ObjectReference, ListMeta } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/role_binding_api.ts b/components/ambient-sdk/ts-sdk/src/role_binding_api.ts index 94261dcb82..df3a1b7c26 100644 --- a/components/ambient-sdk/ts-sdk/src/role_binding_api.ts +++ b/components/ambient-sdk/ts-sdk/src/role_binding_api.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 9a8e623edcfae33acf56edf974d1859a127c22915d4831cb786daba2b398ca37 -// Generated: 2026-03-21T21:30:53Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z import type { AmbientClientConfig, ListOptions, RequestOptions } from './base'; import { ambientFetch, buildQueryString } from './base'; @@ -26,6 +26,10 @@ export class RoleBindingAPI { return ambientFetch(this.config, 'PATCH', `/role_bindings/${id}`, patch, opts); } + async delete(id: string, opts?: RequestOptions): Promise { + return ambientFetch(this.config, 'DELETE', `/role_bindings/${id}`, undefined, opts); + } + async *listAll(size: number = 100, opts?: RequestOptions): AsyncGenerator { let page = 1; while (true) { diff --git a/components/ambient-sdk/ts-sdk/src/scheduled_session.ts b/components/ambient-sdk/ts-sdk/src/scheduled_session.ts new file mode 100644 index 0000000000..b790b75714 --- /dev/null +++ b/components/ambient-sdk/ts-sdk/src/scheduled_session.ts @@ -0,0 +1,210 @@ +// Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. +// Source: ../../ambient-api-server/openapi/openapi.yaml +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z + +import type { ObjectReference, ListMeta } from './base'; + +export type ScheduledSession = ObjectReference & { + agent_id: string; + description: string; + enabled: boolean; + inactivity_timeout: number; + last_run_at: string; + name: string; + next_run_at: string; + project_id: string; + runner_type: string; + schedule: string; + session_prompt: string; + stop_on_run_finished: boolean; + timeout: number; + timezone: string; +}; + +export type ScheduledSessionList = ListMeta & { + items: ScheduledSession[]; +}; + +export type ScheduledSessionCreateRequest = { + agent_id?: string; + description?: string; + enabled?: boolean; + inactivity_timeout?: number; + last_run_at?: string; + name: string; + next_run_at?: string; + project_id: string; + runner_type?: string; + schedule: string; + session_prompt?: string; + stop_on_run_finished?: boolean; + timeout?: number; + timezone?: string; +}; + +export type ScheduledSessionPatchRequest = { + agent_id?: string; + description?: string; + enabled?: boolean; + inactivity_timeout?: number; + name?: string; + runner_type?: string; + schedule?: string; + session_prompt?: string; + stop_on_run_finished?: boolean; + timeout?: number; + timezone?: string; +}; + +export class ScheduledSessionBuilder { + private data: Record = {}; + + + agentId(value: string): this { + this.data['agent_id'] = value; + return this; + } + + description(value: string): this { + this.data['description'] = value; + return this; + } + + enabled(value: boolean): this { + this.data['enabled'] = value; + return this; + } + + inactivityTimeout(value: number): this { + this.data['inactivity_timeout'] = value; + return this; + } + + lastRunAt(value: string): this { + this.data['last_run_at'] = value; + return this; + } + + name(value: string): this { + this.data['name'] = value; + return this; + } + + nextRunAt(value: string): this { + this.data['next_run_at'] = value; + return this; + } + + projectId(value: string): this { + this.data['project_id'] = value; + return this; + } + + runnerType(value: string): this { + this.data['runner_type'] = value; + return this; + } + + schedule(value: string): this { + this.data['schedule'] = value; + return this; + } + + sessionPrompt(value: string): this { + this.data['session_prompt'] = value; + return this; + } + + stopOnRunFinished(value: boolean): this { + this.data['stop_on_run_finished'] = value; + return this; + } + + timeout(value: number): this { + this.data['timeout'] = value; + return this; + } + + timezone(value: string): this { + this.data['timezone'] = value; + return this; + } + + build(): ScheduledSessionCreateRequest { + if (!this.data['name']) { + throw new Error('name is required'); + } + if (!this.data['project_id']) { + throw new Error('project_id is required'); + } + if (!this.data['schedule']) { + throw new Error('schedule is required'); + } + return this.data as ScheduledSessionCreateRequest; + } +} + +export class ScheduledSessionPatchBuilder { + private data: Record = {}; + + + agentId(value: string): this { + this.data['agent_id'] = value; + return this; + } + + description(value: string): this { + this.data['description'] = value; + return this; + } + + enabled(value: boolean): this { + this.data['enabled'] = value; + return this; + } + + inactivityTimeout(value: number): this { + this.data['inactivity_timeout'] = value; + return this; + } + + name(value: string): this { + this.data['name'] = value; + return this; + } + + runnerType(value: string): this { + this.data['runner_type'] = value; + return this; + } + + schedule(value: string): this { + this.data['schedule'] = value; + return this; + } + + sessionPrompt(value: string): this { + this.data['session_prompt'] = value; + return this; + } + + stopOnRunFinished(value: boolean): this { + this.data['stop_on_run_finished'] = value; + return this; + } + + timeout(value: number): this { + this.data['timeout'] = value; + return this; + } + + timezone(value: string): this { + this.data['timezone'] = value; + return this; + } + + build(): ScheduledSessionPatchRequest { + return this.data as ScheduledSessionPatchRequest; + } +} diff --git a/components/ambient-sdk/ts-sdk/src/scheduled_session_api.ts b/components/ambient-sdk/ts-sdk/src/scheduled_session_api.ts new file mode 100644 index 0000000000..2705978d18 --- /dev/null +++ b/components/ambient-sdk/ts-sdk/src/scheduled_session_api.ts @@ -0,0 +1,53 @@ +// Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. +// Source: ../../ambient-api-server/openapi/openapi.yaml +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z + +import type { AmbientClientConfig, ListOptions, RequestOptions } from './base'; +import { ambientFetch, buildQueryString } from './base'; +import type { ScheduledSession, ScheduledSessionList, ScheduledSessionCreateRequest, ScheduledSessionPatchRequest } from './scheduled_session'; + +export class ScheduledSessionAPI { + constructor(private readonly config: AmbientClientConfig) {} + private basePath(): string { + if (!this.config.project) { + throw new Error('project is required for ScheduledSession operations'); + } + return '/projects/{id}/scheduled-sessions'.replace('{id}', encodeURIComponent(this.config.project)); + } + + + async create(data: ScheduledSessionCreateRequest, opts?: RequestOptions): Promise { + return ambientFetch(this.config, 'POST', this.basePath(), data, opts); + } + + async get(id: string, opts?: RequestOptions): Promise { + return ambientFetch(this.config, 'GET', `${this.basePath()}/${id}`, undefined, opts); + } + + async list(listOpts?: ListOptions, opts?: RequestOptions): Promise { + const qs = buildQueryString(listOpts); + return ambientFetch(this.config, 'GET', `${this.basePath()}${qs}`, undefined, opts); + } + async update(id: string, patch: ScheduledSessionPatchRequest, opts?: RequestOptions): Promise { + return ambientFetch(this.config, 'PATCH', `${this.basePath()}/${id}`, patch, opts); + } + + async delete(id: string, opts?: RequestOptions): Promise { + return ambientFetch(this.config, 'DELETE', `${this.basePath()}/${id}`, undefined, opts); + } + + async *listAll(size: number = 100, opts?: RequestOptions): AsyncGenerator { + let page = 1; + while (true) { + const result = await this.list({ page, size }, opts); + for (const item of result.items) { + yield item; + } + if (page * size >= result.total) { + break; + } + page++; + } + } +} diff --git a/components/ambient-sdk/ts-sdk/src/session.ts b/components/ambient-sdk/ts-sdk/src/session.ts index 626a80f2f4..a7a0f5d6e9 100644 --- a/components/ambient-sdk/ts-sdk/src/session.ts +++ b/components/ambient-sdk/ts-sdk/src/session.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z import type { ObjectReference, ListMeta } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/session_api.ts b/components/ambient-sdk/ts-sdk/src/session_api.ts index ce29e8c010..1966d7053b 100644 --- a/components/ambient-sdk/ts-sdk/src/session_api.ts +++ b/components/ambient-sdk/ts-sdk/src/session_api.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z import type { AmbientClientConfig, ListOptions, RequestOptions } from './base'; import { ambientFetch, buildQueryString } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/session_message.ts b/components/ambient-sdk/ts-sdk/src/session_message.ts index 14bfcef6c8..ca642be467 100644 --- a/components/ambient-sdk/ts-sdk/src/session_message.ts +++ b/components/ambient-sdk/ts-sdk/src/session_message.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z import type { ObjectReference, ListMeta } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/session_message_api.ts b/components/ambient-sdk/ts-sdk/src/session_message_api.ts index f81a746476..c8338fb009 100644 --- a/components/ambient-sdk/ts-sdk/src/session_message_api.ts +++ b/components/ambient-sdk/ts-sdk/src/session_message_api.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 9a8e623edcfae33acf56edf974d1859a127c22915d4831cb786daba2b398ca37 -// Generated: 2026-03-21T21:30:53Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z import type { AmbientClientConfig, ListOptions, RequestOptions } from './base'; import { ambientFetch, buildQueryString } from './base'; @@ -9,18 +9,25 @@ import type { SessionMessage, SessionMessageList, SessionMessageCreateRequest } export class SessionMessageAPI { constructor(private readonly config: AmbientClientConfig) {} + private basePath(): string { + if (!this.config.project) { + throw new Error('project is required for SessionMessage operations'); + } + return '/sessions/{id}/messages'.replace('{id}', encodeURIComponent(this.config.project)); + } + async create(data: SessionMessageCreateRequest, opts?: RequestOptions): Promise { - return ambientFetch(this.config, 'POST', '/sessions', data, opts); + return ambientFetch(this.config, 'POST', this.basePath(), data, opts); } async get(id: string, opts?: RequestOptions): Promise { - return ambientFetch(this.config, 'GET', `/sessions/${id}`, undefined, opts); + return ambientFetch(this.config, 'GET', `${this.basePath()}/${id}`, undefined, opts); } async list(listOpts?: ListOptions, opts?: RequestOptions): Promise { const qs = buildQueryString(listOpts); - return ambientFetch(this.config, 'GET', `/sessions${qs}`, undefined, opts); + return ambientFetch(this.config, 'GET', `${this.basePath()}${qs}`, undefined, opts); } async *listAll(size: number = 100, opts?: RequestOptions): AsyncGenerator { let page = 1; diff --git a/components/ambient-sdk/ts-sdk/src/user.ts b/components/ambient-sdk/ts-sdk/src/user.ts index 58648586fc..ffb440ece2 100644 --- a/components/ambient-sdk/ts-sdk/src/user.ts +++ b/components/ambient-sdk/ts-sdk/src/user.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z import type { ObjectReference, ListMeta } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/user_api.ts b/components/ambient-sdk/ts-sdk/src/user_api.ts index 564ad1cd3d..e2cc352c21 100644 --- a/components/ambient-sdk/ts-sdk/src/user_api.ts +++ b/components/ambient-sdk/ts-sdk/src/user_api.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 -// Generated: 2026-04-18T21:11:11Z +// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 +// Generated: 2026-05-05T15:33:32Z import type { AmbientClientConfig, ListOptions, RequestOptions } from './base'; import { ambientFetch, buildQueryString } from './base'; diff --git a/components/ambient-sdk/ts-sdk/tests/client.test.ts b/components/ambient-sdk/ts-sdk/tests/client.test.ts index 77dd509a39..2141c14f02 100644 --- a/components/ambient-sdk/ts-sdk/tests/client.test.ts +++ b/components/ambient-sdk/ts-sdk/tests/client.test.ts @@ -22,20 +22,31 @@ describe('AmbientClient construction', () => { })).toThrow('baseUrl is required'); }); - it('throws when token is missing', () => { - expect(() => new AmbientClient({ + it('creates client without token (browser mode)', () => { + const client = new AmbientClient({ baseUrl: 'https://api.ambient-platform.com', - token: '', - project: 'test-project', - })).toThrow('token is required'); + }); + expect(client).toBeDefined(); + expect(client.sessions).toBeDefined(); }); - it('throws when project is missing', () => { - expect(() => new AmbientClient({ + it('creates client without project', () => { + const client = new AmbientClient({ baseUrl: 'https://api.ambient-platform.com', token: 'sha256~abcdefghijklmnopqrstuvwxyz1234567890', - project: '', - })).toThrow('project is required'); + }); + expect(client).toBeDefined(); + expect(client.sessions).toBeDefined(); + }); + + it('creates client with relative baseUrl', () => { + const client = new AmbientClient({ + baseUrl: '/api/proxy', + token: 'sha256~abcdefghijklmnopqrstuvwxyz1234567890', + project: 'test-project', + }); + expect(client).toBeDefined(); + expect(client.sessions).toBeDefined(); }); it('strips trailing slashes from baseUrl', () => { @@ -61,7 +72,7 @@ describe('AmbientClient.fromEnv', () => { it('creates client from environment variables', () => { process.env.AMBIENT_API_URL = 'https://api.test.com'; - process.env.AMBIENT_TOKEN = 'sha256~testtoken123'; + process.env.AMBIENT_TOKEN = 'sha256~abcdefghijklmnopqrstuvwxyz1234567890'; process.env.AMBIENT_PROJECT = 'my-project'; const client = AmbientClient.fromEnv(); expect(client).toBeDefined(); @@ -74,10 +85,12 @@ describe('AmbientClient.fromEnv', () => { expect(() => AmbientClient.fromEnv()).toThrow('AMBIENT_TOKEN environment variable is required'); }); - it('throws when AMBIENT_PROJECT is missing', () => { + it('creates client when AMBIENT_PROJECT is missing', () => { process.env.AMBIENT_TOKEN = 'sha256~abcdefghijklmnopqrstuvwxyz1234567890'; delete process.env.AMBIENT_PROJECT; - expect(() => AmbientClient.fromEnv()).toThrow('AMBIENT_PROJECT environment variable is required'); + const client = AmbientClient.fromEnv(); + expect(client).toBeDefined(); + expect(client.sessions).toBeDefined(); }); }); From fbe3cbe4cfae405ee23f0269a57f264098466d21 Mon Sep 17 00:00:00 2001 From: jsell-rh Date: Tue, 5 May 2026 15:36:12 +0000 Subject: [PATCH 2/4] chore(sdk): revert Go/Python SDK regeneration to avoid breaking changes The full SDK regeneration introduced conflicts with hand-written Go extension files (agent_extensions.go, session_messages.go) that depend on client methods not present in the generator templates. Reverting Go and Python SDKs to main state; this PR focuses on TS SDK changes. Co-Authored-By: Claude Opus 4.6 --- .../ambient-sdk/go-sdk/client/agent_api.go | 12 +- .../ambient-sdk/go-sdk/client/client.go | 60 +++++-- .../go-sdk/client/credential_api.go | 12 +- .../go-sdk/client/inbox_message_api.go | 4 +- .../ambient-sdk/go-sdk/client/iterator.go | 4 +- .../ambient-sdk/go-sdk/client/project_api.go | 4 +- .../go-sdk/client/project_settings_api.go | 4 +- .../ambient-sdk/go-sdk/client/role_api.go | 4 +- .../go-sdk/client/role_binding_api.go | 4 +- .../go-sdk/client/scheduled_session_api.go | 95 +++++++---- .../ambient-sdk/go-sdk/client/session_api.go | 4 +- .../go-sdk/client/session_message_api.go | 4 +- .../ambient-sdk/go-sdk/client/user_api.go | 4 +- components/ambient-sdk/go-sdk/types/agent.go | 4 +- components/ambient-sdk/go-sdk/types/base.go | 4 +- .../ambient-sdk/go-sdk/types/credential.go | 10 +- .../ambient-sdk/go-sdk/types/inbox_message.go | 4 +- .../ambient-sdk/go-sdk/types/list_options.go | 4 +- .../ambient-sdk/go-sdk/types/project.go | 4 +- .../go-sdk/types/project_settings.go | 4 +- components/ambient-sdk/go-sdk/types/role.go | 4 +- .../ambient-sdk/go-sdk/types/role_binding.go | 4 +- .../go-sdk/types/scheduled_session.go | 160 ++++++------------ .../ambient-sdk/go-sdk/types/session.go | 4 +- .../go-sdk/types/session_message.go | 4 +- components/ambient-sdk/go-sdk/types/user.go | 4 +- .../python-sdk/ambient_platform/__init__.py | 18 +- .../python-sdk/ambient_platform/_agent_api.py | 23 +-- .../python-sdk/ambient_platform/_base.py | 4 +- .../ambient_platform/_inbox_message_api.py | 22 +-- .../python-sdk/ambient_platform/_iterator.py | 4 +- .../ambient_platform/_project_api.py | 4 +- .../ambient_platform/_project_settings_api.py | 4 +- .../python-sdk/ambient_platform/_role_api.py | 7 +- .../ambient_platform/_role_binding_api.py | 7 +- .../ambient_platform/_session_api.py | 4 +- .../ambient_platform/_session_message_api.py | 14 +- .../python-sdk/ambient_platform/_user_api.py | 4 +- .../python-sdk/ambient_platform/agent.py | 132 +-------------- .../python-sdk/ambient_platform/client.py | 40 ++--- .../ambient_platform/inbox_message.py | 4 +- .../python-sdk/ambient_platform/project.py | 14 +- .../ambient_platform/project_settings.py | 4 +- .../python-sdk/ambient_platform/role.py | 4 +- .../ambient_platform/role_binding.py | 4 +- .../python-sdk/ambient_platform/session.py | 4 +- .../ambient_platform/session_message.py | 4 +- .../python-sdk/ambient_platform/user.py | 4 +- 48 files changed, 289 insertions(+), 469 deletions(-) mode change 100755 => 100644 components/ambient-sdk/go-sdk/types/scheduled_session.go diff --git a/components/ambient-sdk/go-sdk/client/agent_api.go b/components/ambient-sdk/go-sdk/client/agent_api.go index c5cbb0ddb1..84f5496229 100644 --- a/components/ambient-sdk/go-sdk/client/agent_api.go +++ b/components/ambient-sdk/go-sdk/client/agent_api.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +// Generated: 2026-04-18T21:11:11Z package client @@ -70,14 +70,6 @@ func (a *AgentAPI) Delete(ctx context.Context, id string) error { return a.client.do(ctx, http.MethodDelete, a.basePath()+"/"+url.PathEscape(id), nil, http.StatusNoContent, nil) } -func (a *AgentAPI) Start(ctx context.Context, id string) (*types.Agent, error) { - var result types.Agent - if err := a.client.do(ctx, http.MethodPost, a.basePath()+"/"+url.PathEscape(id)+"/start", nil, http.StatusOK, &result); err != nil { - return nil, err - } - return &result, nil -} - func (a *AgentAPI) ListAll(ctx context.Context, opts *types.ListOptions) *Iterator[types.Agent] { return NewIterator(func(page int) (*types.AgentList, error) { o := *opts diff --git a/components/ambient-sdk/go-sdk/client/client.go b/components/ambient-sdk/go-sdk/client/client.go index 2de65fe650..cd095b14f3 100644 --- a/components/ambient-sdk/go-sdk/client/client.go +++ b/components/ambient-sdk/go-sdk/client/client.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Spec SHA256: 9a8e623edcfae33acf56edf974d1859a127c22915d4831cb786daba2b398ca37 +// Generated: 2026-03-21T21:30:53Z package client @@ -25,6 +25,7 @@ import ( type Client struct { httpClient *http.Client + streamingClient *http.Client baseURL string token string project string @@ -44,17 +45,21 @@ func WithTimeout(timeout time.Duration) ClientOption { func WithInsecureSkipVerify() ClientOption { return func(c *Client) { c.insecureSkipVerify = true - t, ok := c.httpClient.Transport.(*http.Transport) - if !ok || t == nil { - t = http.DefaultTransport.(*http.Transport).Clone() - } else { - t = t.Clone() + applyInsecure := func(hc *http.Client) { + t, ok := hc.Transport.(*http.Transport) + if !ok || t == nil { + t = http.DefaultTransport.(*http.Transport).Clone() + } else { + t = t.Clone() + } + if t.TLSClientConfig == nil { + t.TLSClientConfig = &tls.Config{MinVersion: tls.VersionTLS12} + } + t.TLSClientConfig.InsecureSkipVerify = true //nolint:gosec + hc.Transport = t } - if t.TLSClientConfig == nil { - t.TLSClientConfig = &tls.Config{MinVersion: tls.VersionTLS12} - } - t.TLSClientConfig.InsecureSkipVerify = true //nolint:gosec - c.httpClient.Transport = t + applyInsecure(c.httpClient) + applyInsecure(c.streamingClient) } } @@ -95,15 +100,19 @@ func NewClient(baseURL, token, project string, opts ...ClientOption) (*Client, e return nil, fmt.Errorf("invalid base URL: %w", err) } + streamingTransport := http.DefaultTransport.(*http.Transport).Clone() + streamingTransport.DisableCompression = true + c := &Client{ httpClient: &http.Client{ Timeout: 30 * time.Second, }, - baseURL: strings.TrimSuffix(baseURL, "/"), - token: token, - project: project, - logger: slog.Default(), - userAgent: "ambient-go-sdk/1.0.0", + streamingClient: &http.Client{Transport: streamingTransport}, + baseURL: strings.TrimSuffix(baseURL, "/"), + token: token, + project: project, + logger: slog.Default(), + userAgent: "ambient-go-sdk/1.0.0", } for _, opt := range opts { @@ -115,6 +124,10 @@ func NewClient(baseURL, token, project string, opts ...ClientOption) (*Client, e return c, nil } +func (c *Client) Project() string { + return c.project +} + func NewClientFromEnv(opts ...ClientOption) (*Client, error) { baseURL := os.Getenv("AMBIENT_API_URL") if baseURL == "" { @@ -135,6 +148,10 @@ func NewClientFromEnv(opts ...ClientOption) (*Client, error) { } func (c *Client) do(ctx context.Context, method, path string, body []byte, expectedStatus int, result interface{}) error { + return c.doMultiStatus(ctx, method, path, body, result, expectedStatus) +} + +func (c *Client) doMultiStatus(ctx context.Context, method, path string, body []byte, result interface{}, expectedStatuses ...int) error { url := c.baseURL + "/api/ambient/v1" + path req, err := http.NewRequestWithContext(ctx, method, url, nil) @@ -175,7 +192,14 @@ func (c *Client) do(ctx context.Context, method, path string, body []byte, expec slog.Int("body_len", len(respBody)), ) - if resp.StatusCode != expectedStatus { + statusOK := false + for _, s := range expectedStatuses { + if resp.StatusCode == s { + statusOK = true + break + } + } + if !statusOK { var apiErr types.APIError if json.Unmarshal(respBody, &apiErr) == nil && apiErr.Code != "" { apiErr.StatusCode = resp.StatusCode diff --git a/components/ambient-sdk/go-sdk/client/credential_api.go b/components/ambient-sdk/go-sdk/client/credential_api.go index 4adc344b05..558b5ec2d1 100644 --- a/components/ambient-sdk/go-sdk/client/credential_api.go +++ b/components/ambient-sdk/go-sdk/client/credential_api.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +// Generated: 2026-04-18T21:11:11Z package client @@ -70,6 +70,14 @@ func (a *CredentialAPI) Delete(ctx context.Context, id string) error { return a.client.do(ctx, http.MethodDelete, a.basePath()+"/"+url.PathEscape(id), nil, http.StatusNoContent, nil) } +func (a *CredentialAPI) GetToken(ctx context.Context, id string) (*types.CredentialTokenResponse, error) { + var result types.CredentialTokenResponse + if err := a.client.do(ctx, http.MethodGet, a.basePath()+"/"+url.PathEscape(id)+"/token", nil, http.StatusOK, &result); err != nil { + return nil, err + } + return &result, nil +} + func (a *CredentialAPI) ListAll(ctx context.Context, opts *types.ListOptions) *Iterator[types.Credential] { return NewIterator(func(page int) (*types.CredentialList, error) { o := *opts diff --git a/components/ambient-sdk/go-sdk/client/inbox_message_api.go b/components/ambient-sdk/go-sdk/client/inbox_message_api.go index 7fb191bcc6..23d8b635ba 100644 --- a/components/ambient-sdk/go-sdk/client/inbox_message_api.go +++ b/components/ambient-sdk/go-sdk/client/inbox_message_api.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +// Generated: 2026-04-18T21:11:11Z package client diff --git a/components/ambient-sdk/go-sdk/client/iterator.go b/components/ambient-sdk/go-sdk/client/iterator.go index 3d351bb186..da5030716b 100644 --- a/components/ambient-sdk/go-sdk/client/iterator.go +++ b/components/ambient-sdk/go-sdk/client/iterator.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +// Generated: 2026-04-18T21:11:11Z package client diff --git a/components/ambient-sdk/go-sdk/client/project_api.go b/components/ambient-sdk/go-sdk/client/project_api.go index 4b4fc91896..1aefbb7404 100644 --- a/components/ambient-sdk/go-sdk/client/project_api.go +++ b/components/ambient-sdk/go-sdk/client/project_api.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +// Generated: 2026-04-18T21:11:11Z package client diff --git a/components/ambient-sdk/go-sdk/client/project_settings_api.go b/components/ambient-sdk/go-sdk/client/project_settings_api.go index 7c1de751bd..47660e3509 100644 --- a/components/ambient-sdk/go-sdk/client/project_settings_api.go +++ b/components/ambient-sdk/go-sdk/client/project_settings_api.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +// Generated: 2026-04-18T21:11:11Z package client diff --git a/components/ambient-sdk/go-sdk/client/role_api.go b/components/ambient-sdk/go-sdk/client/role_api.go index 7a44277bcc..1e19ae5c4d 100644 --- a/components/ambient-sdk/go-sdk/client/role_api.go +++ b/components/ambient-sdk/go-sdk/client/role_api.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +// Generated: 2026-04-18T21:11:11Z package client diff --git a/components/ambient-sdk/go-sdk/client/role_binding_api.go b/components/ambient-sdk/go-sdk/client/role_binding_api.go index cc9aa8e2ee..ad3e628e67 100644 --- a/components/ambient-sdk/go-sdk/client/role_binding_api.go +++ b/components/ambient-sdk/go-sdk/client/role_binding_api.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +// Generated: 2026-04-18T21:11:11Z package client diff --git a/components/ambient-sdk/go-sdk/client/scheduled_session_api.go b/components/ambient-sdk/go-sdk/client/scheduled_session_api.go index ab5989a999..daa07bdf9e 100644 --- a/components/ambient-sdk/go-sdk/client/scheduled_session_api.go +++ b/components/ambient-sdk/go-sdk/client/scheduled_session_api.go @@ -1,8 +1,3 @@ -// Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. -// Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z - package client import ( @@ -11,7 +6,6 @@ import ( "fmt" "net/http" "net/url" - "strings" "github.com/ambient-code/platform/components/ambient-sdk/go-sdk/types" ) @@ -23,57 +17,98 @@ type ScheduledSessionAPI struct { func (c *Client) ScheduledSessions() *ScheduledSessionAPI { return &ScheduledSessionAPI{client: c} } -func (a *ScheduledSessionAPI) basePath() string { - return strings.NewReplacer("{id}", url.PathEscape(a.client.project)).Replace("/projects/{id}/scheduled-sessions") + +func (a *ScheduledSessionAPI) basePath(projectID string) string { + return "/projects/" + url.PathEscape(projectID) + "/scheduled-sessions" } -func (a *ScheduledSessionAPI) Create(ctx context.Context, resource *types.ScheduledSession) (*types.ScheduledSession, error) { - body, err := json.Marshal(resource) - if err != nil { - return nil, fmt.Errorf("marshal scheduled_session: %w", err) - } - var result types.ScheduledSession - if err := a.client.do(ctx, http.MethodPost, a.basePath(), body, http.StatusCreated, &result); err != nil { +func (a *ScheduledSessionAPI) List(ctx context.Context, projectID string, opts *types.ListOptions) (*types.ScheduledSessionList, error) { + var result types.ScheduledSessionList + if err := a.client.doWithQuery(ctx, http.MethodGet, a.basePath(projectID), nil, http.StatusOK, &result, opts); err != nil { return nil, err } return &result, nil } -func (a *ScheduledSessionAPI) Get(ctx context.Context, id string) (*types.ScheduledSession, error) { +func (a *ScheduledSessionAPI) Get(ctx context.Context, projectID, id string) (*types.ScheduledSession, error) { var result types.ScheduledSession - if err := a.client.do(ctx, http.MethodGet, a.basePath()+"/"+url.PathEscape(id), nil, http.StatusOK, &result); err != nil { + path := a.basePath(projectID) + "/" + url.PathEscape(id) + if err := a.client.do(ctx, http.MethodGet, path, nil, http.StatusOK, &result); err != nil { return nil, err } return &result, nil } -func (a *ScheduledSessionAPI) List(ctx context.Context, opts *types.ListOptions) (*types.ScheduledSessionList, error) { - var result types.ScheduledSessionList - if err := a.client.doWithQuery(ctx, http.MethodGet, a.basePath(), nil, http.StatusOK, &result, opts); err != nil { +func (a *ScheduledSessionAPI) Create(ctx context.Context, projectID string, resource *types.ScheduledSession) (*types.ScheduledSession, error) { + body, err := json.Marshal(resource) + if err != nil { + return nil, fmt.Errorf("marshal scheduled session: %w", err) + } + var result types.ScheduledSession + if err := a.client.do(ctx, http.MethodPost, a.basePath(projectID), body, http.StatusCreated, &result); err != nil { return nil, err } return &result, nil } -func (a *ScheduledSessionAPI) Update(ctx context.Context, id string, patch map[string]any) (*types.ScheduledSession, error) { + +func (a *ScheduledSessionAPI) Update(ctx context.Context, projectID, id string, patch *types.ScheduledSessionPatch) (*types.ScheduledSession, error) { body, err := json.Marshal(patch) if err != nil { return nil, fmt.Errorf("marshal patch: %w", err) } var result types.ScheduledSession - if err := a.client.do(ctx, http.MethodPatch, a.basePath()+"/"+url.PathEscape(id), body, http.StatusOK, &result); err != nil { + path := a.basePath(projectID) + "/" + url.PathEscape(id) + if err := a.client.do(ctx, http.MethodPatch, path, body, http.StatusOK, &result); err != nil { + return nil, err + } + return &result, nil +} + +func (a *ScheduledSessionAPI) Delete(ctx context.Context, projectID, id string) error { + return a.client.do(ctx, http.MethodDelete, a.basePath(projectID)+"/"+url.PathEscape(id), nil, http.StatusNoContent, nil) +} + +func (a *ScheduledSessionAPI) Suspend(ctx context.Context, projectID, id string) (*types.ScheduledSession, error) { + var result types.ScheduledSession + path := a.basePath(projectID) + "/" + url.PathEscape(id) + "/suspend" + if err := a.client.do(ctx, http.MethodPost, path, nil, http.StatusOK, &result); err != nil { + return nil, err + } + return &result, nil +} + +func (a *ScheduledSessionAPI) Resume(ctx context.Context, projectID, id string) (*types.ScheduledSession, error) { + var result types.ScheduledSession + path := a.basePath(projectID) + "/" + url.PathEscape(id) + "/resume" + if err := a.client.do(ctx, http.MethodPost, path, nil, http.StatusOK, &result); err != nil { return nil, err } return &result, nil } -func (a *ScheduledSessionAPI) Delete(ctx context.Context, id string) error { - return a.client.do(ctx, http.MethodDelete, a.basePath()+"/"+url.PathEscape(id), nil, http.StatusNoContent, nil) +func (a *ScheduledSessionAPI) Trigger(ctx context.Context, projectID, id string) error { + path := a.basePath(projectID) + "/" + url.PathEscape(id) + "/trigger" + return a.client.do(ctx, http.MethodPost, path, nil, http.StatusOK, nil) } -func (a *ScheduledSessionAPI) ListAll(ctx context.Context, opts *types.ListOptions) *Iterator[types.ScheduledSession] { - return NewIterator(func(page int) (*types.ScheduledSessionList, error) { - o := *opts - o.Page = page - return a.List(ctx, &o) - }) +func (a *ScheduledSessionAPI) Runs(ctx context.Context, projectID, id string, opts *types.ListOptions) (*types.SessionList, error) { + var result types.SessionList + path := a.basePath(projectID) + "/" + url.PathEscape(id) + "/runs" + if err := a.client.doWithQuery(ctx, http.MethodGet, path, nil, http.StatusOK, &result, opts); err != nil { + return nil, err + } + return &result, nil +} + +func (a *ScheduledSessionAPI) GetByName(ctx context.Context, projectID, name string) (*types.ScheduledSession, error) { + list, err := a.List(ctx, projectID, &types.ListOptions{Search: "name = '" + name + "'"}) + if err != nil { + return nil, err + } + for i := range list.Items { + if list.Items[i].Name == name { + return &list.Items[i], nil + } + } + return nil, fmt.Errorf("scheduled session %q not found in project %q", name, projectID) } diff --git a/components/ambient-sdk/go-sdk/client/session_api.go b/components/ambient-sdk/go-sdk/client/session_api.go index c693562023..2e3afb1927 100644 --- a/components/ambient-sdk/go-sdk/client/session_api.go +++ b/components/ambient-sdk/go-sdk/client/session_api.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +// Generated: 2026-04-18T21:11:11Z package client diff --git a/components/ambient-sdk/go-sdk/client/session_message_api.go b/components/ambient-sdk/go-sdk/client/session_message_api.go index b34b0a5b31..0f0e43c80d 100644 --- a/components/ambient-sdk/go-sdk/client/session_message_api.go +++ b/components/ambient-sdk/go-sdk/client/session_message_api.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +// Generated: 2026-04-18T21:11:11Z package client diff --git a/components/ambient-sdk/go-sdk/client/user_api.go b/components/ambient-sdk/go-sdk/client/user_api.go index fabb4924da..c78f7cbb85 100644 --- a/components/ambient-sdk/go-sdk/client/user_api.go +++ b/components/ambient-sdk/go-sdk/client/user_api.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +// Generated: 2026-04-18T21:11:11Z package client diff --git a/components/ambient-sdk/go-sdk/types/agent.go b/components/ambient-sdk/go-sdk/types/agent.go index 36bd1ffe3d..e880327d45 100644 --- a/components/ambient-sdk/go-sdk/types/agent.go +++ b/components/ambient-sdk/go-sdk/types/agent.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +// Generated: 2026-04-18T21:11:11Z package types diff --git a/components/ambient-sdk/go-sdk/types/base.go b/components/ambient-sdk/go-sdk/types/base.go index 1a7a4984c2..b3a3734baa 100644 --- a/components/ambient-sdk/go-sdk/types/base.go +++ b/components/ambient-sdk/go-sdk/types/base.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +// Generated: 2026-04-18T21:11:11Z package types diff --git a/components/ambient-sdk/go-sdk/types/credential.go b/components/ambient-sdk/go-sdk/types/credential.go index 435fbe007f..2c2429be3b 100644 --- a/components/ambient-sdk/go-sdk/types/credential.go +++ b/components/ambient-sdk/go-sdk/types/credential.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +// Generated: 2026-04-18T21:11:11Z package types @@ -155,3 +155,9 @@ func (b *CredentialPatchBuilder) URL(v string) *CredentialPatchBuilder { func (b *CredentialPatchBuilder) Build() map[string]any { return b.patch } + +type CredentialTokenResponse struct { + CredentialID string `json:"credential_id"` + Provider string `json:"provider"` + Token string `json:"token"` +} diff --git a/components/ambient-sdk/go-sdk/types/inbox_message.go b/components/ambient-sdk/go-sdk/types/inbox_message.go index 706279faf8..eb851499d7 100644 --- a/components/ambient-sdk/go-sdk/types/inbox_message.go +++ b/components/ambient-sdk/go-sdk/types/inbox_message.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +// Generated: 2026-04-18T21:11:11Z package types diff --git a/components/ambient-sdk/go-sdk/types/list_options.go b/components/ambient-sdk/go-sdk/types/list_options.go index 49c6393039..bf7d638d68 100644 --- a/components/ambient-sdk/go-sdk/types/list_options.go +++ b/components/ambient-sdk/go-sdk/types/list_options.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +// Generated: 2026-04-18T21:11:11Z package types diff --git a/components/ambient-sdk/go-sdk/types/project.go b/components/ambient-sdk/go-sdk/types/project.go index f08f53449d..d22837b1c1 100644 --- a/components/ambient-sdk/go-sdk/types/project.go +++ b/components/ambient-sdk/go-sdk/types/project.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +// Generated: 2026-04-18T21:11:11Z package types diff --git a/components/ambient-sdk/go-sdk/types/project_settings.go b/components/ambient-sdk/go-sdk/types/project_settings.go index f2be17a9f7..1a5a07d61c 100644 --- a/components/ambient-sdk/go-sdk/types/project_settings.go +++ b/components/ambient-sdk/go-sdk/types/project_settings.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +// Generated: 2026-04-18T21:11:11Z package types diff --git a/components/ambient-sdk/go-sdk/types/role.go b/components/ambient-sdk/go-sdk/types/role.go index 28f59a6a33..3bc87ba6b3 100644 --- a/components/ambient-sdk/go-sdk/types/role.go +++ b/components/ambient-sdk/go-sdk/types/role.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +// Generated: 2026-04-18T21:11:11Z package types diff --git a/components/ambient-sdk/go-sdk/types/role_binding.go b/components/ambient-sdk/go-sdk/types/role_binding.go index b957a453d9..37a09d474d 100644 --- a/components/ambient-sdk/go-sdk/types/role_binding.go +++ b/components/ambient-sdk/go-sdk/types/role_binding.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +// Generated: 2026-04-18T21:11:11Z package types diff --git a/components/ambient-sdk/go-sdk/types/scheduled_session.go b/components/ambient-sdk/go-sdk/types/scheduled_session.go old mode 100755 new mode 100644 index 1313662edc..60eab96257 --- a/components/ambient-sdk/go-sdk/types/scheduled_session.go +++ b/components/ambient-sdk/go-sdk/types/scheduled_session.go @@ -1,8 +1,3 @@ -// Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. -// Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z - package types import ( @@ -14,20 +9,16 @@ import ( type ScheduledSession struct { ObjectReference - AgentID string `json:"agent_id,omitempty"` - Description string `json:"description,omitempty"` - Enabled bool `json:"enabled,omitempty"` - InactivityTimeout int32 `json:"inactivity_timeout,omitempty"` - LastRunAt *time.Time `json:"last_run_at,omitempty"` - Name string `json:"name"` - NextRunAt *time.Time `json:"next_run_at,omitempty"` - ProjectID string `json:"project_id"` - RunnerType string `json:"runner_type,omitempty"` - Schedule string `json:"schedule"` - SessionPrompt string `json:"session_prompt,omitempty"` - StopOnRunFinished bool `json:"stop_on_run_finished,omitempty"` - Timeout int32 `json:"timeout,omitempty"` - Timezone string `json:"timezone,omitempty"` + AgentID string `json:"agent_id,omitempty"` + Description string `json:"description,omitempty"` + Enabled bool `json:"enabled,omitempty"` + LastRunAt *time.Time `json:"last_run_at,omitempty"` + Name string `json:"name"` + NextRunAt *time.Time `json:"next_run_at,omitempty"` + ProjectID string `json:"project_id,omitempty"` + Schedule string `json:"schedule,omitempty"` + SessionPrompt string `json:"session_prompt,omitempty"` + Timezone string `json:"timezone,omitempty"` } type ScheduledSessionList struct { @@ -40,57 +31,39 @@ func (l *ScheduledSessionList) GetTotal() int { return l.Total } func (l *ScheduledSessionList) GetPage() int { return l.Page } func (l *ScheduledSessionList) GetSize() int { return l.Size } +// ScheduledSessionPatch is the request body for a PATCH operation. +// Only set fields that should be changed; omitted (nil) fields are left unchanged. +type ScheduledSessionPatch struct { + Name *string `json:"name,omitempty"` + Description *string `json:"description,omitempty"` + Schedule *string `json:"schedule,omitempty"` + Timezone *string `json:"timezone,omitempty"` + Enabled *bool `json:"enabled,omitempty"` + SessionPrompt *string `json:"session_prompt,omitempty"` +} + +// ScheduledSessionBuilder builds a ScheduledSession for creation. type ScheduledSessionBuilder struct { resource ScheduledSession - errors []error + errs []error } func NewScheduledSessionBuilder() *ScheduledSessionBuilder { return &ScheduledSessionBuilder{} } -func (b *ScheduledSessionBuilder) AgentID(v string) *ScheduledSessionBuilder { - b.resource.AgentID = v - return b -} - -func (b *ScheduledSessionBuilder) Description(v string) *ScheduledSessionBuilder { - b.resource.Description = v - return b -} - -func (b *ScheduledSessionBuilder) Enabled(v bool) *ScheduledSessionBuilder { - b.resource.Enabled = v - return b -} - -func (b *ScheduledSessionBuilder) InactivityTimeout(v int32) *ScheduledSessionBuilder { - b.resource.InactivityTimeout = v - return b -} - -func (b *ScheduledSessionBuilder) LastRunAt(v *time.Time) *ScheduledSessionBuilder { - b.resource.LastRunAt = v - return b -} - func (b *ScheduledSessionBuilder) Name(v string) *ScheduledSessionBuilder { b.resource.Name = v return b } -func (b *ScheduledSessionBuilder) NextRunAt(v *time.Time) *ScheduledSessionBuilder { - b.resource.NextRunAt = v - return b -} - func (b *ScheduledSessionBuilder) ProjectID(v string) *ScheduledSessionBuilder { b.resource.ProjectID = v return b } -func (b *ScheduledSessionBuilder) RunnerType(v string) *ScheduledSessionBuilder { - b.resource.RunnerType = v +func (b *ScheduledSessionBuilder) AgentID(v string) *ScheduledSessionBuilder { + b.resource.AgentID = v return b } @@ -99,105 +72,76 @@ func (b *ScheduledSessionBuilder) Schedule(v string) *ScheduledSessionBuilder { return b } -func (b *ScheduledSessionBuilder) SessionPrompt(v string) *ScheduledSessionBuilder { - b.resource.SessionPrompt = v - return b -} - -func (b *ScheduledSessionBuilder) StopOnRunFinished(v bool) *ScheduledSessionBuilder { - b.resource.StopOnRunFinished = v +func (b *ScheduledSessionBuilder) Timezone(v string) *ScheduledSessionBuilder { + b.resource.Timezone = v return b } -func (b *ScheduledSessionBuilder) Timeout(v int32) *ScheduledSessionBuilder { - b.resource.Timeout = v +func (b *ScheduledSessionBuilder) SessionPrompt(v string) *ScheduledSessionBuilder { + b.resource.SessionPrompt = v return b } -func (b *ScheduledSessionBuilder) Timezone(v string) *ScheduledSessionBuilder { - b.resource.Timezone = v +func (b *ScheduledSessionBuilder) Description(v string) *ScheduledSessionBuilder { + b.resource.Description = v return b } func (b *ScheduledSessionBuilder) Build() (*ScheduledSession, error) { if b.resource.Name == "" { - b.errors = append(b.errors, fmt.Errorf("name is required")) + b.errs = append(b.errs, fmt.Errorf("name is required")) } - if b.resource.ProjectID == "" { - b.errors = append(b.errors, fmt.Errorf("project_id is required")) + if b.resource.AgentID == "" { + b.errs = append(b.errs, fmt.Errorf("agent_id is required")) } if b.resource.Schedule == "" { - b.errors = append(b.errors, fmt.Errorf("schedule is required")) + b.errs = append(b.errs, fmt.Errorf("schedule is required")) } - if len(b.errors) > 0 { - return nil, fmt.Errorf("validation failed: %w", errors.Join(b.errors...)) + if len(b.errs) > 0 { + return nil, fmt.Errorf("validation failed: %w", errors.Join(b.errs...)) } return &b.resource, nil } +// ScheduledSessionPatchBuilder builds a ScheduledSessionPatch for update operations. type ScheduledSessionPatchBuilder struct { - patch map[string]any + patch ScheduledSessionPatch } func NewScheduledSessionPatchBuilder() *ScheduledSessionPatchBuilder { - return &ScheduledSessionPatchBuilder{patch: make(map[string]any)} -} - -func (b *ScheduledSessionPatchBuilder) AgentID(v string) *ScheduledSessionPatchBuilder { - b.patch["agent_id"] = v - return b -} - -func (b *ScheduledSessionPatchBuilder) Description(v string) *ScheduledSessionPatchBuilder { - b.patch["description"] = v - return b -} - -func (b *ScheduledSessionPatchBuilder) Enabled(v bool) *ScheduledSessionPatchBuilder { - b.patch["enabled"] = v - return b -} - -func (b *ScheduledSessionPatchBuilder) InactivityTimeout(v int32) *ScheduledSessionPatchBuilder { - b.patch["inactivity_timeout"] = v - return b + return &ScheduledSessionPatchBuilder{} } func (b *ScheduledSessionPatchBuilder) Name(v string) *ScheduledSessionPatchBuilder { - b.patch["name"] = v + b.patch.Name = &v return b } -func (b *ScheduledSessionPatchBuilder) RunnerType(v string) *ScheduledSessionPatchBuilder { - b.patch["runner_type"] = v +func (b *ScheduledSessionPatchBuilder) Description(v string) *ScheduledSessionPatchBuilder { + b.patch.Description = &v return b } func (b *ScheduledSessionPatchBuilder) Schedule(v string) *ScheduledSessionPatchBuilder { - b.patch["schedule"] = v + b.patch.Schedule = &v return b } -func (b *ScheduledSessionPatchBuilder) SessionPrompt(v string) *ScheduledSessionPatchBuilder { - b.patch["session_prompt"] = v - return b -} - -func (b *ScheduledSessionPatchBuilder) StopOnRunFinished(v bool) *ScheduledSessionPatchBuilder { - b.patch["stop_on_run_finished"] = v +func (b *ScheduledSessionPatchBuilder) Timezone(v string) *ScheduledSessionPatchBuilder { + b.patch.Timezone = &v return b } -func (b *ScheduledSessionPatchBuilder) Timeout(v int32) *ScheduledSessionPatchBuilder { - b.patch["timeout"] = v +func (b *ScheduledSessionPatchBuilder) Enabled(v bool) *ScheduledSessionPatchBuilder { + b.patch.Enabled = &v return b } -func (b *ScheduledSessionPatchBuilder) Timezone(v string) *ScheduledSessionPatchBuilder { - b.patch["timezone"] = v +func (b *ScheduledSessionPatchBuilder) SessionPrompt(v string) *ScheduledSessionPatchBuilder { + b.patch.SessionPrompt = &v return b } -func (b *ScheduledSessionPatchBuilder) Build() map[string]any { - return b.patch +func (b *ScheduledSessionPatchBuilder) Build() *ScheduledSessionPatch { + return &b.patch } diff --git a/components/ambient-sdk/go-sdk/types/session.go b/components/ambient-sdk/go-sdk/types/session.go index 59c96e5c13..98459dd051 100644 --- a/components/ambient-sdk/go-sdk/types/session.go +++ b/components/ambient-sdk/go-sdk/types/session.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +// Generated: 2026-04-18T21:11:11Z package types diff --git a/components/ambient-sdk/go-sdk/types/session_message.go b/components/ambient-sdk/go-sdk/types/session_message.go index ef159eaca8..82b37c6035 100644 --- a/components/ambient-sdk/go-sdk/types/session_message.go +++ b/components/ambient-sdk/go-sdk/types/session_message.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +// Generated: 2026-04-18T21:11:11Z package types diff --git a/components/ambient-sdk/go-sdk/types/user.go b/components/ambient-sdk/go-sdk/types/user.go index 7d626e7a31..35682b8e61 100644 --- a/components/ambient-sdk/go-sdk/types/user.go +++ b/components/ambient-sdk/go-sdk/types/user.go @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml -// Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +// Generated: 2026-04-18T21:11:11Z package types diff --git a/components/ambient-sdk/python-sdk/ambient_platform/__init__.py b/components/ambient-sdk/python-sdk/ambient_platform/__init__.py index 3e2c045744..57b230f4e8 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/__init__.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/__init__.py @@ -1,20 +1,18 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -# Generated: 2026-05-05T15:33:32Z +# Spec SHA256: 9a8e623edcfae33acf56edf974d1859a127c22915d4831cb786daba2b398ca37 +# Generated: 2026-03-21T21:30:53Z """Ambient Platform SDK for Python.""" from .client import AmbientClient from ._base import APIError, ListOptions -from .agent import Agent, AgentPatch -from .credential import Credential, CredentialPatch -from .inbox_message import InboxMessage, InboxMessagePatch +from .inbox_message import InboxMessage from .project import Project, ProjectPatch +from .agent import Agent from .project_settings import ProjectSettings, ProjectSettingsPatch from .role import Role, RolePatch from .role_binding import RoleBinding, RoleBindingPatch -from .scheduled_session import ScheduledSession, ScheduledSessionPatch from .session import Session, SessionPatch, SessionStatusPatch from .session_message import SessionMessage from .user import User, UserPatch @@ -25,22 +23,16 @@ "AmbientClient", "APIError", "ListOptions", - "Agent", - "AgentPatch", - "Credential", - "CredentialPatch", "InboxMessage", - "InboxMessagePatch", "Project", "ProjectPatch", + "Agent", "ProjectSettings", "ProjectSettingsPatch", "Role", "RolePatch", "RoleBinding", "RoleBindingPatch", - "ScheduledSession", - "ScheduledSessionPatch", "Session", "SessionPatch", "SessionStatusPatch", diff --git a/components/ambient-sdk/python-sdk/ambient_platform/_agent_api.py b/components/ambient-sdk/python-sdk/ambient_platform/_agent_api.py index d3508c4ecf..531a9a9268 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/_agent_api.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/_agent_api.py @@ -1,12 +1,11 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -# Generated: 2026-05-05T15:33:32Z +# Spec SHA256: 404b5671af96841f4a876b6192afc6358b4fb8e082ca2b6da499efcf3f72c781 +# Generated: 2026-03-20T16:48:23Z from __future__ import annotations from typing import Any, Iterator, Optional, TYPE_CHECKING -from urllib.parse import quote from ._base import ListOptions from .agent import Agent, AgentList @@ -18,32 +17,22 @@ class AgentAPI: def __init__(self, client: AmbientClient) -> None: self._client = client - def _base_path(self) -> str: - return "/projects/{id}/agents".replace("{id}", quote(self._client._project, safe="")) - def create(self, data: dict) -> Agent: - resp = self._client._request("POST", self._base_path(), json=data) + resp = self._client._request("POST", "/agents", json=data) return Agent.from_dict(resp) def get(self, resource_id: str) -> Agent: - resp = self._client._request("GET", f"{self._base_path()}/{resource_id}") + resp = self._client._request("GET", f"/agents/{resource_id}") return Agent.from_dict(resp) def list(self, opts: Optional[ListOptions] = None) -> AgentList: params = opts.to_params() if opts else None - resp = self._client._request("GET", self._base_path(), params=params) + resp = self._client._request("GET", "/agents", params=params) return AgentList.from_dict(resp) def update(self, resource_id: str, patch: Any) -> Agent: data = patch.to_dict() if hasattr(patch, "to_dict") else patch - resp = self._client._request("PATCH", f"{self._base_path()}/{resource_id}", json=data) - return Agent.from_dict(resp) - - def delete(self, resource_id: str) -> None: - self._client._request("DELETE", f"{self._base_path()}/{resource_id}", expect_json=False) - - def start(self, resource_id: str) -> Agent: - resp = self._client._request("POST", f"{self._base_path()}/{resource_id}/start") + resp = self._client._request("PATCH", f"/agents/{resource_id}", json=data) return Agent.from_dict(resp) def list_all(self, size: int = 100, **kwargs: Any) -> Iterator[Agent]: diff --git a/components/ambient-sdk/python-sdk/ambient_platform/_base.py b/components/ambient-sdk/python-sdk/ambient_platform/_base.py index 1299d34c2d..89dd7058a1 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/_base.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/_base.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -# Generated: 2026-05-05T15:33:32Z +# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +# Generated: 2026-04-18T21:11:11Z from __future__ import annotations diff --git a/components/ambient-sdk/python-sdk/ambient_platform/_inbox_message_api.py b/components/ambient-sdk/python-sdk/ambient_platform/_inbox_message_api.py index f08107219d..7fb6582f5a 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/_inbox_message_api.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/_inbox_message_api.py @@ -1,12 +1,11 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -# Generated: 2026-05-05T15:33:32Z +# Spec SHA256: 9a8e623edcfae33acf56edf974d1859a127c22915d4831cb786daba2b398ca37 +# Generated: 2026-03-21T21:30:53Z from __future__ import annotations from typing import Any, Iterator, Optional, TYPE_CHECKING -from urllib.parse import quote from ._base import ListOptions from .inbox_message import InboxMessage, InboxMessageList @@ -18,30 +17,19 @@ class InboxMessageAPI: def __init__(self, client: AmbientClient) -> None: self._client = client - def _base_path(self) -> str: - return "/projects/{id}/agents/{agent_id}/inbox".replace("{id}", quote(self._client._project, safe="")) - def create(self, data: dict) -> InboxMessage: - resp = self._client._request("POST", self._base_path(), json=data) + resp = self._client._request("POST", "/projects", json=data) return InboxMessage.from_dict(resp) def get(self, resource_id: str) -> InboxMessage: - resp = self._client._request("GET", f"{self._base_path()}/{resource_id}") + resp = self._client._request("GET", f"/projects/{resource_id}") return InboxMessage.from_dict(resp) def list(self, opts: Optional[ListOptions] = None) -> InboxMessageList: params = opts.to_params() if opts else None - resp = self._client._request("GET", self._base_path(), params=params) + resp = self._client._request("GET", "/projects", params=params) return InboxMessageList.from_dict(resp) - def update(self, resource_id: str, patch: Any) -> InboxMessage: - data = patch.to_dict() if hasattr(patch, "to_dict") else patch - resp = self._client._request("PATCH", f"{self._base_path()}/{resource_id}", json=data) - return InboxMessage.from_dict(resp) - - def delete(self, resource_id: str) -> None: - self._client._request("DELETE", f"{self._base_path()}/{resource_id}", expect_json=False) - def list_all(self, size: int = 100, **kwargs: Any) -> Iterator[InboxMessage]: page = 1 while True: diff --git a/components/ambient-sdk/python-sdk/ambient_platform/_iterator.py b/components/ambient-sdk/python-sdk/ambient_platform/_iterator.py index e85c67a355..920933d385 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/_iterator.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/_iterator.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -# Generated: 2026-05-05T15:33:32Z +# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +# Generated: 2026-04-18T21:11:11Z from __future__ import annotations diff --git a/components/ambient-sdk/python-sdk/ambient_platform/_project_api.py b/components/ambient-sdk/python-sdk/ambient_platform/_project_api.py index bab3c333f3..31054debe4 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/_project_api.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/_project_api.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -# Generated: 2026-05-05T15:33:32Z +# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +# Generated: 2026-04-18T21:11:11Z from __future__ import annotations diff --git a/components/ambient-sdk/python-sdk/ambient_platform/_project_settings_api.py b/components/ambient-sdk/python-sdk/ambient_platform/_project_settings_api.py index 349dba65d0..fcb507970a 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/_project_settings_api.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/_project_settings_api.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -# Generated: 2026-05-05T15:33:32Z +# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +# Generated: 2026-04-18T21:11:11Z from __future__ import annotations diff --git a/components/ambient-sdk/python-sdk/ambient_platform/_role_api.py b/components/ambient-sdk/python-sdk/ambient_platform/_role_api.py index 863aae7083..611bcffc58 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/_role_api.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/_role_api.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -# Generated: 2026-05-05T15:33:32Z +# Spec SHA256: 9a8e623edcfae33acf56edf974d1859a127c22915d4831cb786daba2b398ca37 +# Generated: 2026-03-21T21:30:53Z from __future__ import annotations @@ -35,9 +35,6 @@ def update(self, resource_id: str, patch: Any) -> Role: resp = self._client._request("PATCH", f"/roles/{resource_id}", json=data) return Role.from_dict(resp) - def delete(self, resource_id: str) -> None: - self._client._request("DELETE", f"/roles/{resource_id}", expect_json=False) - def list_all(self, size: int = 100, **kwargs: Any) -> Iterator[Role]: page = 1 while True: diff --git a/components/ambient-sdk/python-sdk/ambient_platform/_role_binding_api.py b/components/ambient-sdk/python-sdk/ambient_platform/_role_binding_api.py index 84a861d07c..391c6d5361 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/_role_binding_api.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/_role_binding_api.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -# Generated: 2026-05-05T15:33:32Z +# Spec SHA256: 9a8e623edcfae33acf56edf974d1859a127c22915d4831cb786daba2b398ca37 +# Generated: 2026-03-21T21:30:53Z from __future__ import annotations @@ -35,9 +35,6 @@ def update(self, resource_id: str, patch: Any) -> RoleBinding: resp = self._client._request("PATCH", f"/role_bindings/{resource_id}", json=data) return RoleBinding.from_dict(resp) - def delete(self, resource_id: str) -> None: - self._client._request("DELETE", f"/role_bindings/{resource_id}", expect_json=False) - def list_all(self, size: int = 100, **kwargs: Any) -> Iterator[RoleBinding]: page = 1 while True: diff --git a/components/ambient-sdk/python-sdk/ambient_platform/_session_api.py b/components/ambient-sdk/python-sdk/ambient_platform/_session_api.py index aaa841d939..c006ab9238 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/_session_api.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/_session_api.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -# Generated: 2026-05-05T15:33:32Z +# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +# Generated: 2026-04-18T21:11:11Z from __future__ import annotations diff --git a/components/ambient-sdk/python-sdk/ambient_platform/_session_message_api.py b/components/ambient-sdk/python-sdk/ambient_platform/_session_message_api.py index 2fea71f2a6..0e1bd918fb 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/_session_message_api.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/_session_message_api.py @@ -1,12 +1,11 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -# Generated: 2026-05-05T15:33:32Z +# Spec SHA256: 9a8e623edcfae33acf56edf974d1859a127c22915d4831cb786daba2b398ca37 +# Generated: 2026-03-21T21:30:53Z from __future__ import annotations from typing import Any, Iterator, Optional, TYPE_CHECKING -from urllib.parse import quote from ._base import ListOptions from .session_message import SessionMessage, SessionMessageList @@ -18,21 +17,18 @@ class SessionMessageAPI: def __init__(self, client: AmbientClient) -> None: self._client = client - def _base_path(self) -> str: - return "/sessions/{id}/messages".replace("{id}", quote(self._client._project, safe="")) - def create(self, data: dict) -> SessionMessage: - resp = self._client._request("POST", self._base_path(), json=data) + resp = self._client._request("POST", "/sessions", json=data) return SessionMessage.from_dict(resp) def get(self, resource_id: str) -> SessionMessage: - resp = self._client._request("GET", f"{self._base_path()}/{resource_id}") + resp = self._client._request("GET", f"/sessions/{resource_id}") return SessionMessage.from_dict(resp) def list(self, opts: Optional[ListOptions] = None) -> SessionMessageList: params = opts.to_params() if opts else None - resp = self._client._request("GET", self._base_path(), params=params) + resp = self._client._request("GET", "/sessions", params=params) return SessionMessageList.from_dict(resp) def list_all(self, size: int = 100, **kwargs: Any) -> Iterator[SessionMessage]: page = 1 diff --git a/components/ambient-sdk/python-sdk/ambient_platform/_user_api.py b/components/ambient-sdk/python-sdk/ambient_platform/_user_api.py index 0028278b51..9d00255e63 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/_user_api.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/_user_api.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -# Generated: 2026-05-05T15:33:32Z +# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +# Generated: 2026-04-18T21:11:11Z from __future__ import annotations diff --git a/components/ambient-sdk/python-sdk/ambient_platform/agent.py b/components/ambient-sdk/python-sdk/ambient_platform/agent.py index 71a48d81fe..207c8669c2 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/agent.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/agent.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -# Generated: 2026-05-05T15:33:32Z +# Spec SHA256: 404b5671af96841f4a876b6192afc6358b4fb8e082ca2b6da499efcf3f72c781 +# Generated: 2026-03-20T16:48:23Z from __future__ import annotations @@ -19,24 +19,10 @@ class Agent: href: str = "" created_at: Optional[datetime] = None updated_at: Optional[datetime] = None - annotations: str = "" - bot_account_name: str = "" - current_session_id: str = "" - description: str = "" - display_name: str = "" - environment_variables: str = "" - labels: str = "" - llm_max_tokens: int = 0 - llm_model: str = "" - llm_temperature: float = 0.0 name: str = "" owner_user_id: str = "" - parent_agent_id: str = "" - project_id: str = "" prompt: str = "" - repo_url: str = "" - resource_overrides: str = "" - workflow_id: str = "" + version: int = 0 @classmethod def from_dict(cls, data: dict) -> Agent: @@ -46,24 +32,10 @@ def from_dict(cls, data: dict) -> Agent: href=data.get("href", ""), created_at=_parse_datetime(data.get("created_at")), updated_at=_parse_datetime(data.get("updated_at")), - annotations=data.get("annotations", ""), - bot_account_name=data.get("bot_account_name", ""), - current_session_id=data.get("current_session_id", ""), - description=data.get("description", ""), - display_name=data.get("display_name", ""), - environment_variables=data.get("environment_variables", ""), - labels=data.get("labels", ""), - llm_max_tokens=data.get("llm_max_tokens", 0), - llm_model=data.get("llm_model", ""), - llm_temperature=data.get("llm_temperature", 0.0), name=data.get("name", ""), owner_user_id=data.get("owner_user_id", ""), - parent_agent_id=data.get("parent_agent_id", ""), - project_id=data.get("project_id", ""), prompt=data.get("prompt", ""), - repo_url=data.get("repo_url", ""), - resource_overrides=data.get("resource_overrides", ""), - workflow_id=data.get("workflow_id", ""), + version=data.get("version", 0), ) @classmethod @@ -95,42 +67,6 @@ def __init__(self) -> None: self._data: dict[str, Any] = {} - def annotations(self, value: str) -> AgentBuilder: - self._data["annotations"] = value - return self - - def bot_account_name(self, value: str) -> AgentBuilder: - self._data["bot_account_name"] = value - return self - - def description(self, value: str) -> AgentBuilder: - self._data["description"] = value - return self - - def display_name(self, value: str) -> AgentBuilder: - self._data["display_name"] = value - return self - - def environment_variables(self, value: str) -> AgentBuilder: - self._data["environment_variables"] = value - return self - - def labels(self, value: str) -> AgentBuilder: - self._data["labels"] = value - return self - - def llm_max_tokens(self, value: int) -> AgentBuilder: - self._data["llm_max_tokens"] = value - return self - - def llm_model(self, value: str) -> AgentBuilder: - self._data["llm_model"] = value - return self - - def llm_temperature(self, value: float) -> AgentBuilder: - self._data["llm_temperature"] = value - return self - def name(self, value: str) -> AgentBuilder: self._data["name"] = value return self @@ -139,35 +75,15 @@ def owner_user_id(self, value: str) -> AgentBuilder: self._data["owner_user_id"] = value return self - def parent_agent_id(self, value: str) -> AgentBuilder: - self._data["parent_agent_id"] = value - return self - - def project_id(self, value: str) -> AgentBuilder: - self._data["project_id"] = value - return self - def prompt(self, value: str) -> AgentBuilder: self._data["prompt"] = value return self - def repo_url(self, value: str) -> AgentBuilder: - self._data["repo_url"] = value - return self - - def resource_overrides(self, value: str) -> AgentBuilder: - self._data["resource_overrides"] = value - return self - - def workflow_id(self, value: str) -> AgentBuilder: - self._data["workflow_id"] = value - return self - def build(self) -> dict: if "name" not in self._data: raise ValueError("name is required") - if "project_id" not in self._data: - raise ValueError("project_id is required") + if "owner_user_id" not in self._data: + raise ValueError("owner_user_id is required") return dict(self._data) @@ -176,45 +92,9 @@ def __init__(self) -> None: self._data: dict[str, Any] = {} - def annotations(self, value: str) -> AgentPatch: - self._data["annotations"] = value - return self - - def description(self, value: str) -> AgentPatch: - self._data["description"] = value - return self - - def display_name(self, value: str) -> AgentPatch: - self._data["display_name"] = value - return self - - def labels(self, value: str) -> AgentPatch: - self._data["labels"] = value - return self - - def llm_max_tokens(self, value: int) -> AgentPatch: - self._data["llm_max_tokens"] = value - return self - - def llm_model(self, value: str) -> AgentPatch: - self._data["llm_model"] = value - return self - - def llm_temperature(self, value: float) -> AgentPatch: - self._data["llm_temperature"] = value - return self - - def name(self, value: str) -> AgentPatch: - self._data["name"] = value - return self - def prompt(self, value: str) -> AgentPatch: self._data["prompt"] = value return self - def repo_url(self, value: str) -> AgentPatch: - self._data["repo_url"] = value - return self - def to_dict(self) -> dict: return dict(self._data) diff --git a/components/ambient-sdk/python-sdk/ambient_platform/client.py b/components/ambient-sdk/python-sdk/ambient_platform/client.py index fe12f1f85c..39dd3f037b 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/client.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/client.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -# Generated: 2026-05-05T15:33:32Z +# Spec SHA256: 9a8e623edcfae33acf56edf974d1859a127c22915d4831cb786daba2b398ca37 +# Generated: 2026-03-21T21:30:53Z from __future__ import annotations @@ -16,14 +16,12 @@ from ._base import APIError, ListOptions if TYPE_CHECKING: - from ._agent_api import AgentAPI - from ._credential_api import CredentialAPI from ._inbox_message_api import InboxMessageAPI from ._project_api import ProjectAPI + from ._agent_api import AgentAPI from ._project_settings_api import ProjectSettingsAPI from ._role_api import RoleAPI from ._role_binding_api import RoleBindingAPI - from ._scheduled_session_api import ScheduledSessionAPI from ._session_api import SessionAPI from ._session_message_api import SessionMessageAPI from ._user_api import UserAPI @@ -60,14 +58,12 @@ def __init__( ) # Initialize API interfaces - self._agent_api: Optional[AgentAPI] = None - self._credential_api: Optional[CredentialAPI] = None self._inbox_message_api: Optional[InboxMessageAPI] = None self._project_api: Optional[ProjectAPI] = None + self._agent_api: Optional[AgentAPI] = None self._project_settings_api: Optional[ProjectSettingsAPI] = None self._role_api: Optional[RoleAPI] = None self._role_binding_api: Optional[RoleBindingAPI] = None - self._scheduled_session_api: Optional[ScheduledSessionAPI] = None self._session_api: Optional[SessionAPI] = None self._session_message_api: Optional[SessionMessageAPI] = None self._user_api: Optional[UserAPI] = None @@ -184,20 +180,6 @@ def __enter__(self) -> AmbientClient: def __exit__(self, *args: Any) -> None: self.close() @property - def agents(self) -> AgentAPI: - """Get the Agent API interface.""" - if self._agent_api is None: - from ._agent_api import AgentAPI - self._agent_api = AgentAPI(self) - return self._agent_api - @property - def credentials(self) -> CredentialAPI: - """Get the Credential API interface.""" - if self._credential_api is None: - from ._credential_api import CredentialAPI - self._credential_api = CredentialAPI(self) - return self._credential_api - @property def inbox_messages(self) -> InboxMessageAPI: """Get the InboxMessage API interface.""" if self._inbox_message_api is None: @@ -212,6 +194,13 @@ def projects(self) -> ProjectAPI: self._project_api = ProjectAPI(self) return self._project_api @property + def agents(self) -> AgentAPI: + """Get the Agent API interface.""" + if self._agent_api is None: + from ._agent_api import AgentAPI + self._agent_api = AgentAPI(self) + return self._agent_api + @property def project_settings(self) -> ProjectSettingsAPI: """Get the ProjectSettings API interface.""" if self._project_settings_api is None: @@ -233,13 +222,6 @@ def role_bindings(self) -> RoleBindingAPI: self._role_binding_api = RoleBindingAPI(self) return self._role_binding_api @property - def scheduled_sessions(self) -> ScheduledSessionAPI: - """Get the ScheduledSession API interface.""" - if self._scheduled_session_api is None: - from ._scheduled_session_api import ScheduledSessionAPI - self._scheduled_session_api = ScheduledSessionAPI(self) - return self._scheduled_session_api - @property def sessions(self) -> SessionAPI: """Get the Session API interface.""" if self._session_api is None: diff --git a/components/ambient-sdk/python-sdk/ambient_platform/inbox_message.py b/components/ambient-sdk/python-sdk/ambient_platform/inbox_message.py index 73893331d3..a6bdf6cced 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/inbox_message.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/inbox_message.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -# Generated: 2026-05-05T15:33:32Z +# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +# Generated: 2026-04-18T21:11:11Z from __future__ import annotations diff --git a/components/ambient-sdk/python-sdk/ambient_platform/project.py b/components/ambient-sdk/python-sdk/ambient_platform/project.py index 04716154a0..b8b6a30531 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/project.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/project.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -# Generated: 2026-05-05T15:33:32Z +# Spec SHA256: 9a8e623edcfae33acf56edf974d1859a127c22915d4831cb786daba2b398ca37 +# Generated: 2026-03-21T21:30:53Z from __future__ import annotations @@ -21,7 +21,6 @@ class Project: updated_at: Optional[datetime] = None annotations: str = "" description: str = "" - display_name: str = "" labels: str = "" name: str = "" prompt: str = "" @@ -37,7 +36,6 @@ def from_dict(cls, data: dict) -> Project: updated_at=_parse_datetime(data.get("updated_at")), annotations=data.get("annotations", ""), description=data.get("description", ""), - display_name=data.get("display_name", ""), labels=data.get("labels", ""), name=data.get("name", ""), prompt=data.get("prompt", ""), @@ -81,10 +79,6 @@ def description(self, value: str) -> ProjectBuilder: self._data["description"] = value return self - def display_name(self, value: str) -> ProjectBuilder: - self._data["display_name"] = value - return self - def labels(self, value: str) -> ProjectBuilder: self._data["labels"] = value return self @@ -120,10 +114,6 @@ def description(self, value: str) -> ProjectPatch: self._data["description"] = value return self - def display_name(self, value: str) -> ProjectPatch: - self._data["display_name"] = value - return self - def labels(self, value: str) -> ProjectPatch: self._data["labels"] = value return self diff --git a/components/ambient-sdk/python-sdk/ambient_platform/project_settings.py b/components/ambient-sdk/python-sdk/ambient_platform/project_settings.py index e68fbdd330..2e405b190d 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/project_settings.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/project_settings.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -# Generated: 2026-05-05T15:33:32Z +# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +# Generated: 2026-04-18T21:11:11Z from __future__ import annotations diff --git a/components/ambient-sdk/python-sdk/ambient_platform/role.py b/components/ambient-sdk/python-sdk/ambient_platform/role.py index 8cfb241304..f258bd4ab1 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/role.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/role.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -# Generated: 2026-05-05T15:33:32Z +# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +# Generated: 2026-04-18T21:11:11Z from __future__ import annotations diff --git a/components/ambient-sdk/python-sdk/ambient_platform/role_binding.py b/components/ambient-sdk/python-sdk/ambient_platform/role_binding.py index a76ae483d5..23b5fdc8bf 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/role_binding.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/role_binding.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -# Generated: 2026-05-05T15:33:32Z +# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +# Generated: 2026-04-18T21:11:11Z from __future__ import annotations diff --git a/components/ambient-sdk/python-sdk/ambient_platform/session.py b/components/ambient-sdk/python-sdk/ambient_platform/session.py index 6e75f69e72..ef7b62db5a 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/session.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/session.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -# Generated: 2026-05-05T15:33:32Z +# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +# Generated: 2026-04-18T21:11:11Z from __future__ import annotations diff --git a/components/ambient-sdk/python-sdk/ambient_platform/session_message.py b/components/ambient-sdk/python-sdk/ambient_platform/session_message.py index 03b54e2d5d..383cbd6344 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/session_message.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/session_message.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -# Generated: 2026-05-05T15:33:32Z +# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +# Generated: 2026-04-18T21:11:11Z from __future__ import annotations diff --git a/components/ambient-sdk/python-sdk/ambient_platform/user.py b/components/ambient-sdk/python-sdk/ambient_platform/user.py index 891c55e0a1..da72aaecc5 100644 --- a/components/ambient-sdk/python-sdk/ambient_platform/user.py +++ b/components/ambient-sdk/python-sdk/ambient_platform/user.py @@ -1,7 +1,7 @@ # Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. # Source: ../../ambient-api-server/openapi/openapi.yaml -# Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -# Generated: 2026-05-05T15:33:32Z +# Spec SHA256: 97773951f427a0271532ec5ed2e18c6441b246989b0aebbe755b544b47e2e702 +# Generated: 2026-04-18T21:11:11Z from __future__ import annotations From f45ff56ddba75bdd8dc60ebc2db34bcd0efcdbd1 Mon Sep 17 00:00:00 2001 From: jsell-rh Date: Tue, 5 May 2026 15:38:40 +0000 Subject: [PATCH 3/4] fix(sdk): add missing ScheduledSession fields to Go SDK types Add Timeout, InactivityTimeout, StopOnRunFinished, and RunnerType fields to ScheduledSession, ScheduledSessionPatch, and their builders. These fields exist in the OpenAPI spec but were missing from the Go SDK, causing compilation failures in the CLI. Co-Authored-By: Claude Opus 4.6 --- .../go-sdk/types/scheduled_session.go | 86 +++++++++++++++---- 1 file changed, 70 insertions(+), 16 deletions(-) diff --git a/components/ambient-sdk/go-sdk/types/scheduled_session.go b/components/ambient-sdk/go-sdk/types/scheduled_session.go index 60eab96257..365e628515 100644 --- a/components/ambient-sdk/go-sdk/types/scheduled_session.go +++ b/components/ambient-sdk/go-sdk/types/scheduled_session.go @@ -9,16 +9,20 @@ import ( type ScheduledSession struct { ObjectReference - AgentID string `json:"agent_id,omitempty"` - Description string `json:"description,omitempty"` - Enabled bool `json:"enabled,omitempty"` - LastRunAt *time.Time `json:"last_run_at,omitempty"` - Name string `json:"name"` - NextRunAt *time.Time `json:"next_run_at,omitempty"` - ProjectID string `json:"project_id,omitempty"` - Schedule string `json:"schedule,omitempty"` - SessionPrompt string `json:"session_prompt,omitempty"` - Timezone string `json:"timezone,omitempty"` + AgentID string `json:"agent_id,omitempty"` + Description string `json:"description,omitempty"` + Enabled bool `json:"enabled,omitempty"` + InactivityTimeout *int32 `json:"inactivity_timeout,omitempty"` + LastRunAt *time.Time `json:"last_run_at,omitempty"` + Name string `json:"name"` + NextRunAt *time.Time `json:"next_run_at,omitempty"` + ProjectID string `json:"project_id,omitempty"` + RunnerType string `json:"runner_type,omitempty"` + Schedule string `json:"schedule,omitempty"` + SessionPrompt string `json:"session_prompt,omitempty"` + StopOnRunFinished *bool `json:"stop_on_run_finished,omitempty"` + Timeout *int32 `json:"timeout,omitempty"` + Timezone string `json:"timezone,omitempty"` } type ScheduledSessionList struct { @@ -34,12 +38,17 @@ func (l *ScheduledSessionList) GetSize() int { return l.Size } // ScheduledSessionPatch is the request body for a PATCH operation. // Only set fields that should be changed; omitted (nil) fields are left unchanged. type ScheduledSessionPatch struct { - Name *string `json:"name,omitempty"` - Description *string `json:"description,omitempty"` - Schedule *string `json:"schedule,omitempty"` - Timezone *string `json:"timezone,omitempty"` - Enabled *bool `json:"enabled,omitempty"` - SessionPrompt *string `json:"session_prompt,omitempty"` + AgentID *string `json:"agent_id,omitempty"` + Name *string `json:"name,omitempty"` + Description *string `json:"description,omitempty"` + Schedule *string `json:"schedule,omitempty"` + Timezone *string `json:"timezone,omitempty"` + Enabled *bool `json:"enabled,omitempty"` + InactivityTimeout *int32 `json:"inactivity_timeout,omitempty"` + RunnerType *string `json:"runner_type,omitempty"` + SessionPrompt *string `json:"session_prompt,omitempty"` + StopOnRunFinished *bool `json:"stop_on_run_finished,omitempty"` + Timeout *int32 `json:"timeout,omitempty"` } // ScheduledSessionBuilder builds a ScheduledSession for creation. @@ -87,6 +96,26 @@ func (b *ScheduledSessionBuilder) Description(v string) *ScheduledSessionBuilder return b } +func (b *ScheduledSessionBuilder) Timeout(v int32) *ScheduledSessionBuilder { + b.resource.Timeout = &v + return b +} + +func (b *ScheduledSessionBuilder) InactivityTimeout(v int32) *ScheduledSessionBuilder { + b.resource.InactivityTimeout = &v + return b +} + +func (b *ScheduledSessionBuilder) StopOnRunFinished(v bool) *ScheduledSessionBuilder { + b.resource.StopOnRunFinished = &v + return b +} + +func (b *ScheduledSessionBuilder) RunnerType(v string) *ScheduledSessionBuilder { + b.resource.RunnerType = v + return b +} + func (b *ScheduledSessionBuilder) Build() (*ScheduledSession, error) { if b.resource.Name == "" { b.errs = append(b.errs, fmt.Errorf("name is required")) @@ -142,6 +171,31 @@ func (b *ScheduledSessionPatchBuilder) SessionPrompt(v string) *ScheduledSession return b } +func (b *ScheduledSessionPatchBuilder) AgentID(v string) *ScheduledSessionPatchBuilder { + b.patch.AgentID = &v + return b +} + +func (b *ScheduledSessionPatchBuilder) Timeout(v int32) *ScheduledSessionPatchBuilder { + b.patch.Timeout = &v + return b +} + +func (b *ScheduledSessionPatchBuilder) InactivityTimeout(v int32) *ScheduledSessionPatchBuilder { + b.patch.InactivityTimeout = &v + return b +} + +func (b *ScheduledSessionPatchBuilder) StopOnRunFinished(v bool) *ScheduledSessionPatchBuilder { + b.patch.StopOnRunFinished = &v + return b +} + +func (b *ScheduledSessionPatchBuilder) RunnerType(v string) *ScheduledSessionPatchBuilder { + b.patch.RunnerType = &v + return b +} + func (b *ScheduledSessionPatchBuilder) Build() *ScheduledSessionPatch { return &b.patch } From 8f593e58809b78ccbf3d60044483bc9c2a60621b Mon Sep 17 00:00:00 2001 From: jsell-rh Date: Tue, 5 May 2026 15:51:48 +0000 Subject: [PATCH 4/4] fix(sdk): update templates to match generated output and reject protocol-relative URLs Templates are the source of truth for SDK generation. The prior commit updated generated output but not templates, which would be reverted on next regeneration. Also rejects // URLs to prevent protocol-relative URL exploitation. Co-Authored-By: Claude Opus 4.6 --- .../generator/templates/ts/ambient_client.ts.tmpl | 5 +++++ components/ambient-sdk/ts-sdk/src/agent.ts | 2 +- components/ambient-sdk/ts-sdk/src/agent_api.ts | 2 +- components/ambient-sdk/ts-sdk/src/base.ts | 2 +- components/ambient-sdk/ts-sdk/src/client.ts | 7 ++++++- components/ambient-sdk/ts-sdk/src/credential.ts | 2 +- components/ambient-sdk/ts-sdk/src/credential_api.ts | 2 +- components/ambient-sdk/ts-sdk/src/inbox_message.ts | 2 +- components/ambient-sdk/ts-sdk/src/inbox_message_api.ts | 2 +- components/ambient-sdk/ts-sdk/src/index.ts | 2 +- components/ambient-sdk/ts-sdk/src/project.ts | 2 +- components/ambient-sdk/ts-sdk/src/project_api.ts | 2 +- components/ambient-sdk/ts-sdk/src/project_settings.ts | 2 +- components/ambient-sdk/ts-sdk/src/project_settings_api.ts | 2 +- components/ambient-sdk/ts-sdk/src/role.ts | 2 +- components/ambient-sdk/ts-sdk/src/role_api.ts | 2 +- components/ambient-sdk/ts-sdk/src/role_binding.ts | 2 +- components/ambient-sdk/ts-sdk/src/role_binding_api.ts | 2 +- components/ambient-sdk/ts-sdk/src/scheduled_session.ts | 2 +- .../ambient-sdk/ts-sdk/src/scheduled_session_api.ts | 2 +- components/ambient-sdk/ts-sdk/src/session.ts | 2 +- components/ambient-sdk/ts-sdk/src/session_api.ts | 2 +- components/ambient-sdk/ts-sdk/src/session_message.ts | 2 +- components/ambient-sdk/ts-sdk/src/session_message_api.ts | 2 +- components/ambient-sdk/ts-sdk/src/user.ts | 2 +- components/ambient-sdk/ts-sdk/src/user_api.ts | 2 +- components/ambient-sdk/ts-sdk/tests/client.test.ts | 8 ++++++++ 27 files changed, 43 insertions(+), 25 deletions(-) diff --git a/components/ambient-sdk/generator/templates/ts/ambient_client.ts.tmpl b/components/ambient-sdk/generator/templates/ts/ambient_client.ts.tmpl index f29c485c3c..45acf72391 100644 --- a/components/ambient-sdk/generator/templates/ts/ambient_client.ts.tmpl +++ b/components/ambient-sdk/generator/templates/ts/ambient_client.ts.tmpl @@ -29,6 +29,11 @@ export class AmbientClient { throw new Error('project name cannot exceed 63 characters'); } + // Reject protocol-relative URLs (e.g. "//evil.com/path") + if (config.baseUrl.startsWith('//')) { + throw new Error('Protocol-relative URLs are not allowed for baseUrl'); + } + // Skip URL parsing for relative paths (e.g. "/api/proxy") if (!config.baseUrl.startsWith('/')) { const url = new URL(config.baseUrl); diff --git a/components/ambient-sdk/ts-sdk/src/agent.ts b/components/ambient-sdk/ts-sdk/src/agent.ts index eb8801c6e4..37009f3986 100644 --- a/components/ambient-sdk/ts-sdk/src/agent.ts +++ b/components/ambient-sdk/ts-sdk/src/agent.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z import type { ObjectReference, ListMeta } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/agent_api.ts b/components/ambient-sdk/ts-sdk/src/agent_api.ts index 6a1a7da988..5a567ff120 100644 --- a/components/ambient-sdk/ts-sdk/src/agent_api.ts +++ b/components/ambient-sdk/ts-sdk/src/agent_api.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z import type { AmbientClientConfig, ListOptions, RequestOptions } from './base'; import { ambientFetch, buildQueryString } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/base.ts b/components/ambient-sdk/ts-sdk/src/base.ts index 0ec9a605e3..98656c9b5e 100644 --- a/components/ambient-sdk/ts-sdk/src/base.ts +++ b/components/ambient-sdk/ts-sdk/src/base.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z export type ObjectReference = { id: string; diff --git a/components/ambient-sdk/ts-sdk/src/client.ts b/components/ambient-sdk/ts-sdk/src/client.ts index ee3b4c929a..74ddd9c042 100644 --- a/components/ambient-sdk/ts-sdk/src/client.ts +++ b/components/ambient-sdk/ts-sdk/src/client.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z import type { AmbientClientConfig } from './base'; import { AgentAPI } from './agent_api'; @@ -48,6 +48,11 @@ export class AmbientClient { throw new Error('project name cannot exceed 63 characters'); } + // Reject protocol-relative URLs (e.g. "//evil.com/path") + if (config.baseUrl.startsWith('//')) { + throw new Error('Protocol-relative URLs are not allowed for baseUrl'); + } + // Skip URL parsing for relative paths (e.g. "/api/proxy") if (!config.baseUrl.startsWith('/')) { const url = new URL(config.baseUrl); diff --git a/components/ambient-sdk/ts-sdk/src/credential.ts b/components/ambient-sdk/ts-sdk/src/credential.ts index c0a30f80db..dbd1a5ff56 100644 --- a/components/ambient-sdk/ts-sdk/src/credential.ts +++ b/components/ambient-sdk/ts-sdk/src/credential.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z import type { ObjectReference, ListMeta } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/credential_api.ts b/components/ambient-sdk/ts-sdk/src/credential_api.ts index e79c0c16fa..a48144302a 100644 --- a/components/ambient-sdk/ts-sdk/src/credential_api.ts +++ b/components/ambient-sdk/ts-sdk/src/credential_api.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z import type { AmbientClientConfig, ListOptions, RequestOptions } from './base'; import { ambientFetch, buildQueryString } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/inbox_message.ts b/components/ambient-sdk/ts-sdk/src/inbox_message.ts index 8705574522..1ab9180825 100644 --- a/components/ambient-sdk/ts-sdk/src/inbox_message.ts +++ b/components/ambient-sdk/ts-sdk/src/inbox_message.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z import type { ObjectReference, ListMeta } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/inbox_message_api.ts b/components/ambient-sdk/ts-sdk/src/inbox_message_api.ts index 5b7af1a9f8..4d8f13d11c 100644 --- a/components/ambient-sdk/ts-sdk/src/inbox_message_api.ts +++ b/components/ambient-sdk/ts-sdk/src/inbox_message_api.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z import type { AmbientClientConfig, ListOptions, RequestOptions } from './base'; import { ambientFetch, buildQueryString } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/index.ts b/components/ambient-sdk/ts-sdk/src/index.ts index 034905b036..e131072928 100644 --- a/components/ambient-sdk/ts-sdk/src/index.ts +++ b/components/ambient-sdk/ts-sdk/src/index.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z export { AmbientClient } from './client'; export type { AmbientClientConfig, ListOptions, RequestOptions, ObjectReference, ListMeta, APIError } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/project.ts b/components/ambient-sdk/ts-sdk/src/project.ts index 251feeb9e7..03eed06f3a 100644 --- a/components/ambient-sdk/ts-sdk/src/project.ts +++ b/components/ambient-sdk/ts-sdk/src/project.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z import type { ObjectReference, ListMeta } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/project_api.ts b/components/ambient-sdk/ts-sdk/src/project_api.ts index 75eee2f809..3a62d9cc79 100644 --- a/components/ambient-sdk/ts-sdk/src/project_api.ts +++ b/components/ambient-sdk/ts-sdk/src/project_api.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z import type { AmbientClientConfig, ListOptions, RequestOptions } from './base'; import { ambientFetch, buildQueryString } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/project_settings.ts b/components/ambient-sdk/ts-sdk/src/project_settings.ts index dec3731304..19b354bad6 100644 --- a/components/ambient-sdk/ts-sdk/src/project_settings.ts +++ b/components/ambient-sdk/ts-sdk/src/project_settings.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z import type { ObjectReference, ListMeta } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/project_settings_api.ts b/components/ambient-sdk/ts-sdk/src/project_settings_api.ts index ee38368c5c..a71c3fa804 100644 --- a/components/ambient-sdk/ts-sdk/src/project_settings_api.ts +++ b/components/ambient-sdk/ts-sdk/src/project_settings_api.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z import type { AmbientClientConfig, ListOptions, RequestOptions } from './base'; import { ambientFetch, buildQueryString } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/role.ts b/components/ambient-sdk/ts-sdk/src/role.ts index 544f8dcd43..8c038e975d 100644 --- a/components/ambient-sdk/ts-sdk/src/role.ts +++ b/components/ambient-sdk/ts-sdk/src/role.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z import type { ObjectReference, ListMeta } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/role_api.ts b/components/ambient-sdk/ts-sdk/src/role_api.ts index ca423fdb9d..b5f52b3bce 100644 --- a/components/ambient-sdk/ts-sdk/src/role_api.ts +++ b/components/ambient-sdk/ts-sdk/src/role_api.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z import type { AmbientClientConfig, ListOptions, RequestOptions } from './base'; import { ambientFetch, buildQueryString } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/role_binding.ts b/components/ambient-sdk/ts-sdk/src/role_binding.ts index da82558b82..da6ec209e8 100644 --- a/components/ambient-sdk/ts-sdk/src/role_binding.ts +++ b/components/ambient-sdk/ts-sdk/src/role_binding.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z import type { ObjectReference, ListMeta } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/role_binding_api.ts b/components/ambient-sdk/ts-sdk/src/role_binding_api.ts index df3a1b7c26..1023a27638 100644 --- a/components/ambient-sdk/ts-sdk/src/role_binding_api.ts +++ b/components/ambient-sdk/ts-sdk/src/role_binding_api.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z import type { AmbientClientConfig, ListOptions, RequestOptions } from './base'; import { ambientFetch, buildQueryString } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/scheduled_session.ts b/components/ambient-sdk/ts-sdk/src/scheduled_session.ts index b790b75714..fe37580975 100644 --- a/components/ambient-sdk/ts-sdk/src/scheduled_session.ts +++ b/components/ambient-sdk/ts-sdk/src/scheduled_session.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z import type { ObjectReference, ListMeta } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/scheduled_session_api.ts b/components/ambient-sdk/ts-sdk/src/scheduled_session_api.ts index 2705978d18..04c7093ec5 100644 --- a/components/ambient-sdk/ts-sdk/src/scheduled_session_api.ts +++ b/components/ambient-sdk/ts-sdk/src/scheduled_session_api.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z import type { AmbientClientConfig, ListOptions, RequestOptions } from './base'; import { ambientFetch, buildQueryString } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/session.ts b/components/ambient-sdk/ts-sdk/src/session.ts index a7a0f5d6e9..99a98472a6 100644 --- a/components/ambient-sdk/ts-sdk/src/session.ts +++ b/components/ambient-sdk/ts-sdk/src/session.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z import type { ObjectReference, ListMeta } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/session_api.ts b/components/ambient-sdk/ts-sdk/src/session_api.ts index 1966d7053b..16d159ddb4 100644 --- a/components/ambient-sdk/ts-sdk/src/session_api.ts +++ b/components/ambient-sdk/ts-sdk/src/session_api.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z import type { AmbientClientConfig, ListOptions, RequestOptions } from './base'; import { ambientFetch, buildQueryString } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/session_message.ts b/components/ambient-sdk/ts-sdk/src/session_message.ts index ca642be467..26e97e530e 100644 --- a/components/ambient-sdk/ts-sdk/src/session_message.ts +++ b/components/ambient-sdk/ts-sdk/src/session_message.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z import type { ObjectReference, ListMeta } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/session_message_api.ts b/components/ambient-sdk/ts-sdk/src/session_message_api.ts index c8338fb009..39c2d2a4de 100644 --- a/components/ambient-sdk/ts-sdk/src/session_message_api.ts +++ b/components/ambient-sdk/ts-sdk/src/session_message_api.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z import type { AmbientClientConfig, ListOptions, RequestOptions } from './base'; import { ambientFetch, buildQueryString } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/user.ts b/components/ambient-sdk/ts-sdk/src/user.ts index ffb440ece2..24743568ea 100644 --- a/components/ambient-sdk/ts-sdk/src/user.ts +++ b/components/ambient-sdk/ts-sdk/src/user.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z import type { ObjectReference, ListMeta } from './base'; diff --git a/components/ambient-sdk/ts-sdk/src/user_api.ts b/components/ambient-sdk/ts-sdk/src/user_api.ts index e2cc352c21..eceb97ee85 100644 --- a/components/ambient-sdk/ts-sdk/src/user_api.ts +++ b/components/ambient-sdk/ts-sdk/src/user_api.ts @@ -1,7 +1,7 @@ // Code generated by ambient-sdk-generator from openapi.yaml — DO NOT EDIT. // Source: ../../ambient-api-server/openapi/openapi.yaml // Spec SHA256: c9d4494778eb0a006db1f289630460fb9b5dc58df1895903c42735b4f56b0314 -// Generated: 2026-05-05T15:33:32Z +// Generated: 2026-05-05T15:50:22Z import type { AmbientClientConfig, ListOptions, RequestOptions } from './base'; import { ambientFetch, buildQueryString } from './base'; diff --git a/components/ambient-sdk/ts-sdk/tests/client.test.ts b/components/ambient-sdk/ts-sdk/tests/client.test.ts index 2141c14f02..587cf42796 100644 --- a/components/ambient-sdk/ts-sdk/tests/client.test.ts +++ b/components/ambient-sdk/ts-sdk/tests/client.test.ts @@ -57,6 +57,14 @@ describe('AmbientClient construction', () => { }); expect(client).toBeDefined(); }); + + it('rejects protocol-relative URLs', () => { + expect(() => new AmbientClient({ + baseUrl: '//evil.com/path', + token: 'sha256~abcdefghijklmnopqrstuvwxyz1234567890', + project: 'test-project', + })).toThrow('Protocol-relative URLs are not allowed for baseUrl'); + }); }); describe('AmbientClient.fromEnv', () => {