diff --git a/.release-please-manifest.json b/.release-please-manifest.json index c3f1463..96f1cd9 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "1.2.0" + ".": "1.3.0" } diff --git a/.stats.yml b/.stats.yml index 6163321..c09cf00 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ -configured_endpoints: 15 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/warp-bnavetta%2Fwarp-api-252ab435934e85d5f76957188c64906abf76a0351c5861383327cb1297a2ac8a.yml -openapi_spec_hash: ed801bb30428c1c66cb0af97e3f6ee9c -config_hash: 253e4b5ca01236d448980a78491c17c5 +configured_endpoints: 19 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/warp-bnavetta%2Fwarp-api-348bf98eecccd80255fdcee166b5eb385d8d9743811d080f94a1ec33337abc48.yml +openapi_spec_hash: e192bff5e5b54b3a763136e6cbd70e76 +config_hash: c5fc921cc04f541a85f92299f365eba6 diff --git a/CHANGELOG.md b/CHANGELOG.md index 54d72eb..700a1b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,29 @@ # Changelog +## 1.3.0 (2026-04-23) + +Full Changelog: [v1.2.0...v1.3.0](https://github.com/warpdotdev/oz-sdk-typescript/compare/v1.2.0...v1.3.0) + +### Features + +* Accept and persist executor on schedule and integration create/update APIs ([5f9b8bc](https://github.com/warpdotdev/oz-sdk-typescript/commit/5f9b8bc3957e30ac32b1719ac58d098db375c94c)) +* Add API support for public access on oz session link ([4cb146c](https://github.com/warpdotdev/oz-sdk-typescript/commit/4cb146ccb9e0c03c84fc58bfc0913ac80de798e0)) +* Add Gemini as a third-party Oz harness. ([a40afa5](https://github.com/warpdotdev/oz-sdk-typescript/commit/a40afa57024e4c08626b7fe6b46adb6db0d326b7)) +* **api:** api update ([c8c6e74](https://github.com/warpdotdev/oz-sdk-typescript/commit/c8c6e74fc51ae73bf32104dd482ad2202bf34849)) +* **api:** api update ([272c460](https://github.com/warpdotdev/oz-sdk-typescript/commit/272c4604fc764ca8e844cbbdf9b3adea785bf378)) +* **api:** api update ([aedca4a](https://github.com/warpdotdev/oz-sdk-typescript/commit/aedca4a06790460e99ce7194cd7eba11e9769449)) +* **api:** api update ([b01e3a7](https://github.com/warpdotdev/oz-sdk-typescript/commit/b01e3a7535604d26079b1cbe00aca5cded1452e5)) +* **api:** api update ([5f82281](https://github.com/warpdotdev/oz-sdk-typescript/commit/5f82281f598ced615fb4349b76433f2b11f7e166)) +* **api:** api update ([b0a1504](https://github.com/warpdotdev/oz-sdk-typescript/commit/b0a1504a65ce72f232540eb69916bdd71bdabfe4)) +* **api:** api update ([5036b1b](https://github.com/warpdotdev/oz-sdk-typescript/commit/5036b1bb235dc35f844a85d269be889a82e852ca)) +* implement server-side cloud-to-cloud handoff for agent follow-ups (REMOTE-1290) ([1134f2b](https://github.com/warpdotdev/oz-sdk-typescript/commit/1134f2b93bb30785866bc67831b75182d65c6a45)) +* Update public API and graphql to support creating multiple service accounts and API keys ([1fa19c3](https://github.com/warpdotdev/oz-sdk-typescript/commit/1fa19c39375550cc1dfe4b7dd0bce5bb58361821)) + + +### Chores + +* **internal:** more robust bootstrap script ([1c52dcf](https://github.com/warpdotdev/oz-sdk-typescript/commit/1c52dcf1aa971ee4dbd8b672e8dff5c7765d8148)) + ## 1.2.0 (2026-04-15) Full Changelog: [v1.1.1...v1.2.0](https://github.com/warpdotdev/oz-sdk-typescript/compare/v1.1.1...v1.2.0) diff --git a/api.md b/api.md index 9d85823..e7d79b1 100644 --- a/api.md +++ b/api.md @@ -60,6 +60,22 @@ Methods: - client.agent.schedules.pause(scheduleID) -> ScheduledAgentItem - client.agent.schedules.resume(scheduleID) -> ScheduledAgentItem +## Agent + +Types: + +- AgentResponse +- CreateAgentRequest +- ListAgentIdentitiesResponse +- UpdateAgentRequest + +Methods: + +- client.agent.agent.create({ ...params }) -> AgentResponse +- client.agent.agent.update(uid, { ...params }) -> AgentResponse +- client.agent.agent.list() -> ListAgentIdentitiesResponse +- client.agent.agent.delete(uid) -> void + ## Sessions Types: diff --git a/package.json b/package.json index e12d139..eeb7e81 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "oz-agent-sdk", - "version": "1.2.0", + "version": "1.3.0", "description": "The official TypeScript library for the Oz API API", "author": "Oz API <>", "types": "dist/index.d.ts", diff --git a/scripts/bootstrap b/scripts/bootstrap index 2bb3c94..3a8293a 100755 --- a/scripts/bootstrap +++ b/scripts/bootstrap @@ -4,7 +4,7 @@ set -e cd "$(dirname "$0")/.." -if [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ] && [ "$SKIP_BREW" != "1" ] && [ -t 0 ]; then +if [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ] && [ "${SKIP_BREW:-}" != "1" ] && [ -t 0 ]; then brew bundle check >/dev/null 2>&1 || { echo -n "==> Install Homebrew dependencies? (y/N): " read -r response diff --git a/src/resources/agent/agent.ts b/src/resources/agent/agent.ts index 897d3e1..52a3a30 100644 --- a/src/resources/agent/agent.ts +++ b/src/resources/agent/agent.ts @@ -2,6 +2,16 @@ import { APIResource } from '../../core/resource'; import * as AgentAPI from './agent'; +import * as AgentAgentAPI from './agent_'; +import { + Agent as AgentAPIAgent, + AgentCreateParams, + AgentResponse, + AgentUpdateParams, + CreateAgentRequest, + ListAgentIdentitiesResponse, + UpdateAgentRequest, +} from './agent_'; import * as RunsAPI from './runs'; import { ArtifactItem, @@ -35,6 +45,7 @@ import { path } from '../../internal/utils/path'; export class Agent extends APIResource { runs: RunsAPI.Runs = new RunsAPI.Runs(this._client); schedules: SchedulesAPI.Schedules = new SchedulesAPI.Schedules(this._client); + agent: AgentAgentAPI.Agent = new AgentAgentAPI.Agent(this._client); sessions: SessionsAPI.Sessions = new SessionsAPI.Sessions(this._client); /** @@ -246,6 +257,16 @@ export interface AmbientAgentConfig { */ name?: string; + /** + * Configures sharing behavior for the run's shared session. When set, the worker + * emits `--share public:` and the bundled Warp client applies an + * anyone-with-link ACL to the shared session once it has bootstrapped. The same + * ACL is mirrored onto the backing conversation so link viewers can read the + * conversation without being on the run's team. Subject to the workspace-level + * anyone-with-link sharing setting. + */ + session_sharing?: AmbientAgentConfig.SessionSharing; + /** * Skill specification identifying which agent skill to use. Format: * "{owner}/{repo}:{skill_path}" Example: @@ -272,8 +293,9 @@ export namespace AmbientAgentConfig { * * - oz: Warp's built-in harness (default) * - claude: Claude Code harness + * - gemini: Gemini CLI harness */ - type?: 'oz' | 'claude'; + type?: 'oz' | 'claude' | 'gemini'; } /** @@ -288,6 +310,27 @@ export namespace AmbientAgentConfig { */ claude_auth_secret_name?: string; } + + /** + * Configures sharing behavior for the run's shared session. When set, the worker + * emits `--share public:` and the bundled Warp client applies an + * anyone-with-link ACL to the shared session once it has bootstrapped. The same + * ACL is mirrored onto the backing conversation so link viewers can read the + * conversation without being on the run's team. Subject to the workspace-level + * anyone-with-link sharing setting. + */ + export interface SessionSharing { + /** + * Grants anyone-with-link access at the specified level to the run's shared + * session and backing conversation. + * + * - VIEWER: link viewers can read the session and conversation. + * - EDITOR: link viewers can also interact with the session. Anonymous + * (unauthenticated) reads are not supported in this release; link viewers must + * still be authenticated Warp users. + */ + public_access?: 'VIEWER' | 'EDITOR'; + } } /** @@ -1019,6 +1062,7 @@ export namespace AgentRunParams { Agent.Runs = Runs; Agent.Schedules = Schedules; +Agent.Agent = AgentAPIAgent; Agent.Sessions = Sessions; export declare namespace Agent { @@ -1064,5 +1108,15 @@ export declare namespace Agent { type ScheduleUpdateParams as ScheduleUpdateParams, }; + export { + AgentAPIAgent as Agent, + type AgentResponse as AgentResponse, + type CreateAgentRequest as CreateAgentRequest, + type ListAgentIdentitiesResponse as ListAgentIdentitiesResponse, + type UpdateAgentRequest as UpdateAgentRequest, + type AgentCreateParams as AgentCreateParams, + type AgentUpdateParams as AgentUpdateParams, + }; + export { Sessions as Sessions, type SessionCheckRedirectResponse as SessionCheckRedirectResponse }; } diff --git a/src/resources/agent/agent_.ts b/src/resources/agent/agent_.ts new file mode 100644 index 0000000..8256155 --- /dev/null +++ b/src/resources/agent/agent_.ts @@ -0,0 +1,135 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import { APIResource } from '../../core/resource'; +import { APIPromise } from '../../core/api-promise'; +import { buildHeaders } from '../../internal/headers'; +import { RequestOptions } from '../../internal/request-options'; +import { path } from '../../internal/utils/path'; + +/** + * Operations for running and managing cloud agents + */ +export class Agent extends APIResource { + /** + * Create a new agent for the caller's team. Agents can be used as the execution + * principal for team-owned runs. + * + * @example + * ```ts + * const agentResponse = await client.agent.agent.create({ + * name: 'name', + * }); + * ``` + */ + create(body: AgentCreateParams, options?: RequestOptions): APIPromise { + return this._client.post('/agent/identities', { body, ...options }); + } + + /** + * Update an existing agent. + * + * @example + * ```ts + * const agentResponse = await client.agent.agent.update( + * 'uid', + * ); + * ``` + */ + update(uid: string, body: AgentUpdateParams, options?: RequestOptions): APIPromise { + return this._client.put(path`/agent/identities/${uid}`, { body, ...options }); + } + + /** + * List all agents for the caller's team. Each agent includes an `available` flag + * indicating whether it is within the team's plan limit and may be used for runs. + * + * @example + * ```ts + * const listAgentIdentitiesResponse = + * await client.agent.agent.list(); + * ``` + */ + list(options?: RequestOptions): APIPromise { + return this._client.get('/agent/identities', options); + } + + /** + * Delete an agent. All API keys associated with the agent are deleted atomically. + * + * @example + * ```ts + * await client.agent.agent.delete('uid'); + * ``` + */ + delete(uid: string, options?: RequestOptions): APIPromise { + return this._client.delete(path`/agent/identities/${uid}`, { + ...options, + headers: buildHeaders([{ Accept: '*/*' }, options?.headers]), + }); + } +} + +export interface AgentResponse { + /** + * Whether this agent is within the team's plan limit and can be used for runs + */ + available: boolean; + + /** + * When the agent was created (RFC3339) + */ + created_at: string; + + /** + * Name of the agent + */ + name: string; + + /** + * Unique identifier for the agent + */ + uid: string; +} + +export interface CreateAgentRequest { + /** + * A name for the agent + */ + name: string; +} + +export interface ListAgentIdentitiesResponse { + agents: Array; +} + +export interface UpdateAgentRequest { + /** + * The new name for the agent + */ + name?: string; +} + +export interface AgentCreateParams { + /** + * A name for the agent + */ + name: string; +} + +export interface AgentUpdateParams { + /** + * The new name for the agent + */ + name?: string; +} + +export declare namespace Agent { + export { + type AgentResponse as AgentResponse, + type CreateAgentRequest as CreateAgentRequest, + type ListAgentIdentitiesResponse as ListAgentIdentitiesResponse, + type UpdateAgentRequest as UpdateAgentRequest, + type AgentCreateParams as AgentCreateParams, + type AgentUpdateParams as AgentUpdateParams, + }; +} diff --git a/src/resources/agent/index.ts b/src/resources/agent/index.ts index 724f8b9..efd188f 100644 --- a/src/resources/agent/index.ts +++ b/src/resources/agent/index.ts @@ -41,3 +41,11 @@ export { type ScheduleUpdateParams, } from './schedules'; export { Sessions, type SessionCheckRedirectResponse } from './sessions'; +export { + type AgentResponse, + type CreateAgentRequest, + type ListAgentIdentitiesResponse, + type UpdateAgentRequest, + type AgentCreateParams, + type AgentUpdateParams, +} from './agent_'; diff --git a/src/version.ts b/src/version.ts index 54c8a47..39fa5bc 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const VERSION = '1.2.0'; // x-release-please-version +export const VERSION = '1.3.0'; // x-release-please-version diff --git a/tests/api-resources/agent/agent_.test.ts b/tests/api-resources/agent/agent_.test.ts new file mode 100644 index 0000000..58d707f --- /dev/null +++ b/tests/api-resources/agent/agent_.test.ts @@ -0,0 +1,63 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import OzAPI from 'oz-agent-sdk'; + +const client = new OzAPI({ + apiKey: 'My API Key', + baseURL: process.env['TEST_API_BASE_URL'] ?? 'http://127.0.0.1:4010', +}); + +describe('resource agent', () => { + // Mock server tests are disabled + test.skip('create: only required params', async () => { + const responsePromise = client.agent.agent.create({ name: 'name' }); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('create: required and optional params', async () => { + const response = await client.agent.agent.create({ name: 'name' }); + }); + + // Mock server tests are disabled + test.skip('update', async () => { + const responsePromise = client.agent.agent.update('uid', {}); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('list', async () => { + const responsePromise = client.agent.agent.list(); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); + + // Mock server tests are disabled + test.skip('delete', async () => { + const responsePromise = client.agent.agent.delete('uid'); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); +}); diff --git a/tests/api-resources/agent/schedules.test.ts b/tests/api-resources/agent/schedules.test.ts index dd5e2af..0256ee4 100644 --- a/tests/api-resources/agent/schedules.test.ts +++ b/tests/api-resources/agent/schedules.test.ts @@ -47,6 +47,7 @@ describe('resource schedules', () => { }, model_id: 'model_id', name: 'name', + session_sharing: { public_access: 'VIEWER' }, skill_spec: 'skill_spec', worker_host: 'worker_host', }, @@ -109,6 +110,7 @@ describe('resource schedules', () => { }, model_id: 'model_id', name: 'name', + session_sharing: { public_access: 'VIEWER' }, skill_spec: 'skill_spec', worker_host: 'worker_host', },