From b263417b70be3aa31f17f557b394e07999f6e01e Mon Sep 17 00:00:00 2001 From: Bhavesh Patel Date: Tue, 18 Aug 2026 16:23:48 +0530 Subject: [PATCH 1/9] =?UTF-8?q?misc:=20Rename=20catalogs,=20sandbox=20down?= =?UTF-8?q?load,=20and=20MCP=20tools=20paths;=20Fern=20upsert=20=E2=86=92?= =?UTF-8?q?=20create=5For=5Fupdate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20260818100000-api-path-and-sdk-naming.md | 6 ++ .../builderServer.ts | 2 +- .../catalogs/connectorCatalog.ts | 6 +- .../catalogs/modelProviderCatalog.ts | 4 +- .../catalogs/sandboxProviderCatalog.ts | 6 +- .../catalogs/skillCatalog.ts | 4 +- .../harnessBuilderServer.test.ts | 4 +- packages/trueforge/.cursor/BUGBOT.md | 6 +- packages/trueforge/AGENTS.md | 6 +- packages/trueforge/src/apis/mcpServers.ts | 93 +++++++++---------- packages/trueforge/src/app.ts | 2 +- packages/trueforge/src/catalog/McpCatalog.ts | 2 +- .../trueforge/src/catalog/ModelCatalog.ts | 2 +- .../trueforge/src/catalog/SandboxCatalog.ts | 2 +- .../trueforge/src/catalog/SkillCatalog.ts | 2 +- packages/trueforge/src/config.ts | 8 +- .../trueforge/src/routes/catalogRoutes.ts | 10 +- .../trueforge/src/routes/mcpServerRoutes.ts | 10 +- .../src/routes/modelProviderRoutes.ts | 4 +- .../src/routes/sandboxProviderRoutes.ts | 4 +- packages/trueforge/src/routes/skillRoutes.ts | 4 +- packages/trueforge/src/routes/turnRoutes.ts | 2 +- packages/trueforge/src/schemas/common.ts | 4 + packages/trueforge/src/schemas/events.ts | 12 +-- packages/trueforge/src/schemas/mcpServer.ts | 4 +- packages/trueforge/src/schemas/session.ts | 11 +-- packages/trueforge/src/schemas/turn.ts | 21 ++--- .../tests/unit/apis/mcpServers.test.ts | 2 +- .../tests/unit/apis/modelProviders.test.ts | 2 +- .../unit/apis/sandboxFileDownload.test.ts | 4 +- .../tests/unit/apis/sandboxProviders.test.ts | 2 +- .../trueforge/tests/unit/apis/skills.test.ts | 2 +- .../trueforge/tests/unit/apis/turns.test.ts | 2 +- 33 files changed, 125 insertions(+), 130 deletions(-) create mode 100644 .changeset/20260818100000-api-path-and-sdk-naming.md diff --git a/.changeset/20260818100000-api-path-and-sdk-naming.md b/.changeset/20260818100000-api-path-and-sdk-naming.md new file mode 100644 index 000000000..9f8d66837 --- /dev/null +++ b/.changeset/20260818100000-api-path-and-sdk-naming.md @@ -0,0 +1,6 @@ +--- +'@truefoundry/trueforge': minor +'@truefoundry/trueforge-ui': minor +--- + +Rename catalog, sandbox-file download, and MCP tools paths; Fern upsert becomes create_or_update. Paginated lists: sessions/turns 10/100, events 25/100. diff --git a/packages/trueforge-ui/src/plugins/trueforge-agent-server-adapter/builderServer.ts b/packages/trueforge-ui/src/plugins/trueforge-agent-server-adapter/builderServer.ts index 690c245d1..ba03f5063 100644 --- a/packages/trueforge-ui/src/plugins/trueforge-agent-server-adapter/builderServer.ts +++ b/packages/trueforge-ui/src/plugins/trueforge-agent-server-adapter/builderServer.ts @@ -63,7 +63,7 @@ export function createHarnessBuilderServer( // Catalog logos are optional UI enrichment — a catalog failure must not blank the picker. const [modelsBody, catalogEntries] = await Promise.all([ client.models.list(), - client.catalog.modelProviders.list().then( + client.catalogs.modelProviders.list().then( body => body.data, () => [], ), diff --git a/packages/trueforge-ui/src/plugins/trueforge-agent-server-adapter/catalogs/connectorCatalog.ts b/packages/trueforge-ui/src/plugins/trueforge-agent-server-adapter/catalogs/connectorCatalog.ts index 1ea9f3467..a9a72c4d1 100644 --- a/packages/trueforge-ui/src/plugins/trueforge-agent-server-adapter/catalogs/connectorCatalog.ts +++ b/packages/trueforge-ui/src/plugins/trueforge-agent-server-adapter/catalogs/connectorCatalog.ts @@ -164,7 +164,7 @@ export function createConnectorCatalog( return { getConnectorCatalog: async () => { - const body = await client.catalog.mcpServers.list(); + const body = await client.catalogs.mcpServers.list(); return body.data.map(toUiCatalogEntry); }, getConnector: async req => { @@ -186,7 +186,7 @@ export function createConnectorCatalog( ); }, getToolsByConnectorId: async ({ id }) => { - const body = await client.settings.mcpServers.listTools(id); + const body = await client.mcpServers.listTools(id); return body.data.map(toUiTool); }, createConnector: async req => { @@ -203,7 +203,7 @@ export function createConnectorCatalog( }, updateConnector: async req => { const auth = await resolveWriteAuth({ id: req.id, auth: req.auth }); - const body = await client.settings.mcpServers.upsert({ + const body = await client.settings.mcpServers.createOrUpdate({ manifest: toHarnessManifest({ name: req.id, url: req.url, diff --git a/packages/trueforge-ui/src/plugins/trueforge-agent-server-adapter/catalogs/modelProviderCatalog.ts b/packages/trueforge-ui/src/plugins/trueforge-agent-server-adapter/catalogs/modelProviderCatalog.ts index 4637924ea..99473ac0b 100644 --- a/packages/trueforge-ui/src/plugins/trueforge-agent-server-adapter/catalogs/modelProviderCatalog.ts +++ b/packages/trueforge-ui/src/plugins/trueforge-agent-server-adapter/catalogs/modelProviderCatalog.ts @@ -141,7 +141,7 @@ export function createModelProviderCatalog( return { getModelProviderCatalog: async () => { - const body = await client.catalog.modelProviders.list(); + const body = await client.catalogs.modelProviders.list(); return body.data.map(toUiCatalogModelProviderEntry); }, listModelProviders: async () => { @@ -164,7 +164,7 @@ export function createModelProviderCatalog( updateModelProvider: async req => { // UI sends apiKey: "" when only models change; reuse the stored key. const apiKey = await resolveApiKey({ id: req.id, type: req.type, apiKey: req.apiKey }); - const body = await client.settings.modelProviders.upsert({ + const body = await client.settings.modelProviders.createOrUpdate({ manifest: toHarnessModelProvider({ type: req.type, name: req.id, diff --git a/packages/trueforge-ui/src/plugins/trueforge-agent-server-adapter/catalogs/sandboxProviderCatalog.ts b/packages/trueforge-ui/src/plugins/trueforge-agent-server-adapter/catalogs/sandboxProviderCatalog.ts index 695a21212..3f6723204 100644 --- a/packages/trueforge-ui/src/plugins/trueforge-agent-server-adapter/catalogs/sandboxProviderCatalog.ts +++ b/packages/trueforge-ui/src/plugins/trueforge-agent-server-adapter/catalogs/sandboxProviderCatalog.ts @@ -122,7 +122,7 @@ export function createSandboxProviderCatalog(client: TrueForge): SandboxCatalogS return { getSandboxProviderCatalog: async () => { - const body = await client.catalog.sandboxProviders.list(); + const body = await client.catalogs.sandboxProviders.list(); return body.data.map(toUiCatalogEntry); }, listSandboxProviders: async req => { @@ -140,7 +140,7 @@ export function createSandboxProviderCatalog(client: TrueForge): SandboxCatalogS return filterUiSandboxProviders({ providers, query: req?.query }); }, createSandboxProvider: async req => { - const body = await client.settings.sandboxProviders.upsert({ + const body = await client.settings.sandboxProviders.createOrUpdate({ manifest: toHarnessManifest({ type: req.type, apiKey: req.apiKey, @@ -154,7 +154,7 @@ export function createSandboxProviderCatalog(client: TrueForge): SandboxCatalogS }, updateSandboxProvider: async req => { const apiKey = await resolveApiKey(req.apiKey); - const body = await client.settings.sandboxProviders.upsert({ + const body = await client.settings.sandboxProviders.createOrUpdate({ manifest: toHarnessManifest({ type: DAYTONA_TYPE, apiKey, diff --git a/packages/trueforge-ui/src/plugins/trueforge-agent-server-adapter/catalogs/skillCatalog.ts b/packages/trueforge-ui/src/plugins/trueforge-agent-server-adapter/catalogs/skillCatalog.ts index dea80f0f3..9dd975c43 100644 --- a/packages/trueforge-ui/src/plugins/trueforge-agent-server-adapter/catalogs/skillCatalog.ts +++ b/packages/trueforge-ui/src/plugins/trueforge-agent-server-adapter/catalogs/skillCatalog.ts @@ -51,11 +51,11 @@ export function toUiSkill(skill: TrueForgeApi.ConfiguredSkill, catalogNames: Rea export function createSkillCatalog(client: TrueForge): SkillCatalogServer { return { getSkillCatalog: async () => { - const body = await client.catalog.skills.list(); + const body = await client.catalogs.skills.list(); return body.data.map(toUiCatalogEntry); }, listSkills: async req => { - const [listed, catalog] = await Promise.all([client.settings.skills.list(), client.catalog.skills.list()]); + const [listed, catalog] = await Promise.all([client.settings.skills.list(), client.catalogs.skills.list()]); const catalogNames = new Set(catalog.data.map(entry => entry.name)); const skills = listed.data.map(skill => toUiSkill(skill, catalogNames)); const query = req?.query?.trim().toLowerCase(); diff --git a/packages/trueforge-ui/test/plugins/trueforge-agent-server-adapter/harnessBuilderServer.test.ts b/packages/trueforge-ui/test/plugins/trueforge-agent-server-adapter/harnessBuilderServer.test.ts index a3ebe9096..433b8608a 100644 --- a/packages/trueforge-ui/test/plugins/trueforge-agent-server-adapter/harnessBuilderServer.test.ts +++ b/packages/trueforge-ui/test/plugins/trueforge-agent-server-adapter/harnessBuilderServer.test.ts @@ -83,7 +83,7 @@ describe('harnessBuilderServer', () => { ], }); } - if (url.endsWith('/api/v1/catalog/model-providers')) { + if (url.endsWith('/api/v1/catalogs/model-providers')) { return Response.json({ data: [ { @@ -130,7 +130,7 @@ describe('harnessBuilderServer', () => { ], }); } - if (url.endsWith('/api/v1/catalog/model-providers')) { + if (url.endsWith('/api/v1/catalogs/model-providers')) { return new Response('catalog unavailable', { status: 500 }); } return new Response(`Unexpected request: ${url}`, { status: 500 }); diff --git a/packages/trueforge/.cursor/BUGBOT.md b/packages/trueforge/.cursor/BUGBOT.md index 9baea9a94..72b8e5643 100644 --- a/packages/trueforge/.cursor/BUGBOT.md +++ b/packages/trueforge/.cursor/BUGBOT.md @@ -18,9 +18,9 @@ Flag `withTransaction` callbacks that `await` `fetch`, an SDK client, Redis, or Wire fields stay `snake_case` (also covered at repo root). New endpoints must follow this convention; renaming shipped schemas breaks `packages/trueforge-sdk`. -**Paths:** plural kebab under `/api/v1/{collection}`, nested `/…/{id}/{subcollection}`, settings `/api/v1/settings/{collection}`, catalog `/api/v1/catalog/{collection}`. Ids as `{resource}_id`; name-keyed ops use `{name}` — do not mix id and name across verbs for one resource. +**Paths:** plural kebab under `/api/v1/{collection}`, nested `/…/{id}/{subcollection}`, settings `/api/v1/settings/{collection}`, catalogs `/api/v1/catalogs/{collection}`. Ids as `{resource}_id`; name-keyed ops use `{name}` — do not mix id and name across verbs for one resource. -If a settings resource is one-per-tenant (e.g. sandbox provider), keep the plural path `/api/v1/settings/sandbox-providers` for URL consistency, but Fern methods are `get`/`upsert` returning a single object — not `list` returning an array. +If a settings resource is one-per-tenant (e.g. sandbox provider), keep the plural path `/api/v1/settings/sandbox-providers` for URL consistency, but Fern methods are `get`/`create_or_update` returning a single object — not `list` returning an array. **Verbs:** `GET` list/get → 200; `POST` create → **201**; `PUT` replace/upsert → 200; `DELETE` → **200** with `DeleteFooResponse` (`{}`), optional `DeleteFoosRequestQuery`; actions `POST /{id}/{action}`. @@ -53,7 +53,7 @@ Nested child `Bar`: `ListBarsResponse`, `CreateBarRequest`, `GetBarResponse`; Fe **Envelopes:** success `{ data: Item | Item[] }` (+ `pagination` via `fernExtensions.ts` token contract); errors `RequestErrorResponse`. -**Fern:** set `x-fern-sdk-group-name` / `x-fern-sdk-method-name` (`list`/`get`/`create`/`update`/`upsert`/`delete` + snake_case actions). Schemas live in `src/schemas/` with matching `.openapi('…')` names; types via `z.infer`. +**Fern:** set `x-fern-sdk-group-name` / `x-fern-sdk-method-name` (`list`/`get`/`create`/`update`/`create_or_update`/`delete` + snake_case actions). Schemas live in `src/schemas/` with matching `.openapi('…')` names; types via `z.infer`. **No inline object schemas:** flag anonymous `z.object({ … })` nested inside another object. Extract each nested object as a top-level named schema with a meaningful `.openapi('…')` name (e.g. `FooAuth`, `FooManifest`). Primitives, arrays of primitives, and `$ref`s to existing named schemas are fine inline. diff --git a/packages/trueforge/AGENTS.md b/packages/trueforge/AGENTS.md index c7a321d9e..cfc7a5b7d 100644 --- a/packages/trueforge/AGENTS.md +++ b/packages/trueforge/AGENTS.md @@ -5,9 +5,9 @@ Wire fields stay `snake_case`. New endpoints MUST follow this; renames of shipped schemas break `packages/trueforge-sdk`. -**Paths:** plural kebab under `/api/v1/{collection}`, nested `/…/{id}/{subcollection}`, settings `/api/v1/settings/{collection}`, catalog `/api/v1/catalog/{collection}`. Ids as `{resource}_id`; name-keyed ops use `{name}` — do not mix id and name across verbs for one resource. +**Paths:** plural kebab under `/api/v1/{collection}`, nested `/…/{id}/{subcollection}`, settings `/api/v1/settings/{collection}`, catalogs `/api/v1/catalogs/{collection}`. Ids as `{resource}_id`; name-keyed ops use `{name}` — do not mix id and name across verbs for one resource. -If a settings resource is one-per-tenant (e.g. sandbox provider), keep the plural path `/api/v1/settings/sandbox-providers` for URL consistency, but Fern methods are `get`/`upsert` returning a single object — not `list` returning an array. +If a settings resource is one-per-tenant (e.g. sandbox provider), keep the plural path `/api/v1/settings/sandbox-providers` for URL consistency, but Fern methods are `get`/`create_or_update` returning a single object — not `list` returning an array. **Verbs:** `GET` list/get → 200; `POST` create → **201**; `PUT` replace/upsert → 200; `DELETE` → **200** with `DeleteFooResponse` (`{}`), optional `DeleteFoosRequestQuery`; actions `POST /{id}/{action}`. @@ -41,7 +41,7 @@ Nested child `Bar`: `ListBarsResponse`, `CreateBarRequest`, `GetBarResponse`; Fe **Envelopes:** success `{ data: Item | Item[] }` (+ `pagination` via `fernExtensions.ts` token contract); errors `RequestErrorResponse`. -**Fern:** set `x-fern-sdk-group-name` / `x-fern-sdk-method-name` (`list`/`get`/`create`/`update`/`upsert`/`delete` + snake_case actions). Do not hand-edit OpenAPI or `packages/trueforge-sdk`. Schemas live in `src/schemas/` with matching `.openapi('…')` names; types via `z.infer`. +**Fern:** set `x-fern-sdk-group-name` / `x-fern-sdk-method-name` (`list`/`get`/`create`/`update`/`create_or_update`/`delete` + snake_case actions). Do not hand-edit OpenAPI or `packages/trueforge-sdk`. Schemas live in `src/schemas/` with matching `.openapi('…')` names; types via `z.infer`. **No inline object schemas:** do not nest anonymous `z.object({ … })` inside another object. Extract each nested object as a top-level named schema with a meaningful `.openapi('…')` name (e.g. `FooAuth`, `FooManifest`) so OpenAPI emits a `$ref` and other schemas can reuse it. Primitives, arrays of primitives, and `$ref`s to existing named schemas are fine inline. diff --git a/packages/trueforge/src/apis/mcpServers.ts b/packages/trueforge/src/apis/mcpServers.ts index 05f2d5620..1051f8041 100644 --- a/packages/trueforge/src/apis/mcpServers.ts +++ b/packages/trueforge/src/apis/mcpServers.ts @@ -306,61 +306,15 @@ export function createSettingsMcpServersRouter(deps: McpServersRou } }; - const listToolsHandler: RouteHandler = async c => { - const { name } = c.req.valid('param'); - const userRef = deps.resolveUserContext(c).userRef; - // Same url + header resolution as turn execution (DCR via resolveMcpAuth, header/no-auth static). - const connection = await getMcpConnection({ - tenant_id: TENANT_ID, - name, - store: deps.mcpServerStore, - tokenStore: deps.tokenStore, - clientName: configuration.MCP_DCR_OAUTH_CLIENT_NAME, - userRef, - }); - if (connection === undefined) { - return c.json({ error: { message: `MCP server not found: ${name}` } }, 404); - } - const remote = new RemoteMCP({ - id: name, - name, - url: connection.url, - headers: connection.headers, - requestTimeoutMs: configuration.MCP_REQUEST_TIMEOUT_MS, - connectTimeoutMs: configuration.MCP_CONNECT_TIMEOUT_MS, - logger: deps.logger, - signal: c.req.raw.signal, - }); - try { - const response = await remote.listTools(); - if (isAuthRequired(response)) { - return c.json({ error: { message: `MCP server "${name}" requires authentication` } }, 422); - } - const data = response.result.tools.map(tool => omitUndefinedEntries({ ...tool })); - return c.json({ data }, 200); - } catch (error) { - if (error instanceof McpConnectionError) { - deps.logger.warn(`MCP tools/list failed for "${name}"`, extractErrorLogFields(error)); - if (error.statusCode === 401) { - return c.json({ error: { message: error.message } }, 422); - } - return c.json({ error: { message: error.message } }, 502); - } - throw error; - } - }; - const router = new OpenAPIHono(); router.openapi(listMcpServersRoute, listHandler); router.openapi(createMcpServerRoute, createHandler); router.openapi(putMcpServerRoute, putHandler); - // `/{name}/tools` before `/{name}` so the tools suffix is not swallowed. - router.openapi(listMcpServerToolsRoute, listToolsHandler); router.openapi(getMcpServerRoute, getHandler); return router; } -/** List + authorize (mounted at /api/v1/mcp-servers). */ +/** List, tools, and authorize (mounted at /api/v1/mcp-servers). */ export function createMcpServersRouter(deps: McpServersRouterDeps) { const authorizeHandler: RouteHandler = async c => { const { name } = c.req.valid('param'); @@ -415,6 +369,50 @@ export function createMcpServersRouter(deps: McpServersRouterDeps< } }; + const listToolsHandler: RouteHandler = async c => { + const { name } = c.req.valid('param'); + const userRef = deps.resolveUserContext(c).userRef; + // Same url + header resolution as turn execution (DCR via resolveMcpAuth, header/no-auth static). + const connection = await getMcpConnection({ + tenant_id: TENANT_ID, + name, + store: deps.mcpServerStore, + tokenStore: deps.tokenStore, + clientName: configuration.MCP_DCR_OAUTH_CLIENT_NAME, + userRef, + }); + if (connection === undefined) { + return c.json({ error: { message: `MCP server not found: ${name}` } }, 404); + } + const remote = new RemoteMCP({ + id: name, + name, + url: connection.url, + headers: connection.headers, + requestTimeoutMs: configuration.MCP_REQUEST_TIMEOUT_MS, + connectTimeoutMs: configuration.MCP_CONNECT_TIMEOUT_MS, + logger: deps.logger, + signal: c.req.raw.signal, + }); + try { + const response = await remote.listTools(); + if (isAuthRequired(response)) { + return c.json({ error: { message: `MCP server "${name}" requires authentication` } }, 422); + } + const data = response.result.tools.map(tool => omitUndefinedEntries({ ...tool })); + return c.json({ data }, 200); + } catch (error) { + if (error instanceof McpConnectionError) { + deps.logger.warn(`MCP tools/list failed for "${name}"`, extractErrorLogFields(error)); + if (error.statusCode === 401) { + return c.json({ error: { message: error.message } }, 422); + } + return c.json({ error: { message: error.message } }, 502); + } + throw error; + } + }; + const deleteAuthorizeHandler: RouteHandler = async c => { const { name } = c.req.valid('param'); const userRef = deps.resolveUserContext(c).userRef; @@ -443,6 +441,7 @@ export function createMcpServersRouter(deps: McpServersRouterDeps< 200, ); }); + router.openapi(listMcpServerToolsRoute, listToolsHandler); router.openapi(authorizeMcpServerRoute, authorizeHandler); router.openapi(deleteAuthorizeMcpServerRoute, deleteAuthorizeHandler); return router; diff --git a/packages/trueforge/src/app.ts b/packages/trueforge/src/app.ts index ee32e5fb4..9e3a6b6a3 100644 --- a/packages/trueforge/src/app.ts +++ b/packages/trueforge/src/app.ts @@ -188,7 +188,7 @@ export function createServerApp(deps: ServerDeps) { ), ); app.route( - '/api/v1/catalog', + '/api/v1/catalogs', withAuth( createCatalogRouter({ modelCatalog: deps.modelCatalog, diff --git a/packages/trueforge/src/catalog/McpCatalog.ts b/packages/trueforge/src/catalog/McpCatalog.ts index fe2b40082..45294a8ed 100644 --- a/packages/trueforge/src/catalog/McpCatalog.ts +++ b/packages/trueforge/src/catalog/McpCatalog.ts @@ -1,6 +1,6 @@ /** * Shipped MCP catalog (mcp-catalog.yaml): the discovery list of server - * presets offered by GET /catalog/mcp-servers for the UI to copy into + * presets offered by GET /catalogs/mcp-servers for the UI to copy into * PUT /settings/mcp-servers bodies. Never consulted on writes and never * read by the runtime. * diff --git a/packages/trueforge/src/catalog/ModelCatalog.ts b/packages/trueforge/src/catalog/ModelCatalog.ts index 880f3dd48..c7b95d8b7 100644 --- a/packages/trueforge/src/catalog/ModelCatalog.ts +++ b/packages/trueforge/src/catalog/ModelCatalog.ts @@ -1,6 +1,6 @@ /** * Shipped model catalog (model-catalog.yaml): the discovery list of provider - * and model presets offered by GET /catalog/model-providers for the UI to copy + * and model presets offered by GET /catalogs/model-providers for the UI to copy * into PUT /settings/model-providers bodies. Never consulted on writes and never * read by the runtime. * diff --git a/packages/trueforge/src/catalog/SandboxCatalog.ts b/packages/trueforge/src/catalog/SandboxCatalog.ts index 3ace3afb2..99ea304db 100644 --- a/packages/trueforge/src/catalog/SandboxCatalog.ts +++ b/packages/trueforge/src/catalog/SandboxCatalog.ts @@ -1,6 +1,6 @@ /** * Shipped sandbox catalog (sandbox-catalog.yaml): the discovery list of provider - * presets offered by GET /catalog/sandbox-providers for the UI to copy into + * presets offered by GET /catalogs/sandbox-providers for the UI to copy into * PUT /settings/sandbox-providers bodies. Never consulted on writes and never * read by the runtime. * diff --git a/packages/trueforge/src/catalog/SkillCatalog.ts b/packages/trueforge/src/catalog/SkillCatalog.ts index ca57be9ba..975823c25 100644 --- a/packages/trueforge/src/catalog/SkillCatalog.ts +++ b/packages/trueforge/src/catalog/SkillCatalog.ts @@ -1,6 +1,6 @@ /** * Shipped skill catalog (skill-catalog.yaml): the discovery list of skill - * presets offered by GET /catalog/skills for the UI to copy into + * presets offered by GET /catalogs/skills for the UI to copy into * PUT /settings/skills bodies. Never consulted on writes and never * read by the runtime. * diff --git a/packages/trueforge/src/config.ts b/packages/trueforge/src/config.ts index 772074dac..7f0ec6398 100644 --- a/packages/trueforge/src/config.ts +++ b/packages/trueforge/src/config.ts @@ -290,25 +290,25 @@ export interface SharedServerConfiguration { EXECUTOR_ID: string; /** * Optional override for the model catalog YAML (discovery presets for - * GET /catalog/model-providers). When unset, the catalog inlined at build + * GET /catalogs/model-providers). When unset, the catalog inlined at build * time is used. Env: `MODEL_CATALOG_PATH`. */ MODEL_CATALOG_PATH: string | undefined; /** * Optional override for the MCP catalog YAML (discovery presets for - * GET /catalog/mcp-servers). When unset, the catalog inlined at build + * GET /catalogs/mcp-servers). When unset, the catalog inlined at build * time is used. Env: `MCP_CATALOG_PATH`. */ MCP_CATALOG_PATH: string | undefined; /** * Optional override for the skill catalog YAML (discovery presets for - * GET /catalog/skills). When unset, the catalog inlined at build + * GET /catalogs/skills). When unset, the catalog inlined at build * time is used. Env: `SKILL_CATALOG_PATH`. */ SKILL_CATALOG_PATH: string | undefined; /** * Optional override for the sandbox catalog YAML (discovery presets for - * GET /catalog/sandbox-providers). When unset, the catalog inlined at build + * GET /catalogs/sandbox-providers). When unset, the catalog inlined at build * time is used. Env: `SANDBOX_CATALOG_PATH`. */ SANDBOX_CATALOG_PATH: string | undefined; diff --git a/packages/trueforge/src/routes/catalogRoutes.ts b/packages/trueforge/src/routes/catalogRoutes.ts index d7036c421..6300cbd1f 100644 --- a/packages/trueforge/src/routes/catalogRoutes.ts +++ b/packages/trueforge/src/routes/catalogRoutes.ts @@ -1,5 +1,5 @@ /** - * Discovery catalog routes (mounted at /api/v1/catalog). + * Discovery catalog routes (mounted at /api/v1/catalogs). * Readable by any authenticated user — not under admin /settings. */ import { createRoute } from '@hono/zod-openapi'; @@ -19,7 +19,7 @@ export const listModelProviderCatalogRoute = createRoute({ description: 'Shipped model-provider presets (discovery-only). Copy into PUT /settings/model-providers to configure. ' + 'Includes a `custom` sentinel with `supported_reasoning_efforts`.', - 'x-fern-sdk-group-name': ['catalog', 'modelProviders'], + 'x-fern-sdk-group-name': ['catalogs', 'modelProviders'], 'x-fern-sdk-method-name': 'list', responses: { 200: { @@ -39,7 +39,7 @@ export const listMcpServerCatalogRoute = createRoute({ tags: [CATALOG_TAG], summary: 'Get the MCP catalog', description: 'Shipped MCP server presets (discovery-only). Copy into PUT /settings/mcp-servers to configure.', - 'x-fern-sdk-group-name': ['catalog', 'mcpServers'], + 'x-fern-sdk-group-name': ['catalogs', 'mcpServers'], 'x-fern-sdk-method-name': 'list', responses: { 200: { @@ -59,7 +59,7 @@ export const listSkillCatalogRoute = createRoute({ tags: [CATALOG_TAG], summary: 'Get the skill catalog', description: 'Shipped skill presets (discovery-only). Copy into PUT /settings/skills to configure.', - 'x-fern-sdk-group-name': ['catalog', 'skills'], + 'x-fern-sdk-group-name': ['catalogs', 'skills'], 'x-fern-sdk-method-name': 'list', responses: { 200: { @@ -80,7 +80,7 @@ export const listSandboxProviderCatalogRoute = createRoute({ summary: 'Get the sandbox provider catalog', description: 'Shipped sandbox-provider presets (discovery-only). Copy into PUT /settings/sandbox-providers to configure.', - 'x-fern-sdk-group-name': ['catalog', 'sandboxProviders'], + 'x-fern-sdk-group-name': ['catalogs', 'sandboxProviders'], 'x-fern-sdk-method-name': 'list', responses: { 200: { diff --git a/packages/trueforge/src/routes/mcpServerRoutes.ts b/packages/trueforge/src/routes/mcpServerRoutes.ts index 3f2d3f9f6..a815c5b42 100644 --- a/packages/trueforge/src/routes/mcpServerRoutes.ts +++ b/packages/trueforge/src/routes/mcpServerRoutes.ts @@ -1,7 +1,7 @@ /** * DB-backed MCP server route definitions. - * Admin routes mount at /api/v1/settings/mcp-servers; the chat list and - * authorize routes mount at /api/v1/mcp-servers. + * Admin routes mount at /api/v1/settings/mcp-servers; the chat list, + * tools, and authorize routes mount at /api/v1/mcp-servers. */ import { createRoute, z } from '@hono/zod-openapi'; import { RequestErrorResponseSchema } from '../schemas/errors'; @@ -135,7 +135,7 @@ export const putMcpServerRoute = createRoute({ 'Create or replace by `name`. Does not start DCR or change oauth client columns. ' + 'Header secrets: real value sets/rotates; redacted keeps existing (400 if none).', 'x-fern-sdk-group-name': ['settings', 'mcpServers'], - 'x-fern-sdk-method-name': 'upsert', + 'x-fern-sdk-method-name': 'create_or_update', request: { body: { content: { 'application/json': { schema: PutMcpServerRequestSchema } }, @@ -172,7 +172,7 @@ export const listMcpServerToolsRoute = createRoute({ path: '/{name}/tools', tags: [MCP_SERVERS_TAG], summary: 'List tools of an MCP server', - 'x-fern-sdk-group-name': ['settings', 'mcpServers'], + 'x-fern-sdk-group-name': ['mcpServers'], 'x-fern-sdk-method-name': 'list_tools', description: 'All tools exposed by the given MCP server (non-paginated), as returned by the MCP `tools/list` call.', request: { @@ -185,7 +185,7 @@ export const listMcpServerToolsRoute = createRoute({ }, 401: { content: { 'application/json': { schema: RequestErrorResponseSchema } }, - description: 'Harness session login required.', + description: 'OIDC is configured and the request has no valid session cookie.', }, 404: { content: { 'application/json': { schema: RequestErrorResponseSchema } }, diff --git a/packages/trueforge/src/routes/modelProviderRoutes.ts b/packages/trueforge/src/routes/modelProviderRoutes.ts index bb44e0eda..ee7879f3e 100644 --- a/packages/trueforge/src/routes/modelProviderRoutes.ts +++ b/packages/trueforge/src/routes/modelProviderRoutes.ts @@ -1,6 +1,6 @@ /** * Model-provider admin route definitions (mounted at /api/v1/settings/model-providers). - * Discovery catalog lives at GET /api/v1/catalog/model-providers. + * Discovery catalog lives at GET /api/v1/catalogs/model-providers. * Handlers are registered in apis/modelProviders.ts. */ import { createRoute } from '@hono/zod-openapi'; @@ -79,7 +79,7 @@ export const putModelProviderRoute = createRoute({ 'Create or replace a provider (models included). Well-known types use `type` as `name` (one each); ' + '`custom` is named by the caller. `auth.api_key`: real value sets/rotates; redacted keeps existing (400 if none).', 'x-fern-sdk-group-name': ['settings', 'modelProviders'], - 'x-fern-sdk-method-name': 'upsert', + 'x-fern-sdk-method-name': 'create_or_update', request: { body: { content: { 'application/json': { schema: PutModelProviderRequestSchema } }, diff --git a/packages/trueforge/src/routes/sandboxProviderRoutes.ts b/packages/trueforge/src/routes/sandboxProviderRoutes.ts index da704573a..3c83ebc18 100644 --- a/packages/trueforge/src/routes/sandboxProviderRoutes.ts +++ b/packages/trueforge/src/routes/sandboxProviderRoutes.ts @@ -1,6 +1,6 @@ /** * Sandbox-provider admin route definitions (mounted at /api/v1/settings/sandbox-providers). - * Discovery catalog lives at GET /api/v1/catalog/sandbox-providers. + * Discovery catalog lives at GET /api/v1/catalogs/sandbox-providers. * Handlers are registered in apis/sandboxProviders.ts. */ import { createRoute } from '@hono/zod-openapi'; @@ -38,7 +38,7 @@ export const putSandboxProviderRoute = createRoute({ 'Upserts the single sandbox provider for this tenant: creates it or replaces its entire configuration. ' + '`auth.api_key`: real value sets/rotates; redacted keeps existing (400 if none).', 'x-fern-sdk-group-name': ['settings', 'sandboxProviders'], - 'x-fern-sdk-method-name': 'upsert', + 'x-fern-sdk-method-name': 'create_or_update', request: { body: { content: { 'application/json': { schema: PutSandboxProviderRequestSchema } }, diff --git a/packages/trueforge/src/routes/skillRoutes.ts b/packages/trueforge/src/routes/skillRoutes.ts index dd90775dc..9dbbcb8aa 100644 --- a/packages/trueforge/src/routes/skillRoutes.ts +++ b/packages/trueforge/src/routes/skillRoutes.ts @@ -2,7 +2,7 @@ * DB-backed skill route definitions. * Admin routes mount at /api/v1/settings/skills; the chat list mounts at * /api/v1/skills. - * Discovery catalog lives at GET /api/v1/catalog/skills. + * Discovery catalog lives at GET /api/v1/catalogs/skills. */ import { createRoute } from '@hono/zod-openapi'; import { RequestErrorResponseSchema } from '../schemas/errors'; @@ -98,7 +98,7 @@ export const putSkillRoute = createRoute({ summary: 'Create or replace a skill', description: 'Full upsert keyed by `name`: creates the skill or replaces its entire manifest.', 'x-fern-sdk-group-name': ['settings', 'skills'], - 'x-fern-sdk-method-name': 'upsert', + 'x-fern-sdk-method-name': 'create_or_update', request: { body: { content: { 'application/json': { schema: PutSkillRequestSchema } }, diff --git a/packages/trueforge/src/routes/turnRoutes.ts b/packages/trueforge/src/routes/turnRoutes.ts index 92eb41bd5..1c2dbf1ae 100644 --- a/packages/trueforge/src/routes/turnRoutes.ts +++ b/packages/trueforge/src/routes/turnRoutes.ts @@ -88,7 +88,7 @@ export const getTurnRoute = createRoute({ export const downloadSandboxFileRoute = createRoute({ method: 'get', - path: '/{session_id}/turns/{turn_id}/download', + path: '/{session_id}/turns/{turn_id}/download-sandbox-file', tags: [SESSIONS_TAG], summary: 'Download a file from the turn sandbox', description: diff --git a/packages/trueforge/src/schemas/common.ts b/packages/trueforge/src/schemas/common.ts index c5e90fef4..a3260a8e8 100644 --- a/packages/trueforge/src/schemas/common.ts +++ b/packages/trueforge/src/schemas/common.ts @@ -19,6 +19,10 @@ export const NameSchema = z export type ResourceName = z.infer; +export const DEFAULT_PAGE_LIMIT = 10; +export const DEFAULT_EVENTS_PAGE_LIMIT = 25; +export const MAX_PAGE_LIMIT = 100; + /** Adds a validation issue if two entries share a name. */ export function uniqueNames(entries: { name: string }[], ctx: z.RefinementCtx): void { const seen = new Set(); diff --git a/packages/trueforge/src/schemas/events.ts b/packages/trueforge/src/schemas/events.ts index 867ac548b..0132c55c9 100644 --- a/packages/trueforge/src/schemas/events.ts +++ b/packages/trueforge/src/schemas/events.ts @@ -22,6 +22,7 @@ import { ToolResponseEventSchema, ToolResponseRequiredEventSchema, } from '@truefoundry/trueforge-core/core'; +import { DEFAULT_EVENTS_PAGE_LIMIT, MAX_PAGE_LIMIT } from './common'; export type { TurnCreatedEvent } from '@truefoundry/trueforge-core/agent-session'; export { EventType }; @@ -44,9 +45,6 @@ export const TurnStreamingEventSchema = z ]) .openapi('TurnStreamingEvent'); -/** Max events per session-events page. */ -export const SESSION_EVENTS_LIMIT = 100; - export const ListSessionEventsRequestQuerySchema = z .object({ page_token: z @@ -65,12 +63,10 @@ export const ListSessionEventsRequestQuerySchema = z .number() .int() .min(1) - .max(SESSION_EVENTS_LIMIT) + .max(MAX_PAGE_LIMIT) .optional() - .default(SESSION_EVENTS_LIMIT) - .describe( - `Max events per response. Default ${String(SESSION_EVENTS_LIMIT)}, max ${String(SESSION_EVENTS_LIMIT)}.`, - ), + .default(DEFAULT_EVENTS_PAGE_LIMIT) + .describe(`Page size. Defaults to ${String(DEFAULT_EVENTS_PAGE_LIMIT)}, max ${String(MAX_PAGE_LIMIT)}.`), }) .openapi('ListSessionEventsRequestQuery'); diff --git a/packages/trueforge/src/schemas/mcpServer.ts b/packages/trueforge/src/schemas/mcpServer.ts index fcd7f3e53..cd75c976d 100644 --- a/packages/trueforge/src/schemas/mcpServer.ts +++ b/packages/trueforge/src/schemas/mcpServer.ts @@ -3,8 +3,8 @@ * document, admin/chat list projections, and auth_status. Catalog file schemas * live in mcpCatalog.ts. * - * Auth: `header` stores shared request headers on the row (settings listTools); - * turn execution resolves DCR tokens via resolveMcpAuth. + * Auth: `header` stores shared request headers on the row. + * Turn execution resolves DCR tokens via resolveMcpAuth. */ import { z } from '@hono/zod-openapi'; import type { OAuthToken } from '../mcp/auth/types'; diff --git a/packages/trueforge/src/schemas/session.ts b/packages/trueforge/src/schemas/session.ts index 438f25708..94f4b688f 100644 --- a/packages/trueforge/src/schemas/session.ts +++ b/packages/trueforge/src/schemas/session.ts @@ -1,7 +1,7 @@ /** Server session wire schemas. Core Session lives in agentSession. */ import { z } from '@hono/zod-openapi'; import { AgentSpecSchema, SessionSchema, TokenPaginationSchema } from '@truefoundry/trueforge-core/agent-session'; -import { NameSchema } from './common'; +import { DEFAULT_PAGE_LIMIT, MAX_PAGE_LIMIT, NameSchema } from './common'; /** Create arm: bind by unique registry agent name. */ export const SessionAgentNameRefSchema = z.object({ name: NameSchema }).strict().openapi('SessionAgentNameRef'); @@ -43,9 +43,6 @@ export const UpdateSessionRequestSchema = z export type { Session } from '@truefoundry/trueforge-core/agent-session'; -export const DEFAULT_SESSIONS_LIMIT = 10; -export const SESSIONS_MAX_LIMIT = 100; - /** Wire ISO-8601 (RFC 3339, offsets allowed) → Date for the store. */ const IsoTimestampQueryParam = z.iso .datetime({ offset: true }) @@ -58,10 +55,10 @@ export const ListSessionsRequestQuerySchema = z .number() .int() .min(1) - .max(SESSIONS_MAX_LIMIT) + .max(MAX_PAGE_LIMIT) .optional() - .default(DEFAULT_SESSIONS_LIMIT) - .describe(`Page size. Defaults to ${String(DEFAULT_SESSIONS_LIMIT)}, max ${String(SESSIONS_MAX_LIMIT)}.`), + .default(DEFAULT_PAGE_LIMIT) + .describe(`Page size. Defaults to ${String(DEFAULT_PAGE_LIMIT)}, max ${String(MAX_PAGE_LIMIT)}.`), order: z .enum(['asc', 'desc']) .optional() diff --git a/packages/trueforge/src/schemas/turn.ts b/packages/trueforge/src/schemas/turn.ts index 9f8125b31..2c6f96410 100644 --- a/packages/trueforge/src/schemas/turn.ts +++ b/packages/trueforge/src/schemas/turn.ts @@ -1,6 +1,7 @@ /** Server-only turn wire schemas (SSE resume / cancel / list). Core turn schemas live in agent-session. */ import { z } from '@hono/zod-openapi'; import { SessionEventSchema, TokenPaginationSchema, TurnSchema } from '@truefoundry/trueforge-core/agent-session'; +import { DEFAULT_EVENTS_PAGE_LIMIT, DEFAULT_PAGE_LIMIT, MAX_PAGE_LIMIT } from './common'; export { CreateTurnRequestSchema, TurnSchema } from '@truefoundry/trueforge-core/agent-session'; export type { Turn } from '@truefoundry/trueforge-core/agent-session'; @@ -34,19 +35,16 @@ export const CancelSessionResponseSchema = z .describe('Empty success body. HTTP 200 means the cancel request was accepted (or nothing was running).') .openapi('CancelSessionResponse'); -export const DEFAULT_TURNS_LIMIT = 10; -export const TURNS_MAX_LIMIT = 100; - export const ListTurnsRequestQuerySchema = z .object({ limit: z.coerce .number() .int() .min(1) - .max(TURNS_MAX_LIMIT) + .max(MAX_PAGE_LIMIT) .optional() - .default(DEFAULT_TURNS_LIMIT) - .describe(`Page size. Defaults to ${String(DEFAULT_TURNS_LIMIT)}, max ${String(TURNS_MAX_LIMIT)}.`), + .default(DEFAULT_PAGE_LIMIT) + .describe(`Page size. Defaults to ${String(DEFAULT_PAGE_LIMIT)}, max ${String(MAX_PAGE_LIMIT)}.`), page_token: z.string().optional().describe('Opaque token from a previous response `next_page_token`.'), }) .openapi('ListTurnsRequestQuery'); @@ -64,21 +62,16 @@ export const ListTurnsResponseSchema = z }) .openapi('ListTurnsResponse'); -export const DEFAULT_TURN_EVENTS_LIMIT = 25; -export const TURN_EVENTS_MAX_LIMIT = 100; - export const ListTurnEventsRequestQuerySchema = z .object({ limit: z.coerce .number() .int() .min(1) - .max(TURN_EVENTS_MAX_LIMIT) + .max(MAX_PAGE_LIMIT) .optional() - .default(DEFAULT_TURN_EVENTS_LIMIT) - .describe( - `Max events per response. Default ${String(DEFAULT_TURN_EVENTS_LIMIT)}, max ${String(TURN_EVENTS_MAX_LIMIT)}.`, - ), + .default(DEFAULT_EVENTS_PAGE_LIMIT) + .describe(`Page size. Defaults to ${String(DEFAULT_EVENTS_PAGE_LIMIT)}, max ${String(MAX_PAGE_LIMIT)}.`), page_token: z.string().optional().describe('Opaque token from a previous response `next_page_token`.'), order: z .enum(['asc', 'desc']) diff --git a/packages/trueforge/tests/unit/apis/mcpServers.test.ts b/packages/trueforge/tests/unit/apis/mcpServers.test.ts index 636f0c8e5..f7e462da0 100644 --- a/packages/trueforge/tests/unit/apis/mcpServers.test.ts +++ b/packages/trueforge/tests/unit/apis/mcpServers.test.ts @@ -151,7 +151,7 @@ describe('mcp-servers routers', () => { globalThis.fetch = originalFetch; }); - it('GET /catalog/mcp-servers returns the shipped catalog verbatim', async () => { + it('GET /catalogs/mcp-servers returns the shipped catalog verbatim', async () => { const response = await catalogRouter.request('/mcp-servers'); expect(response.status).toBe(200); const body = (await response.json()) as { data: { name: string }[] }; diff --git a/packages/trueforge/tests/unit/apis/modelProviders.test.ts b/packages/trueforge/tests/unit/apis/modelProviders.test.ts index f0f34e807..29247b273 100644 --- a/packages/trueforge/tests/unit/apis/modelProviders.test.ts +++ b/packages/trueforge/tests/unit/apis/modelProviders.test.ts @@ -126,7 +126,7 @@ describe('settings model-providers and models routers', () => { ({ settingsRouter, catalogRouter, modelsRouter } = await createRouters()); }); - it('GET /catalog/model-providers returns shipped presets plus a custom sentinel', async () => { + it('GET /catalogs/model-providers returns shipped presets plus a custom sentinel', async () => { const response = await catalogRouter.request('/model-providers'); expect(response.status).toBe(200); const body = (await response.json()) as { diff --git a/packages/trueforge/tests/unit/apis/sandboxFileDownload.test.ts b/packages/trueforge/tests/unit/apis/sandboxFileDownload.test.ts index f6c181759..fd80dee47 100644 --- a/packages/trueforge/tests/unit/apis/sandboxFileDownload.test.ts +++ b/packages/trueforge/tests/unit/apis/sandboxFileDownload.test.ts @@ -62,10 +62,10 @@ function downloadUrl({ turnId?: string; path: string; }): string { - return `http://localhost/${sessionId}/turns/${turnId}/download?path=${encodeURIComponent(path)}`; + return `http://localhost/${sessionId}/turns/${turnId}/download-sandbox-file?path=${encodeURIComponent(path)}`; } -describe('GET /{session_id}/turns/{turn_id}/download', () => { +describe('GET /{session_id}/turns/{turn_id}/download-sandbox-file', () => { it('rejects a malformed path before touching the session', async () => { const { app } = await buildApp(); diff --git a/packages/trueforge/tests/unit/apis/sandboxProviders.test.ts b/packages/trueforge/tests/unit/apis/sandboxProviders.test.ts index 4afc39067..fa2220862 100644 --- a/packages/trueforge/tests/unit/apis/sandboxProviders.test.ts +++ b/packages/trueforge/tests/unit/apis/sandboxProviders.test.ts @@ -123,7 +123,7 @@ describe('sandboxProviders router', () => { }); }); - it('GET /catalog/sandbox-providers returns the shipped catalog verbatim', async () => { + it('GET /catalogs/sandbox-providers returns the shipped catalog verbatim', async () => { const response = await catalogRouter.request('/sandbox-providers'); expect(response.status).toBe(200); expect(await response.json()).toEqual({ data: [...SandboxCatalog.load().list()] }); diff --git a/packages/trueforge/tests/unit/apis/skills.test.ts b/packages/trueforge/tests/unit/apis/skills.test.ts index a03783db1..2aaecdf41 100644 --- a/packages/trueforge/tests/unit/apis/skills.test.ts +++ b/packages/trueforge/tests/unit/apis/skills.test.ts @@ -66,7 +66,7 @@ describe('skills routers', () => { }); }); - it('GET /catalog/skills returns the shipped catalog verbatim', async () => { + it('GET /catalogs/skills returns the shipped catalog verbatim', async () => { const response = await catalogRouter.request('/skills'); expect(response.status).toBe(200); const body = (await response.json()) as { data: { name: string }[] }; diff --git a/packages/trueforge/tests/unit/apis/turns.test.ts b/packages/trueforge/tests/unit/apis/turns.test.ts index 5a0cd7137..a15ab0bda 100644 --- a/packages/trueforge/tests/unit/apis/turns.test.ts +++ b/packages/trueforge/tests/unit/apis/turns.test.ts @@ -91,7 +91,7 @@ describe('turns', () => { expect(await subscribeResponse.json()).toEqual(forbiddenAccess); const downloadResponse = await app.request( - `/s1/turns/any-turn/download?path=${encodeURIComponent('/workspace/report.pdf')}`, + `/s1/turns/any-turn/download-sandbox-file?path=${encodeURIComponent('/workspace/report.pdf')}`, ); expect(downloadResponse.status).toBe(403); expect(await downloadResponse.json()).toEqual(forbiddenAccess); From c3e28fb0428f4bcf0752f733bc4b04dc7c9b03ee Mon Sep 17 00:00:00 2001 From: "trueforge-dev-bot[bot]" Date: Tue, 18 Aug 2026 10:57:03 +0000 Subject: [PATCH 2/9] Regenerate OpenAPI document and TypeScript SDK --- ...60818105703-regenerate-sdk-from-openapi.md | 5 + .github/fern/openapi/openapi.json | 195 +++++++++--------- docs/openapi.json | 195 +++++++++--------- packages/trueforge-sdk/package.json | 60 +++--- packages/trueforge-sdk/reference.md | 166 +++++++-------- packages/trueforge-sdk/src/Client.ts | 8 +- .../{catalog => catalogs}/client/Client.ts | 8 +- .../{catalog => catalogs}/client/index.ts | 0 .../{catalog => catalogs}/exports.ts | 2 +- .../resources/{catalog => catalogs}/index.ts | 0 .../{catalog => catalogs}/resources/index.ts | 0 .../resources/mcpServers/client/Client.ts | 6 +- .../resources/mcpServers/client/index.ts | 0 .../resources/mcpServers/exports.ts | 0 .../resources/mcpServers/index.ts | 0 .../resources/modelProviders/client/Client.ts | 6 +- .../resources/modelProviders/client/index.ts | 0 .../resources/modelProviders/exports.ts | 0 .../resources/modelProviders/index.ts | 0 .../sandboxProviders/client/Client.ts | 6 +- .../sandboxProviders/client/index.ts | 0 .../resources/sandboxProviders/exports.ts | 0 .../resources/sandboxProviders/index.ts | 0 .../resources/skills/client/Client.ts | 6 +- .../resources/skills/client/index.ts | 0 .../resources/skills/exports.ts | 0 .../resources/skills/index.ts | 0 .../trueforge-sdk/src/api/resources/index.ts | 2 +- .../api/resources/mcpServers/client/Client.ts | 124 +++++++++++ .../api/resources/sessions/client/Client.ts | 6 +- .../requests/ListEventsSessionsRequest.ts | 2 +- .../requests/ListTurnEventsSessionsRequest.ts | 2 +- .../resources/mcpServers/client/Client.ts | 132 +----------- .../resources/modelProviders/client/Client.ts | 8 +- .../sandboxProviders/client/Client.ts | 8 +- .../resources/skills/client/Client.ts | 8 +- .../{catalog => catalogs}/mcpServers.test.ts | 8 +- .../modelProviders.test.ts | 8 +- .../sandboxProviders.test.ts | 8 +- .../wire/{catalog => catalogs}/skills.test.ts | 8 +- .../tests/wire/mcpServers.test.ts | 100 +++++++++ .../tests/wire/settings/mcpServers.test.ts | 112 +--------- .../wire/settings/modelProviders.test.ts | 8 +- .../wire/settings/sandboxProviders.test.ts | 12 +- .../tests/wire/settings/skills.test.ts | 8 +- 45 files changed, 615 insertions(+), 612 deletions(-) create mode 100644 .changeset/20260818105703-regenerate-sdk-from-openapi.md rename packages/trueforge-sdk/src/api/resources/{catalog => catalogs}/client/Client.ts (91%) rename packages/trueforge-sdk/src/api/resources/{catalog => catalogs}/client/index.ts (100%) rename packages/trueforge-sdk/src/api/resources/{catalog => catalogs}/exports.ts (72%) rename packages/trueforge-sdk/src/api/resources/{catalog => catalogs}/index.ts (100%) rename packages/trueforge-sdk/src/api/resources/{catalog => catalogs}/resources/index.ts (100%) rename packages/trueforge-sdk/src/api/resources/{catalog => catalogs}/resources/mcpServers/client/Client.ts (96%) rename packages/trueforge-sdk/src/api/resources/{catalog => catalogs}/resources/mcpServers/client/index.ts (100%) rename packages/trueforge-sdk/src/api/resources/{catalog => catalogs}/resources/mcpServers/exports.ts (100%) rename packages/trueforge-sdk/src/api/resources/{catalog => catalogs}/resources/mcpServers/index.ts (100%) rename packages/trueforge-sdk/src/api/resources/{catalog => catalogs}/resources/modelProviders/client/Client.ts (96%) rename packages/trueforge-sdk/src/api/resources/{catalog => catalogs}/resources/modelProviders/client/index.ts (100%) rename packages/trueforge-sdk/src/api/resources/{catalog => catalogs}/resources/modelProviders/exports.ts (100%) rename packages/trueforge-sdk/src/api/resources/{catalog => catalogs}/resources/modelProviders/index.ts (100%) rename packages/trueforge-sdk/src/api/resources/{catalog => catalogs}/resources/sandboxProviders/client/Client.ts (96%) rename packages/trueforge-sdk/src/api/resources/{catalog => catalogs}/resources/sandboxProviders/client/index.ts (100%) rename packages/trueforge-sdk/src/api/resources/{catalog => catalogs}/resources/sandboxProviders/exports.ts (100%) rename packages/trueforge-sdk/src/api/resources/{catalog => catalogs}/resources/sandboxProviders/index.ts (100%) rename packages/trueforge-sdk/src/api/resources/{catalog => catalogs}/resources/skills/client/Client.ts (96%) rename packages/trueforge-sdk/src/api/resources/{catalog => catalogs}/resources/skills/client/index.ts (100%) rename packages/trueforge-sdk/src/api/resources/{catalog => catalogs}/resources/skills/exports.ts (100%) rename packages/trueforge-sdk/src/api/resources/{catalog => catalogs}/resources/skills/index.ts (100%) rename packages/trueforge-sdk/tests/wire/{catalog => catalogs}/mcpServers.test.ts (89%) rename packages/trueforge-sdk/tests/wire/{catalog => catalogs}/modelProviders.test.ts (88%) rename packages/trueforge-sdk/tests/wire/{catalog => catalogs}/sandboxProviders.test.ts (88%) rename packages/trueforge-sdk/tests/wire/{catalog => catalogs}/skills.test.ts (88%) diff --git a/.changeset/20260818105703-regenerate-sdk-from-openapi.md b/.changeset/20260818105703-regenerate-sdk-from-openapi.md new file mode 100644 index 000000000..91f0e5bcc --- /dev/null +++ b/.changeset/20260818105703-regenerate-sdk-from-openapi.md @@ -0,0 +1,5 @@ +--- +'@truefoundry/trueforge-sdk': patch +--- + +Regenerate SDK from updated OpenAPI spec. diff --git a/.github/fern/openapi/openapi.json b/.github/fern/openapi/openapi.json index 531098b55..5a4653d94 100644 --- a/.github/fern/openapi/openapi.json +++ b/.github/fern/openapi/openapi.json @@ -4185,7 +4185,7 @@ "info": { "description": "HTTP API for the TrueForge agent server (`/api/v1`). Interactive docs are served at `/api/v1/docs` (OpenAPI JSON at `/api/v1/openapi.json`).\n\n**Authentication:** Standalone deployments (no OIDC) accept requests without credentials — middleware stamps a local default user. When OIDC is configured, protected routes require a valid `id_token` cookie or `Authorization: Bearer` ID token. There is no built-in API-key scheme; pass custom headers only if your reverse proxy or IdP layer requires them.\n\nCovers DB-backed sessions, the agent registry, settings catalogs, and model/MCP/skill/sandbox providers.", "title": "TrueForge API", - "version": "0.1.1" + "version": "0.1.2" }, "openapi": "3.1.0", "paths": { @@ -4634,7 +4634,7 @@ "x-fern-sdk-method-name": "get_capabilities" } }, - "/api/v1/catalog/mcp-servers": { + "/api/v1/catalogs/mcp-servers": { "get": { "description": "Shipped MCP server presets (discovery-only). Copy into PUT /settings/mcp-servers to configure.", "responses": { @@ -4664,13 +4664,13 @@ "Catalog" ], "x-fern-sdk-group-name": [ - "catalog", + "catalogs", "mcpServers" ], "x-fern-sdk-method-name": "list" } }, - "/api/v1/catalog/model-providers": { + "/api/v1/catalogs/model-providers": { "get": { "description": "Shipped model-provider presets (discovery-only). Copy into PUT /settings/model-providers to configure. Includes a `custom` sentinel with `supported_reasoning_efforts`.", "responses": { @@ -4700,13 +4700,13 @@ "Catalog" ], "x-fern-sdk-group-name": [ - "catalog", + "catalogs", "modelProviders" ], "x-fern-sdk-method-name": "list" } }, - "/api/v1/catalog/sandbox-providers": { + "/api/v1/catalogs/sandbox-providers": { "get": { "description": "Shipped sandbox-provider presets (discovery-only). Copy into PUT /settings/sandbox-providers to configure.", "responses": { @@ -4736,13 +4736,13 @@ "Catalog" ], "x-fern-sdk-group-name": [ - "catalog", + "catalogs", "sandboxProviders" ], "x-fern-sdk-method-name": "list" } }, - "/api/v1/catalog/skills": { + "/api/v1/catalogs/skills": { "get": { "description": "Shipped skill presets (discovery-only). Copy into PUT /settings/skills to configure.", "responses": { @@ -4772,7 +4772,7 @@ "Catalog" ], "x-fern-sdk-group-name": [ - "catalog", + "catalogs", "skills" ], "x-fern-sdk-method-name": "list" @@ -5059,6 +5059,84 @@ "x-fern-sdk-method-name": "authorize" } }, + "/api/v1/mcp-servers/{name}/tools": { + "get": { + "description": "All tools exposed by the given MCP server (non-paginated), as returned by the MCP `tools/list` call.", + "parameters": [ + { + "description": "MCP server name.", + "in": "path", + "name": "name", + "required": true, + "schema": { + "description": "MCP server name.", + "minLength": 1, + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListMcpServerToolsResponse" + } + } + }, + "description": "All tools of the MCP server." + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestErrorResponse" + } + } + }, + "description": "OIDC is configured and the request has no valid session cookie." + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestErrorResponse" + } + } + }, + "description": "MCP server not found." + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestErrorResponse" + } + } + }, + "description": "The MCP server requires authentication (does not trigger browser OIDC login)." + }, + "502": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestErrorResponse" + } + } + }, + "description": "The MCP server could not be reached or returned an error." + } + }, + "summary": "List tools of an MCP server", + "tags": [ + "MCP Servers" + ], + "x-fern-sdk-group-name": [ + "mcpServers" + ], + "x-fern-sdk-method-name": "list_tools" + } + }, "/api/v1/models": { "get": { "description": "Models across all configured model providers, addressed by fully qualified name `name/model_name`.", @@ -5567,13 +5645,13 @@ } }, { - "description": "Max events per response. Default 100, max 100.", + "description": "Page size. Defaults to 25, max 100.", "in": "query", "name": "limit", "required": false, "schema": { - "default": 100, - "description": "Max events per response. Default 100, max 100.", + "default": 25, + "description": "Page size. Defaults to 25, max 100.", "maximum": 100, "minimum": 1, "type": "integer" @@ -5927,7 +6005,7 @@ "x-fern-sdk-method-name": "get_turn" } }, - "/api/v1/sessions/{session_id}/turns/{turn_id}/download": { + "/api/v1/sessions/{session_id}/turns/{turn_id}/download-sandbox-file": { "get": { "description": "Download a file from the sandbox this turn ran in. Paths come from the assistant's `sandbox_artifacts` block. Only the session creator (`created_by`) may download.", "parameters": [ @@ -6087,13 +6165,13 @@ } }, { - "description": "Max events per response. Default 25, max 100.", + "description": "Page size. Defaults to 25, max 100.", "in": "query", "name": "limit", "required": false, "schema": { "default": 25, - "description": "Max events per response. Default 25, max 100.", + "description": "Page size. Defaults to 25, max 100.", "maximum": 100, "minimum": 1, "type": "integer" @@ -6445,7 +6523,7 @@ "settings", "mcpServers" ], - "x-fern-sdk-method-name": "upsert" + "x-fern-sdk-method-name": "create_or_update" } }, "/api/v1/settings/mcp-servers/{name}": { @@ -6497,85 +6575,6 @@ "x-fern-sdk-method-name": "get" } }, - "/api/v1/settings/mcp-servers/{name}/tools": { - "get": { - "description": "All tools exposed by the given MCP server (non-paginated), as returned by the MCP `tools/list` call.", - "parameters": [ - { - "description": "MCP server name.", - "in": "path", - "name": "name", - "required": true, - "schema": { - "description": "MCP server name.", - "minLength": 1, - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListMcpServerToolsResponse" - } - } - }, - "description": "All tools of the MCP server." - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RequestErrorResponse" - } - } - }, - "description": "Harness session login required." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RequestErrorResponse" - } - } - }, - "description": "MCP server not found." - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RequestErrorResponse" - } - } - }, - "description": "The MCP server requires authentication (does not trigger browser OIDC login)." - }, - "502": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RequestErrorResponse" - } - } - }, - "description": "The MCP server could not be reached or returned an error." - } - }, - "summary": "List tools of an MCP server", - "tags": [ - "MCP Servers" - ], - "x-fern-sdk-group-name": [ - "settings", - "mcpServers" - ], - "x-fern-sdk-method-name": "list_tools" - } - }, "/api/v1/settings/model-providers": { "get": { "description": "All configured providers with nested manifests.", @@ -6717,7 +6716,7 @@ "settings", "modelProviders" ], - "x-fern-sdk-method-name": "upsert" + "x-fern-sdk-method-name": "create_or_update" } }, "/api/v1/settings/sandbox-providers": { @@ -6807,7 +6806,7 @@ "settings", "sandboxProviders" ], - "x-fern-sdk-method-name": "upsert" + "x-fern-sdk-method-name": "create_or_update" } }, "/api/v1/settings/skills": { @@ -6951,7 +6950,7 @@ "settings", "skills" ], - "x-fern-sdk-method-name": "upsert" + "x-fern-sdk-method-name": "create_or_update" } }, "/api/v1/skills": { diff --git a/docs/openapi.json b/docs/openapi.json index 531098b55..5a4653d94 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -4185,7 +4185,7 @@ "info": { "description": "HTTP API for the TrueForge agent server (`/api/v1`). Interactive docs are served at `/api/v1/docs` (OpenAPI JSON at `/api/v1/openapi.json`).\n\n**Authentication:** Standalone deployments (no OIDC) accept requests without credentials — middleware stamps a local default user. When OIDC is configured, protected routes require a valid `id_token` cookie or `Authorization: Bearer` ID token. There is no built-in API-key scheme; pass custom headers only if your reverse proxy or IdP layer requires them.\n\nCovers DB-backed sessions, the agent registry, settings catalogs, and model/MCP/skill/sandbox providers.", "title": "TrueForge API", - "version": "0.1.1" + "version": "0.1.2" }, "openapi": "3.1.0", "paths": { @@ -4634,7 +4634,7 @@ "x-fern-sdk-method-name": "get_capabilities" } }, - "/api/v1/catalog/mcp-servers": { + "/api/v1/catalogs/mcp-servers": { "get": { "description": "Shipped MCP server presets (discovery-only). Copy into PUT /settings/mcp-servers to configure.", "responses": { @@ -4664,13 +4664,13 @@ "Catalog" ], "x-fern-sdk-group-name": [ - "catalog", + "catalogs", "mcpServers" ], "x-fern-sdk-method-name": "list" } }, - "/api/v1/catalog/model-providers": { + "/api/v1/catalogs/model-providers": { "get": { "description": "Shipped model-provider presets (discovery-only). Copy into PUT /settings/model-providers to configure. Includes a `custom` sentinel with `supported_reasoning_efforts`.", "responses": { @@ -4700,13 +4700,13 @@ "Catalog" ], "x-fern-sdk-group-name": [ - "catalog", + "catalogs", "modelProviders" ], "x-fern-sdk-method-name": "list" } }, - "/api/v1/catalog/sandbox-providers": { + "/api/v1/catalogs/sandbox-providers": { "get": { "description": "Shipped sandbox-provider presets (discovery-only). Copy into PUT /settings/sandbox-providers to configure.", "responses": { @@ -4736,13 +4736,13 @@ "Catalog" ], "x-fern-sdk-group-name": [ - "catalog", + "catalogs", "sandboxProviders" ], "x-fern-sdk-method-name": "list" } }, - "/api/v1/catalog/skills": { + "/api/v1/catalogs/skills": { "get": { "description": "Shipped skill presets (discovery-only). Copy into PUT /settings/skills to configure.", "responses": { @@ -4772,7 +4772,7 @@ "Catalog" ], "x-fern-sdk-group-name": [ - "catalog", + "catalogs", "skills" ], "x-fern-sdk-method-name": "list" @@ -5059,6 +5059,84 @@ "x-fern-sdk-method-name": "authorize" } }, + "/api/v1/mcp-servers/{name}/tools": { + "get": { + "description": "All tools exposed by the given MCP server (non-paginated), as returned by the MCP `tools/list` call.", + "parameters": [ + { + "description": "MCP server name.", + "in": "path", + "name": "name", + "required": true, + "schema": { + "description": "MCP server name.", + "minLength": 1, + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListMcpServerToolsResponse" + } + } + }, + "description": "All tools of the MCP server." + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestErrorResponse" + } + } + }, + "description": "OIDC is configured and the request has no valid session cookie." + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestErrorResponse" + } + } + }, + "description": "MCP server not found." + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestErrorResponse" + } + } + }, + "description": "The MCP server requires authentication (does not trigger browser OIDC login)." + }, + "502": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RequestErrorResponse" + } + } + }, + "description": "The MCP server could not be reached or returned an error." + } + }, + "summary": "List tools of an MCP server", + "tags": [ + "MCP Servers" + ], + "x-fern-sdk-group-name": [ + "mcpServers" + ], + "x-fern-sdk-method-name": "list_tools" + } + }, "/api/v1/models": { "get": { "description": "Models across all configured model providers, addressed by fully qualified name `name/model_name`.", @@ -5567,13 +5645,13 @@ } }, { - "description": "Max events per response. Default 100, max 100.", + "description": "Page size. Defaults to 25, max 100.", "in": "query", "name": "limit", "required": false, "schema": { - "default": 100, - "description": "Max events per response. Default 100, max 100.", + "default": 25, + "description": "Page size. Defaults to 25, max 100.", "maximum": 100, "minimum": 1, "type": "integer" @@ -5927,7 +6005,7 @@ "x-fern-sdk-method-name": "get_turn" } }, - "/api/v1/sessions/{session_id}/turns/{turn_id}/download": { + "/api/v1/sessions/{session_id}/turns/{turn_id}/download-sandbox-file": { "get": { "description": "Download a file from the sandbox this turn ran in. Paths come from the assistant's `sandbox_artifacts` block. Only the session creator (`created_by`) may download.", "parameters": [ @@ -6087,13 +6165,13 @@ } }, { - "description": "Max events per response. Default 25, max 100.", + "description": "Page size. Defaults to 25, max 100.", "in": "query", "name": "limit", "required": false, "schema": { "default": 25, - "description": "Max events per response. Default 25, max 100.", + "description": "Page size. Defaults to 25, max 100.", "maximum": 100, "minimum": 1, "type": "integer" @@ -6445,7 +6523,7 @@ "settings", "mcpServers" ], - "x-fern-sdk-method-name": "upsert" + "x-fern-sdk-method-name": "create_or_update" } }, "/api/v1/settings/mcp-servers/{name}": { @@ -6497,85 +6575,6 @@ "x-fern-sdk-method-name": "get" } }, - "/api/v1/settings/mcp-servers/{name}/tools": { - "get": { - "description": "All tools exposed by the given MCP server (non-paginated), as returned by the MCP `tools/list` call.", - "parameters": [ - { - "description": "MCP server name.", - "in": "path", - "name": "name", - "required": true, - "schema": { - "description": "MCP server name.", - "minLength": 1, - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListMcpServerToolsResponse" - } - } - }, - "description": "All tools of the MCP server." - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RequestErrorResponse" - } - } - }, - "description": "Harness session login required." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RequestErrorResponse" - } - } - }, - "description": "MCP server not found." - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RequestErrorResponse" - } - } - }, - "description": "The MCP server requires authentication (does not trigger browser OIDC login)." - }, - "502": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RequestErrorResponse" - } - } - }, - "description": "The MCP server could not be reached or returned an error." - } - }, - "summary": "List tools of an MCP server", - "tags": [ - "MCP Servers" - ], - "x-fern-sdk-group-name": [ - "settings", - "mcpServers" - ], - "x-fern-sdk-method-name": "list_tools" - } - }, "/api/v1/settings/model-providers": { "get": { "description": "All configured providers with nested manifests.", @@ -6717,7 +6716,7 @@ "settings", "modelProviders" ], - "x-fern-sdk-method-name": "upsert" + "x-fern-sdk-method-name": "create_or_update" } }, "/api/v1/settings/sandbox-providers": { @@ -6807,7 +6806,7 @@ "settings", "sandboxProviders" ], - "x-fern-sdk-method-name": "upsert" + "x-fern-sdk-method-name": "create_or_update" } }, "/api/v1/settings/skills": { @@ -6951,7 +6950,7 @@ "settings", "skills" ], - "x-fern-sdk-method-name": "upsert" + "x-fern-sdk-method-name": "create_or_update" } }, "/api/v1/skills": { diff --git a/packages/trueforge-sdk/package.json b/packages/trueforge-sdk/package.json index a756ce25a..6270796f6 100644 --- a/packages/trueforge-sdk/package.json +++ b/packages/trueforge-sdk/package.json @@ -106,60 +106,60 @@ }, "default": "./dist/cjs/api/resources/skills/exports.js" }, - "./catalog": { + "./catalogs": { "import": { - "types": "./dist/esm/api/resources/catalog/exports.d.mts", - "default": "./dist/esm/api/resources/catalog/exports.mjs" + "types": "./dist/esm/api/resources/catalogs/exports.d.mts", + "default": "./dist/esm/api/resources/catalogs/exports.mjs" }, "require": { - "types": "./dist/cjs/api/resources/catalog/exports.d.ts", - "default": "./dist/cjs/api/resources/catalog/exports.js" + "types": "./dist/cjs/api/resources/catalogs/exports.d.ts", + "default": "./dist/cjs/api/resources/catalogs/exports.js" }, - "default": "./dist/cjs/api/resources/catalog/exports.js" + "default": "./dist/cjs/api/resources/catalogs/exports.js" }, - "./catalog/mcpServers": { + "./catalogs/mcpServers": { "import": { - "types": "./dist/esm/api/resources/catalog/resources/mcpServers/exports.d.mts", - "default": "./dist/esm/api/resources/catalog/resources/mcpServers/exports.mjs" + "types": "./dist/esm/api/resources/catalogs/resources/mcpServers/exports.d.mts", + "default": "./dist/esm/api/resources/catalogs/resources/mcpServers/exports.mjs" }, "require": { - "types": "./dist/cjs/api/resources/catalog/resources/mcpServers/exports.d.ts", - "default": "./dist/cjs/api/resources/catalog/resources/mcpServers/exports.js" + "types": "./dist/cjs/api/resources/catalogs/resources/mcpServers/exports.d.ts", + "default": "./dist/cjs/api/resources/catalogs/resources/mcpServers/exports.js" }, - "default": "./dist/cjs/api/resources/catalog/resources/mcpServers/exports.js" + "default": "./dist/cjs/api/resources/catalogs/resources/mcpServers/exports.js" }, - "./catalog/modelProviders": { + "./catalogs/modelProviders": { "import": { - "types": "./dist/esm/api/resources/catalog/resources/modelProviders/exports.d.mts", - "default": "./dist/esm/api/resources/catalog/resources/modelProviders/exports.mjs" + "types": "./dist/esm/api/resources/catalogs/resources/modelProviders/exports.d.mts", + "default": "./dist/esm/api/resources/catalogs/resources/modelProviders/exports.mjs" }, "require": { - "types": "./dist/cjs/api/resources/catalog/resources/modelProviders/exports.d.ts", - "default": "./dist/cjs/api/resources/catalog/resources/modelProviders/exports.js" + "types": "./dist/cjs/api/resources/catalogs/resources/modelProviders/exports.d.ts", + "default": "./dist/cjs/api/resources/catalogs/resources/modelProviders/exports.js" }, - "default": "./dist/cjs/api/resources/catalog/resources/modelProviders/exports.js" + "default": "./dist/cjs/api/resources/catalogs/resources/modelProviders/exports.js" }, - "./catalog/sandboxProviders": { + "./catalogs/sandboxProviders": { "import": { - "types": "./dist/esm/api/resources/catalog/resources/sandboxProviders/exports.d.mts", - "default": "./dist/esm/api/resources/catalog/resources/sandboxProviders/exports.mjs" + "types": "./dist/esm/api/resources/catalogs/resources/sandboxProviders/exports.d.mts", + "default": "./dist/esm/api/resources/catalogs/resources/sandboxProviders/exports.mjs" }, "require": { - "types": "./dist/cjs/api/resources/catalog/resources/sandboxProviders/exports.d.ts", - "default": "./dist/cjs/api/resources/catalog/resources/sandboxProviders/exports.js" + "types": "./dist/cjs/api/resources/catalogs/resources/sandboxProviders/exports.d.ts", + "default": "./dist/cjs/api/resources/catalogs/resources/sandboxProviders/exports.js" }, - "default": "./dist/cjs/api/resources/catalog/resources/sandboxProviders/exports.js" + "default": "./dist/cjs/api/resources/catalogs/resources/sandboxProviders/exports.js" }, - "./catalog/skills": { + "./catalogs/skills": { "import": { - "types": "./dist/esm/api/resources/catalog/resources/skills/exports.d.mts", - "default": "./dist/esm/api/resources/catalog/resources/skills/exports.mjs" + "types": "./dist/esm/api/resources/catalogs/resources/skills/exports.d.mts", + "default": "./dist/esm/api/resources/catalogs/resources/skills/exports.mjs" }, "require": { - "types": "./dist/cjs/api/resources/catalog/resources/skills/exports.d.ts", - "default": "./dist/cjs/api/resources/catalog/resources/skills/exports.js" + "types": "./dist/cjs/api/resources/catalogs/resources/skills/exports.d.ts", + "default": "./dist/cjs/api/resources/catalogs/resources/skills/exports.js" }, - "default": "./dist/cjs/api/resources/catalog/resources/skills/exports.js" + "default": "./dist/cjs/api/resources/catalogs/resources/skills/exports.js" }, "./settings": { "import": { diff --git a/packages/trueforge-sdk/reference.md b/packages/trueforge-sdk/reference.md index 2562385d4..bd1a5c737 100644 --- a/packages/trueforge-sdk/reference.md +++ b/packages/trueforge-sdk/reference.md @@ -681,6 +681,69 @@ await client.mcpServers.deleteAuthorize("name"); + + + + +
client.mcpServers.listTools(name) -> TrueForge.ListMcpServerToolsResponse +
+
+ +#### 📝 Description + +
+
+ +
+
+ +All tools exposed by the given MCP server (non-paginated), as returned by the MCP `tools/list` call. +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.mcpServers.listTools("name"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**name:** `string` — MCP server name. + +
+
+ +
+
+ +**requestOptions:** `McpServersClient.RequestOptions` + +
+
+
+
+ +
@@ -1804,8 +1867,8 @@ await client.skills.list(); -## Catalog McpServers -
client.catalog.mcpServers.list() -> TrueForge.GetMcpServerCatalogResponse +## Catalogs McpServers +
client.catalogs.mcpServers.list() -> TrueForge.GetMcpServerCatalogResponse
@@ -1832,7 +1895,7 @@ Shipped MCP server presets (discovery-only). Copy into PUT /settings/mcp-servers
```typescript -await client.catalog.mcpServers.list(); +await client.catalogs.mcpServers.list(); ```
@@ -1860,8 +1923,8 @@ await client.catalog.mcpServers.list();
-## Catalog ModelProviders -
client.catalog.modelProviders.list() -> TrueForge.GetModelProviderCatalogResponse +## Catalogs ModelProviders +
client.catalogs.modelProviders.list() -> TrueForge.GetModelProviderCatalogResponse
@@ -1888,7 +1951,7 @@ Shipped model-provider presets (discovery-only). Copy into PUT /settings/model-p
```typescript -await client.catalog.modelProviders.list(); +await client.catalogs.modelProviders.list(); ```
@@ -1916,8 +1979,8 @@ await client.catalog.modelProviders.list();
-## Catalog SandboxProviders -
client.catalog.sandboxProviders.list() -> TrueForge.GetSandboxProviderCatalogResponse +## Catalogs SandboxProviders +
client.catalogs.sandboxProviders.list() -> TrueForge.GetSandboxProviderCatalogResponse
@@ -1944,7 +2007,7 @@ Shipped sandbox-provider presets (discovery-only). Copy into PUT /settings/sandb
```typescript -await client.catalog.sandboxProviders.list(); +await client.catalogs.sandboxProviders.list(); ```
@@ -1972,8 +2035,8 @@ await client.catalog.sandboxProviders.list();
-## Catalog Skills -
client.catalog.skills.list() -> TrueForge.GetSkillCatalogResponse +## Catalogs Skills +
client.catalogs.skills.list() -> TrueForge.GetSkillCatalogResponse
@@ -2000,7 +2063,7 @@ Shipped skill presets (discovery-only). Copy into PUT /settings/skills to config
```typescript -await client.catalog.skills.list(); +await client.catalogs.skills.list(); ```
@@ -2154,7 +2217,7 @@ await client.settings.mcpServers.create({
-
client.settings.mcpServers.upsert({ ...params }) -> TrueForge.GetMcpServerResponse +
client.settings.mcpServers.createOrUpdate({ ...params }) -> TrueForge.GetMcpServerResponse
@@ -2181,7 +2244,7 @@ Create or replace by `name`. Does not start DCR or change oauth client columns.
```typescript -await client.settings.mcpServers.upsert({ +await client.settings.mcpServers.createOrUpdate({ manifest: { description: "description", name: "name", @@ -2283,69 +2346,6 @@ await client.settings.mcpServers.get("name");
- - -
- -
client.settings.mcpServers.listTools(name) -> TrueForge.ListMcpServerToolsResponse -
-
- -#### 📝 Description - -
-
- -
-
- -All tools exposed by the given MCP server (non-paginated), as returned by the MCP `tools/list` call. -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.settings.mcpServers.listTools("name"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**name:** `string` — MCP server name. - -
-
- -
-
- -**requestOptions:** `McpServersClient.RequestOptions` - -
-
-
-
- -
@@ -2481,7 +2481,7 @@ await client.settings.modelProviders.create({
-
client.settings.modelProviders.upsert({ ...params }) -> TrueForge.GetModelProviderResponse +
client.settings.modelProviders.createOrUpdate({ ...params }) -> TrueForge.GetModelProviderResponse
@@ -2508,7 +2508,7 @@ Create or replace a provider (models included). Well-known types use `type` as `
```typescript -await client.settings.modelProviders.upsert({ +await client.settings.modelProviders.createOrUpdate({ manifest: { auth: { apiKey: "api_key" @@ -2612,7 +2612,7 @@ await client.settings.sandboxProviders.get();
-
client.settings.sandboxProviders.upsert({ ...params }) -> TrueForge.GetSandboxProviderResponse +
client.settings.sandboxProviders.createOrUpdate({ ...params }) -> TrueForge.GetSandboxProviderResponse
@@ -2639,7 +2639,7 @@ Upserts the single sandbox provider for this tenant: creates it or replaces its
```typescript -await client.settings.sandboxProviders.upsert({ +await client.settings.sandboxProviders.createOrUpdate({ manifest: { auth: { apiKey: "api_key" @@ -2813,7 +2813,7 @@ await client.settings.skills.create({
-
client.settings.skills.upsert({ ...params }) -> TrueForge.GetSkillResponse +
client.settings.skills.createOrUpdate({ ...params }) -> TrueForge.GetSkillResponse
@@ -2840,7 +2840,7 @@ Full upsert keyed by `name`: creates the skill or replaces its entire manifest.
```typescript -await client.settings.skills.upsert({ +await client.settings.skills.createOrUpdate({ manifest: { description: "description", name: "name", diff --git a/packages/trueforge-sdk/src/Client.ts b/packages/trueforge-sdk/src/Client.ts index f250cc59d..b3a61d0af 100644 --- a/packages/trueforge-sdk/src/Client.ts +++ b/packages/trueforge-sdk/src/Client.ts @@ -2,7 +2,7 @@ import { AgentsClient } from "./api/resources/agents/client/Client.js"; import { AuthClient } from "./api/resources/auth/client/Client.js"; -import { CatalogClient } from "./api/resources/catalog/client/Client.js"; +import { CatalogsClient } from "./api/resources/catalogs/client/Client.js"; import { McpServersClient } from "./api/resources/mcpServers/client/Client.js"; import { ModelsClient } from "./api/resources/models/client/Client.js"; import { ServerClient } from "./api/resources/server/client/Client.js"; @@ -28,7 +28,7 @@ export class TrueForge { protected _models: ModelsClient | undefined; protected _sessions: SessionsClient | undefined; protected _skills: SkillsClient | undefined; - protected _catalog: CatalogClient | undefined; + protected _catalogs: CatalogsClient | undefined; protected _settings: SettingsClient | undefined; constructor(options: TrueForge.Options) { @@ -63,8 +63,8 @@ export class TrueForge { return (this._skills ??= new SkillsClient(this._options)); } - public get catalog(): CatalogClient { - return (this._catalog ??= new CatalogClient(this._options)); + public get catalogs(): CatalogsClient { + return (this._catalogs ??= new CatalogsClient(this._options)); } public get settings(): SettingsClient { diff --git a/packages/trueforge-sdk/src/api/resources/catalog/client/Client.ts b/packages/trueforge-sdk/src/api/resources/catalogs/client/Client.ts similarity index 91% rename from packages/trueforge-sdk/src/api/resources/catalog/client/Client.ts rename to packages/trueforge-sdk/src/api/resources/catalogs/client/Client.ts index 5d8213162..79f2023b8 100644 --- a/packages/trueforge-sdk/src/api/resources/catalog/client/Client.ts +++ b/packages/trueforge-sdk/src/api/resources/catalogs/client/Client.ts @@ -7,18 +7,18 @@ import { ModelProvidersClient } from "../resources/modelProviders/client/Client. import { SandboxProvidersClient } from "../resources/sandboxProviders/client/Client.js"; import { SkillsClient } from "../resources/skills/client/Client.js"; -export declare namespace CatalogClient { +export declare namespace CatalogsClient { export type Options = BaseClientOptions; } -export class CatalogClient { - protected readonly _options: NormalizedClientOptionsWithAuth; +export class CatalogsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; protected _mcpServers: McpServersClient | undefined; protected _modelProviders: ModelProvidersClient | undefined; protected _sandboxProviders: SandboxProvidersClient | undefined; protected _skills: SkillsClient | undefined; - constructor(options: CatalogClient.Options) { + constructor(options: CatalogsClient.Options) { this._options = normalizeClientOptionsWithAuth(options); } diff --git a/packages/trueforge-sdk/src/api/resources/catalog/client/index.ts b/packages/trueforge-sdk/src/api/resources/catalogs/client/index.ts similarity index 100% rename from packages/trueforge-sdk/src/api/resources/catalog/client/index.ts rename to packages/trueforge-sdk/src/api/resources/catalogs/client/index.ts diff --git a/packages/trueforge-sdk/src/api/resources/catalog/exports.ts b/packages/trueforge-sdk/src/api/resources/catalogs/exports.ts similarity index 72% rename from packages/trueforge-sdk/src/api/resources/catalog/exports.ts rename to packages/trueforge-sdk/src/api/resources/catalogs/exports.ts index 157766f23..55fdf0980 100644 --- a/packages/trueforge-sdk/src/api/resources/catalog/exports.ts +++ b/packages/trueforge-sdk/src/api/resources/catalogs/exports.ts @@ -1,5 +1,5 @@ // This file was auto-generated by Fern from our API Definition. -export { CatalogClient } from "./client/Client.js"; +export { CatalogsClient } from "./client/Client.js"; export * from "./client/index.js"; export * from "./resources/index.js"; diff --git a/packages/trueforge-sdk/src/api/resources/catalog/index.ts b/packages/trueforge-sdk/src/api/resources/catalogs/index.ts similarity index 100% rename from packages/trueforge-sdk/src/api/resources/catalog/index.ts rename to packages/trueforge-sdk/src/api/resources/catalogs/index.ts diff --git a/packages/trueforge-sdk/src/api/resources/catalog/resources/index.ts b/packages/trueforge-sdk/src/api/resources/catalogs/resources/index.ts similarity index 100% rename from packages/trueforge-sdk/src/api/resources/catalog/resources/index.ts rename to packages/trueforge-sdk/src/api/resources/catalogs/resources/index.ts diff --git a/packages/trueforge-sdk/src/api/resources/catalog/resources/mcpServers/client/Client.ts b/packages/trueforge-sdk/src/api/resources/catalogs/resources/mcpServers/client/Client.ts similarity index 96% rename from packages/trueforge-sdk/src/api/resources/catalog/resources/mcpServers/client/Client.ts rename to packages/trueforge-sdk/src/api/resources/catalogs/resources/mcpServers/client/Client.ts index 60372ab8f..62d50034f 100644 --- a/packages/trueforge-sdk/src/api/resources/catalog/resources/mcpServers/client/Client.ts +++ b/packages/trueforge-sdk/src/api/resources/catalogs/resources/mcpServers/client/Client.ts @@ -32,7 +32,7 @@ export class McpServersClient { * @throws {@link errors.TrueForgeTimeoutError} * * @example - * await client.catalog.mcpServers.list() + * await client.catalogs.mcpServers.list() */ public list( requestOptions?: McpServersClient.RequestOptions, @@ -53,7 +53,7 @@ export class McpServersClient { url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)), - "api/v1/catalog/mcp-servers", + "api/v1/catalogs/mcp-servers", ), method: "GET", headers: _headers, @@ -99,6 +99,6 @@ export class McpServersClient { } } - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/v1/catalog/mcp-servers"); + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/v1/catalogs/mcp-servers"); } } diff --git a/packages/trueforge-sdk/src/api/resources/catalog/resources/mcpServers/client/index.ts b/packages/trueforge-sdk/src/api/resources/catalogs/resources/mcpServers/client/index.ts similarity index 100% rename from packages/trueforge-sdk/src/api/resources/catalog/resources/mcpServers/client/index.ts rename to packages/trueforge-sdk/src/api/resources/catalogs/resources/mcpServers/client/index.ts diff --git a/packages/trueforge-sdk/src/api/resources/catalog/resources/mcpServers/exports.ts b/packages/trueforge-sdk/src/api/resources/catalogs/resources/mcpServers/exports.ts similarity index 100% rename from packages/trueforge-sdk/src/api/resources/catalog/resources/mcpServers/exports.ts rename to packages/trueforge-sdk/src/api/resources/catalogs/resources/mcpServers/exports.ts diff --git a/packages/trueforge-sdk/src/api/resources/catalog/resources/mcpServers/index.ts b/packages/trueforge-sdk/src/api/resources/catalogs/resources/mcpServers/index.ts similarity index 100% rename from packages/trueforge-sdk/src/api/resources/catalog/resources/mcpServers/index.ts rename to packages/trueforge-sdk/src/api/resources/catalogs/resources/mcpServers/index.ts diff --git a/packages/trueforge-sdk/src/api/resources/catalog/resources/modelProviders/client/Client.ts b/packages/trueforge-sdk/src/api/resources/catalogs/resources/modelProviders/client/Client.ts similarity index 96% rename from packages/trueforge-sdk/src/api/resources/catalog/resources/modelProviders/client/Client.ts rename to packages/trueforge-sdk/src/api/resources/catalogs/resources/modelProviders/client/Client.ts index 09459680f..d94a7bdc9 100644 --- a/packages/trueforge-sdk/src/api/resources/catalog/resources/modelProviders/client/Client.ts +++ b/packages/trueforge-sdk/src/api/resources/catalogs/resources/modelProviders/client/Client.ts @@ -32,7 +32,7 @@ export class ModelProvidersClient { * @throws {@link errors.TrueForgeTimeoutError} * * @example - * await client.catalog.modelProviders.list() + * await client.catalogs.modelProviders.list() */ public list( requestOptions?: ModelProvidersClient.RequestOptions, @@ -53,7 +53,7 @@ export class ModelProvidersClient { url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)), - "api/v1/catalog/model-providers", + "api/v1/catalogs/model-providers", ), method: "GET", headers: _headers, @@ -103,7 +103,7 @@ export class ModelProvidersClient { _response.error, _response.rawResponse, "GET", - "/api/v1/catalog/model-providers", + "/api/v1/catalogs/model-providers", ); } } diff --git a/packages/trueforge-sdk/src/api/resources/catalog/resources/modelProviders/client/index.ts b/packages/trueforge-sdk/src/api/resources/catalogs/resources/modelProviders/client/index.ts similarity index 100% rename from packages/trueforge-sdk/src/api/resources/catalog/resources/modelProviders/client/index.ts rename to packages/trueforge-sdk/src/api/resources/catalogs/resources/modelProviders/client/index.ts diff --git a/packages/trueforge-sdk/src/api/resources/catalog/resources/modelProviders/exports.ts b/packages/trueforge-sdk/src/api/resources/catalogs/resources/modelProviders/exports.ts similarity index 100% rename from packages/trueforge-sdk/src/api/resources/catalog/resources/modelProviders/exports.ts rename to packages/trueforge-sdk/src/api/resources/catalogs/resources/modelProviders/exports.ts diff --git a/packages/trueforge-sdk/src/api/resources/catalog/resources/modelProviders/index.ts b/packages/trueforge-sdk/src/api/resources/catalogs/resources/modelProviders/index.ts similarity index 100% rename from packages/trueforge-sdk/src/api/resources/catalog/resources/modelProviders/index.ts rename to packages/trueforge-sdk/src/api/resources/catalogs/resources/modelProviders/index.ts diff --git a/packages/trueforge-sdk/src/api/resources/catalog/resources/sandboxProviders/client/Client.ts b/packages/trueforge-sdk/src/api/resources/catalogs/resources/sandboxProviders/client/Client.ts similarity index 96% rename from packages/trueforge-sdk/src/api/resources/catalog/resources/sandboxProviders/client/Client.ts rename to packages/trueforge-sdk/src/api/resources/catalogs/resources/sandboxProviders/client/Client.ts index 72d68b615..977545f1c 100644 --- a/packages/trueforge-sdk/src/api/resources/catalog/resources/sandboxProviders/client/Client.ts +++ b/packages/trueforge-sdk/src/api/resources/catalogs/resources/sandboxProviders/client/Client.ts @@ -32,7 +32,7 @@ export class SandboxProvidersClient { * @throws {@link errors.TrueForgeTimeoutError} * * @example - * await client.catalog.sandboxProviders.list() + * await client.catalogs.sandboxProviders.list() */ public list( requestOptions?: SandboxProvidersClient.RequestOptions, @@ -53,7 +53,7 @@ export class SandboxProvidersClient { url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)), - "api/v1/catalog/sandbox-providers", + "api/v1/catalogs/sandbox-providers", ), method: "GET", headers: _headers, @@ -103,7 +103,7 @@ export class SandboxProvidersClient { _response.error, _response.rawResponse, "GET", - "/api/v1/catalog/sandbox-providers", + "/api/v1/catalogs/sandbox-providers", ); } } diff --git a/packages/trueforge-sdk/src/api/resources/catalog/resources/sandboxProviders/client/index.ts b/packages/trueforge-sdk/src/api/resources/catalogs/resources/sandboxProviders/client/index.ts similarity index 100% rename from packages/trueforge-sdk/src/api/resources/catalog/resources/sandboxProviders/client/index.ts rename to packages/trueforge-sdk/src/api/resources/catalogs/resources/sandboxProviders/client/index.ts diff --git a/packages/trueforge-sdk/src/api/resources/catalog/resources/sandboxProviders/exports.ts b/packages/trueforge-sdk/src/api/resources/catalogs/resources/sandboxProviders/exports.ts similarity index 100% rename from packages/trueforge-sdk/src/api/resources/catalog/resources/sandboxProviders/exports.ts rename to packages/trueforge-sdk/src/api/resources/catalogs/resources/sandboxProviders/exports.ts diff --git a/packages/trueforge-sdk/src/api/resources/catalog/resources/sandboxProviders/index.ts b/packages/trueforge-sdk/src/api/resources/catalogs/resources/sandboxProviders/index.ts similarity index 100% rename from packages/trueforge-sdk/src/api/resources/catalog/resources/sandboxProviders/index.ts rename to packages/trueforge-sdk/src/api/resources/catalogs/resources/sandboxProviders/index.ts diff --git a/packages/trueforge-sdk/src/api/resources/catalog/resources/skills/client/Client.ts b/packages/trueforge-sdk/src/api/resources/catalogs/resources/skills/client/Client.ts similarity index 96% rename from packages/trueforge-sdk/src/api/resources/catalog/resources/skills/client/Client.ts rename to packages/trueforge-sdk/src/api/resources/catalogs/resources/skills/client/Client.ts index fd0af8c34..3ceba6446 100644 --- a/packages/trueforge-sdk/src/api/resources/catalog/resources/skills/client/Client.ts +++ b/packages/trueforge-sdk/src/api/resources/catalogs/resources/skills/client/Client.ts @@ -32,7 +32,7 @@ export class SkillsClient { * @throws {@link errors.TrueForgeTimeoutError} * * @example - * await client.catalog.skills.list() + * await client.catalogs.skills.list() */ public list( requestOptions?: SkillsClient.RequestOptions, @@ -53,7 +53,7 @@ export class SkillsClient { url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)), - "api/v1/catalog/skills", + "api/v1/catalogs/skills", ), method: "GET", headers: _headers, @@ -99,6 +99,6 @@ export class SkillsClient { } } - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/v1/catalog/skills"); + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/api/v1/catalogs/skills"); } } diff --git a/packages/trueforge-sdk/src/api/resources/catalog/resources/skills/client/index.ts b/packages/trueforge-sdk/src/api/resources/catalogs/resources/skills/client/index.ts similarity index 100% rename from packages/trueforge-sdk/src/api/resources/catalog/resources/skills/client/index.ts rename to packages/trueforge-sdk/src/api/resources/catalogs/resources/skills/client/index.ts diff --git a/packages/trueforge-sdk/src/api/resources/catalog/resources/skills/exports.ts b/packages/trueforge-sdk/src/api/resources/catalogs/resources/skills/exports.ts similarity index 100% rename from packages/trueforge-sdk/src/api/resources/catalog/resources/skills/exports.ts rename to packages/trueforge-sdk/src/api/resources/catalogs/resources/skills/exports.ts diff --git a/packages/trueforge-sdk/src/api/resources/catalog/resources/skills/index.ts b/packages/trueforge-sdk/src/api/resources/catalogs/resources/skills/index.ts similarity index 100% rename from packages/trueforge-sdk/src/api/resources/catalog/resources/skills/index.ts rename to packages/trueforge-sdk/src/api/resources/catalogs/resources/skills/index.ts diff --git a/packages/trueforge-sdk/src/api/resources/index.ts b/packages/trueforge-sdk/src/api/resources/index.ts index 1cffd4220..a54d0ff18 100644 --- a/packages/trueforge-sdk/src/api/resources/index.ts +++ b/packages/trueforge-sdk/src/api/resources/index.ts @@ -1,7 +1,7 @@ export * from "./agents/client/requests/index.js"; export * as agents from "./agents/index.js"; export * as auth from "./auth/index.js"; -export * as catalog from "./catalog/index.js"; +export * as catalogs from "./catalogs/index.js"; export * from "./mcpServers/client/requests/index.js"; export * as mcpServers from "./mcpServers/index.js"; export * as models from "./models/index.js"; diff --git a/packages/trueforge-sdk/src/api/resources/mcpServers/client/Client.ts b/packages/trueforge-sdk/src/api/resources/mcpServers/client/Client.ts index 82387bfc7..b96e016b6 100644 --- a/packages/trueforge-sdk/src/api/resources/mcpServers/client/Client.ts +++ b/packages/trueforge-sdk/src/api/resources/mcpServers/client/Client.ts @@ -336,4 +336,128 @@ export class McpServersClient { "/api/v1/mcp-servers/{name}/authorize", ); } + + /** + * All tools exposed by the given MCP server (non-paginated), as returned by the MCP `tools/list` call. + * + * @param {string} name - MCP server name. + * @param {McpServersClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @throws {@link TrueForge.UnauthorizedError} + * @throws {@link TrueForge.NotFoundError} + * @throws {@link TrueForge.UnprocessableEntityError} + * @throws {@link TrueForge.BadGatewayError} + * @throws {@link errors.TrueForgeError} + * @throws {@link errors.TrueForgeTimeoutError} + * + * @example + * await client.mcpServers.listTools("name") + */ + public listTools( + name: string, + requestOptions?: McpServersClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__listTools(name, requestOptions)); + } + + private async __listTools( + name: string, + requestOptions?: McpServersClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await (this._options.fetcher ?? core.fetcher)({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `api/v1/mcp-servers/${core.url.encodePathParam(name)}/tools`, + ), + method: "GET", + headers: _headers, + queryString: core.url.queryBuilder().mergeAdditional(requestOptions?.queryParams).build(), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.ListMcpServerToolsResponse.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 401: + throw new TrueForge.UnauthorizedError( + serializers.RequestErrorResponse.parseOrThrow(_response.error.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + _response.rawResponse, + ); + case 404: + throw new TrueForge.NotFoundError( + serializers.RequestErrorResponse.parseOrThrow(_response.error.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + _response.rawResponse, + ); + case 422: + throw new TrueForge.UnprocessableEntityError( + serializers.RequestErrorResponse.parseOrThrow(_response.error.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + _response.rawResponse, + ); + case 502: + throw new TrueForge.BadGatewayError( + serializers.RequestErrorResponse.parseOrThrow(_response.error.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + _response.rawResponse, + ); + default: + throw new errors.TrueForgeError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "GET", + "/api/v1/mcp-servers/{name}/tools", + ); + } } diff --git a/packages/trueforge-sdk/src/api/resources/sessions/client/Client.ts b/packages/trueforge-sdk/src/api/resources/sessions/client/Client.ts index 1f70c3033..304207d8a 100644 --- a/packages/trueforge-sdk/src/api/resources/sessions/client/Client.ts +++ b/packages/trueforge-sdk/src/api/resources/sessions/client/Client.ts @@ -718,7 +718,7 @@ export class SessionsClient { async ( request: TrueForge.ListEventsSessionsRequest, ): Promise> => { - const { pageToken, lastTurnId, limit = 100 } = request; + const { pageToken, lastTurnId, limit = 25 } = request; const _queryParams: Record = { page_token: pageToken, last_turn_id: lastTurnId, @@ -1437,7 +1437,7 @@ export class SessionsClient { url: core.url.join( (await core.Supplier.get(this._options.baseUrl)) ?? (await core.Supplier.get(this._options.environment)), - `api/v1/sessions/${core.url.encodePathParam(session_id)}/turns/${core.url.encodePathParam(turn_id)}/download`, + `api/v1/sessions/${core.url.encodePathParam(session_id)}/turns/${core.url.encodePathParam(turn_id)}/download-sandbox-file`, ), method: "GET", headers: _headers, @@ -1549,7 +1549,7 @@ export class SessionsClient { _response.error, _response.rawResponse, "GET", - "/api/v1/sessions/{session_id}/turns/{turn_id}/download", + "/api/v1/sessions/{session_id}/turns/{turn_id}/download-sandbox-file", ); } diff --git a/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListEventsSessionsRequest.ts b/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListEventsSessionsRequest.ts index 85b649636..be9a83219 100644 --- a/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListEventsSessionsRequest.ts +++ b/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListEventsSessionsRequest.ts @@ -9,6 +9,6 @@ export interface ListEventsSessionsRequest { pageToken?: string; /** Newest turn in the listing window (initial load only; ignored when `page_token` is set). Lists that turn and its ancestors, newest events first. Omit to use the session last turn. */ lastTurnId?: string; - /** Max events per response. Default 100, max 100. */ + /** Page size. Defaults to 25, max 100. */ limit?: number; } diff --git a/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListTurnEventsSessionsRequest.ts b/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListTurnEventsSessionsRequest.ts index 2daebab86..48d37fd4e 100644 --- a/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListTurnEventsSessionsRequest.ts +++ b/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListTurnEventsSessionsRequest.ts @@ -7,7 +7,7 @@ import type * as TrueForge from "../../../../index.js"; * {} */ export interface ListTurnEventsSessionsRequest { - /** Max events per response. Default 25, max 100. */ + /** Page size. Defaults to 25, max 100. */ limit?: number; /** Opaque token from a previous response `next_page_token`. */ pageToken?: string; diff --git a/packages/trueforge-sdk/src/api/resources/settings/resources/mcpServers/client/Client.ts b/packages/trueforge-sdk/src/api/resources/settings/resources/mcpServers/client/Client.ts index 2a6d4d6d9..b424bfdac 100644 --- a/packages/trueforge-sdk/src/api/resources/settings/resources/mcpServers/client/Client.ts +++ b/packages/trueforge-sdk/src/api/resources/settings/resources/mcpServers/client/Client.ts @@ -252,7 +252,7 @@ export class McpServersClient { * @throws {@link errors.TrueForgeTimeoutError} * * @example - * await client.settings.mcpServers.upsert({ + * await client.settings.mcpServers.createOrUpdate({ * manifest: { * description: "description", * name: "name", @@ -261,14 +261,14 @@ export class McpServersClient { * } * }) */ - public upsert( + public createOrUpdate( request: TrueForge.settings.PutMcpServerRequest, requestOptions?: McpServersClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__upsert(request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__createOrUpdate(request, requestOptions)); } - private async __upsert( + private async __createOrUpdate( request: TrueForge.settings.PutMcpServerRequest, requestOptions?: McpServersClient.RequestOptions, ): Promise> { @@ -440,128 +440,4 @@ export class McpServersClient { "/api/v1/settings/mcp-servers/{name}", ); } - - /** - * All tools exposed by the given MCP server (non-paginated), as returned by the MCP `tools/list` call. - * - * @param {string} name - MCP server name. - * @param {McpServersClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @throws {@link TrueForge.UnauthorizedError} - * @throws {@link TrueForge.NotFoundError} - * @throws {@link TrueForge.UnprocessableEntityError} - * @throws {@link TrueForge.BadGatewayError} - * @throws {@link errors.TrueForgeError} - * @throws {@link errors.TrueForgeTimeoutError} - * - * @example - * await client.settings.mcpServers.listTools("name") - */ - public listTools( - name: string, - requestOptions?: McpServersClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__listTools(name, requestOptions)); - } - - private async __listTools( - name: string, - requestOptions?: McpServersClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await (this._options.fetcher ?? core.fetcher)({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `api/v1/settings/mcp-servers/${core.url.encodePathParam(name)}/tools`, - ), - method: "GET", - headers: _headers, - queryString: core.url.queryBuilder().mergeAdditional(requestOptions?.queryParams).build(), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.ListMcpServerToolsResponse.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - switch (_response.error.statusCode) { - case 401: - throw new TrueForge.UnauthorizedError( - serializers.RequestErrorResponse.parseOrThrow(_response.error.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - _response.rawResponse, - ); - case 404: - throw new TrueForge.NotFoundError( - serializers.RequestErrorResponse.parseOrThrow(_response.error.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - _response.rawResponse, - ); - case 422: - throw new TrueForge.UnprocessableEntityError( - serializers.RequestErrorResponse.parseOrThrow(_response.error.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - _response.rawResponse, - ); - case 502: - throw new TrueForge.BadGatewayError( - serializers.RequestErrorResponse.parseOrThrow(_response.error.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - _response.rawResponse, - ); - default: - throw new errors.TrueForgeError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "GET", - "/api/v1/settings/mcp-servers/{name}/tools", - ); - } } diff --git a/packages/trueforge-sdk/src/api/resources/settings/resources/modelProviders/client/Client.ts b/packages/trueforge-sdk/src/api/resources/settings/resources/modelProviders/client/Client.ts index 4960f7c9f..6cb332733 100644 --- a/packages/trueforge-sdk/src/api/resources/settings/resources/modelProviders/client/Client.ts +++ b/packages/trueforge-sdk/src/api/resources/settings/resources/modelProviders/client/Client.ts @@ -254,7 +254,7 @@ export class ModelProvidersClient { * @throws {@link errors.TrueForgeTimeoutError} * * @example - * await client.settings.modelProviders.upsert({ + * await client.settings.modelProviders.createOrUpdate({ * manifest: { * auth: { * apiKey: "api_key" @@ -268,14 +268,14 @@ export class ModelProvidersClient { * } * }) */ - public upsert( + public createOrUpdate( request: TrueForge.settings.PutModelProviderRequest, requestOptions?: ModelProvidersClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__upsert(request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__createOrUpdate(request, requestOptions)); } - private async __upsert( + private async __createOrUpdate( request: TrueForge.settings.PutModelProviderRequest, requestOptions?: ModelProvidersClient.RequestOptions, ): Promise> { diff --git a/packages/trueforge-sdk/src/api/resources/settings/resources/sandboxProviders/client/Client.ts b/packages/trueforge-sdk/src/api/resources/settings/resources/sandboxProviders/client/Client.ts index 36506683b..c38d6a89b 100644 --- a/packages/trueforge-sdk/src/api/resources/settings/resources/sandboxProviders/client/Client.ts +++ b/packages/trueforge-sdk/src/api/resources/settings/resources/sandboxProviders/client/Client.ts @@ -120,7 +120,7 @@ export class SandboxProvidersClient { * @throws {@link errors.TrueForgeTimeoutError} * * @example - * await client.settings.sandboxProviders.upsert({ + * await client.settings.sandboxProviders.createOrUpdate({ * manifest: { * auth: { * apiKey: "api_key" @@ -133,14 +133,14 @@ export class SandboxProvidersClient { * } * }) */ - public upsert( + public createOrUpdate( request: TrueForge.settings.PutSandboxProviderRequest, requestOptions?: SandboxProvidersClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__upsert(request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__createOrUpdate(request, requestOptions)); } - private async __upsert( + private async __createOrUpdate( request: TrueForge.settings.PutSandboxProviderRequest, requestOptions?: SandboxProvidersClient.RequestOptions, ): Promise> { diff --git a/packages/trueforge-sdk/src/api/resources/settings/resources/skills/client/Client.ts b/packages/trueforge-sdk/src/api/resources/settings/resources/skills/client/Client.ts index cf132535f..603aaef9c 100644 --- a/packages/trueforge-sdk/src/api/resources/settings/resources/skills/client/Client.ts +++ b/packages/trueforge-sdk/src/api/resources/settings/resources/skills/client/Client.ts @@ -238,7 +238,7 @@ export class SkillsClient { * @throws {@link errors.TrueForgeTimeoutError} * * @example - * await client.settings.skills.upsert({ + * await client.settings.skills.createOrUpdate({ * manifest: { * description: "description", * name: "name", @@ -248,14 +248,14 @@ export class SkillsClient { * } * }) */ - public upsert( + public createOrUpdate( request: TrueForge.settings.PutSkillRequest, requestOptions?: SkillsClient.RequestOptions, ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__upsert(request, requestOptions)); + return core.HttpResponsePromise.fromPromise(this.__createOrUpdate(request, requestOptions)); } - private async __upsert( + private async __createOrUpdate( request: TrueForge.settings.PutSkillRequest, requestOptions?: SkillsClient.RequestOptions, ): Promise> { diff --git a/packages/trueforge-sdk/tests/wire/catalog/mcpServers.test.ts b/packages/trueforge-sdk/tests/wire/catalogs/mcpServers.test.ts similarity index 89% rename from packages/trueforge-sdk/tests/wire/catalog/mcpServers.test.ts rename to packages/trueforge-sdk/tests/wire/catalogs/mcpServers.test.ts index b54926ffd..3b0bb8a38 100644 --- a/packages/trueforge-sdk/tests/wire/catalog/mcpServers.test.ts +++ b/packages/trueforge-sdk/tests/wire/catalogs/mcpServers.test.ts @@ -24,13 +24,13 @@ describe("McpServersClient", () => { server .mockEndpoint() - .get("/api/v1/catalog/mcp-servers") + .get("/api/v1/catalogs/mcp-servers") .respondWith() .statusCode(200) .jsonBody(rawResponseBody) .build(); - const response = await client.catalog.mcpServers.list(); + const response = await client.catalogs.mcpServers.list(); expect(response).toEqual({ data: [ { @@ -55,14 +55,14 @@ describe("McpServersClient", () => { server .mockEndpoint() - .get("/api/v1/catalog/mcp-servers") + .get("/api/v1/catalogs/mcp-servers") .respondWith() .statusCode(401) .jsonBody(rawResponseBody) .build(); await expect(async () => { - return await client.catalog.mcpServers.list(); + return await client.catalogs.mcpServers.list(); }).rejects.toThrow(TrueForgeTypes.UnauthorizedError); }); }); diff --git a/packages/trueforge-sdk/tests/wire/catalog/modelProviders.test.ts b/packages/trueforge-sdk/tests/wire/catalogs/modelProviders.test.ts similarity index 88% rename from packages/trueforge-sdk/tests/wire/catalog/modelProviders.test.ts rename to packages/trueforge-sdk/tests/wire/catalogs/modelProviders.test.ts index bb67497ab..2f787c661 100644 --- a/packages/trueforge-sdk/tests/wire/catalog/modelProviders.test.ts +++ b/packages/trueforge-sdk/tests/wire/catalogs/modelProviders.test.ts @@ -15,13 +15,13 @@ describe("ModelProvidersClient", () => { server .mockEndpoint() - .get("/api/v1/catalog/model-providers") + .get("/api/v1/catalogs/model-providers") .respondWith() .statusCode(200) .jsonBody(rawResponseBody) .build(); - const response = await client.catalog.modelProviders.list(); + const response = await client.catalogs.modelProviders.list(); expect(response).toEqual({ data: [ { @@ -47,14 +47,14 @@ describe("ModelProvidersClient", () => { server .mockEndpoint() - .get("/api/v1/catalog/model-providers") + .get("/api/v1/catalogs/model-providers") .respondWith() .statusCode(401) .jsonBody(rawResponseBody) .build(); await expect(async () => { - return await client.catalog.modelProviders.list(); + return await client.catalogs.modelProviders.list(); }).rejects.toThrow(TrueForgeTypes.UnauthorizedError); }); }); diff --git a/packages/trueforge-sdk/tests/wire/catalog/sandboxProviders.test.ts b/packages/trueforge-sdk/tests/wire/catalogs/sandboxProviders.test.ts similarity index 88% rename from packages/trueforge-sdk/tests/wire/catalog/sandboxProviders.test.ts rename to packages/trueforge-sdk/tests/wire/catalogs/sandboxProviders.test.ts index 47bcc3e2b..79c72e793 100644 --- a/packages/trueforge-sdk/tests/wire/catalog/sandboxProviders.test.ts +++ b/packages/trueforge-sdk/tests/wire/catalogs/sandboxProviders.test.ts @@ -23,13 +23,13 @@ describe("SandboxProvidersClient", () => { server .mockEndpoint() - .get("/api/v1/catalog/sandbox-providers") + .get("/api/v1/catalogs/sandbox-providers") .respondWith() .statusCode(200) .jsonBody(rawResponseBody) .build(); - const response = await client.catalog.sandboxProviders.list(); + const response = await client.catalogs.sandboxProviders.list(); expect(response).toEqual({ data: [ { @@ -51,14 +51,14 @@ describe("SandboxProvidersClient", () => { server .mockEndpoint() - .get("/api/v1/catalog/sandbox-providers") + .get("/api/v1/catalogs/sandbox-providers") .respondWith() .statusCode(401) .jsonBody(rawResponseBody) .build(); await expect(async () => { - return await client.catalog.sandboxProviders.list(); + return await client.catalogs.sandboxProviders.list(); }).rejects.toThrow(TrueForgeTypes.UnauthorizedError); }); }); diff --git a/packages/trueforge-sdk/tests/wire/catalog/skills.test.ts b/packages/trueforge-sdk/tests/wire/catalogs/skills.test.ts similarity index 88% rename from packages/trueforge-sdk/tests/wire/catalog/skills.test.ts rename to packages/trueforge-sdk/tests/wire/catalogs/skills.test.ts index 4167870ec..02c60bc69 100644 --- a/packages/trueforge-sdk/tests/wire/catalog/skills.test.ts +++ b/packages/trueforge-sdk/tests/wire/catalogs/skills.test.ts @@ -15,13 +15,13 @@ describe("SkillsClient", () => { server .mockEndpoint() - .get("/api/v1/catalog/skills") + .get("/api/v1/catalogs/skills") .respondWith() .statusCode(200) .jsonBody(rawResponseBody) .build(); - const response = await client.catalog.skills.list(); + const response = await client.catalogs.skills.list(); expect(response).toEqual({ data: [ { @@ -44,14 +44,14 @@ describe("SkillsClient", () => { server .mockEndpoint() - .get("/api/v1/catalog/skills") + .get("/api/v1/catalogs/skills") .respondWith() .statusCode(401) .jsonBody(rawResponseBody) .build(); await expect(async () => { - return await client.catalog.skills.list(); + return await client.catalogs.skills.list(); }).rejects.toThrow(TrueForgeTypes.UnauthorizedError); }); }); diff --git a/packages/trueforge-sdk/tests/wire/mcpServers.test.ts b/packages/trueforge-sdk/tests/wire/mcpServers.test.ts index 972017d55..61f8f162a 100644 --- a/packages/trueforge-sdk/tests/wire/mcpServers.test.ts +++ b/packages/trueforge-sdk/tests/wire/mcpServers.test.ts @@ -238,4 +238,104 @@ describe("McpServersClient", () => { return await client.mcpServers.deleteAuthorize("name"); }).rejects.toThrow(TrueForgeTypes.NotFoundError); }); + + test("list_tools (1)", async () => { + const server = mockServerPool.createServer(); + const client = new TrueForge({ maxRetries: 0, token: "test", baseUrl: server.baseUrl }); + + const rawResponseBody = { data: [{ key: "value" }] }; + + server + .mockEndpoint() + .get("/api/v1/mcp-servers/name/tools") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.mcpServers.listTools("name"); + expect(response).toEqual({ + data: [ + { + key: "value", + }, + ], + }); + }); + + test("list_tools (2)", async () => { + const server = mockServerPool.createServer(); + const client = new TrueForge({ maxRetries: 0, token: "test", baseUrl: server.baseUrl }); + + const rawResponseBody = { error: { message: "message" } }; + + server + .mockEndpoint() + .get("/api/v1/mcp-servers/name/tools") + .respondWith() + .statusCode(401) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.mcpServers.listTools("name"); + }).rejects.toThrow(TrueForgeTypes.UnauthorizedError); + }); + + test("list_tools (3)", async () => { + const server = mockServerPool.createServer(); + const client = new TrueForge({ maxRetries: 0, token: "test", baseUrl: server.baseUrl }); + + const rawResponseBody = { error: { message: "message" } }; + + server + .mockEndpoint() + .get("/api/v1/mcp-servers/name/tools") + .respondWith() + .statusCode(404) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.mcpServers.listTools("name"); + }).rejects.toThrow(TrueForgeTypes.NotFoundError); + }); + + test("list_tools (4)", async () => { + const server = mockServerPool.createServer(); + const client = new TrueForge({ maxRetries: 0, token: "test", baseUrl: server.baseUrl }); + + const rawResponseBody = { error: { message: "message" } }; + + server + .mockEndpoint() + .get("/api/v1/mcp-servers/name/tools") + .respondWith() + .statusCode(422) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.mcpServers.listTools("name"); + }).rejects.toThrow(TrueForgeTypes.UnprocessableEntityError); + }); + + test("list_tools (5)", async () => { + const server = mockServerPool.createServer(); + const client = new TrueForge({ maxRetries: 0, token: "test", baseUrl: server.baseUrl }); + + const rawResponseBody = { error: { message: "message" } }; + + server + .mockEndpoint() + .get("/api/v1/mcp-servers/name/tools") + .respondWith() + .statusCode(502) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.mcpServers.listTools("name"); + }).rejects.toThrow(TrueForgeTypes.BadGatewayError); + }); }); diff --git a/packages/trueforge-sdk/tests/wire/settings/mcpServers.test.ts b/packages/trueforge-sdk/tests/wire/settings/mcpServers.test.ts index a2ac66cc7..6228b045b 100644 --- a/packages/trueforge-sdk/tests/wire/settings/mcpServers.test.ts +++ b/packages/trueforge-sdk/tests/wire/settings/mcpServers.test.ts @@ -220,7 +220,7 @@ describe("McpServersClient", () => { }).rejects.toThrow(TrueForgeTypes.UnprocessableEntityError); }); - test("upsert (1)", async () => { + test("create_or_update (1)", async () => { const server = mockServerPool.createServer(); const client = new TrueForge({ maxRetries: 0, token: "test", baseUrl: server.baseUrl }); const rawRequestBody = { manifest: { description: "description", name: "name", type: "remote", url: "url" } }; @@ -247,7 +247,7 @@ describe("McpServersClient", () => { .jsonBody(rawResponseBody) .build(); - const response = await client.settings.mcpServers.upsert({ + const response = await client.settings.mcpServers.createOrUpdate({ manifest: { description: "description", name: "name", @@ -275,7 +275,7 @@ describe("McpServersClient", () => { }); }); - test("upsert (2)", async () => { + test("create_or_update (2)", async () => { const server = mockServerPool.createServer(); const client = new TrueForge({ maxRetries: 0, token: "test", baseUrl: server.baseUrl }); const rawRequestBody = { manifest: { description: "x", name: "xy", type: "remote", url: "url" } }; @@ -291,7 +291,7 @@ describe("McpServersClient", () => { .build(); await expect(async () => { - return await client.settings.mcpServers.upsert({ + return await client.settings.mcpServers.createOrUpdate({ manifest: { description: "x", name: "xy", @@ -302,7 +302,7 @@ describe("McpServersClient", () => { }).rejects.toThrow(TrueForgeTypes.BadRequestError); }); - test("upsert (3)", async () => { + test("create_or_update (3)", async () => { const server = mockServerPool.createServer(); const client = new TrueForge({ maxRetries: 0, token: "test", baseUrl: server.baseUrl }); const rawRequestBody = { manifest: { description: "x", name: "xy", type: "remote", url: "url" } }; @@ -318,7 +318,7 @@ describe("McpServersClient", () => { .build(); await expect(async () => { - return await client.settings.mcpServers.upsert({ + return await client.settings.mcpServers.createOrUpdate({ manifest: { description: "x", name: "xy", @@ -394,104 +394,4 @@ describe("McpServersClient", () => { return await client.settings.mcpServers.get("name"); }).rejects.toThrow(TrueForgeTypes.NotFoundError); }); - - test("list_tools (1)", async () => { - const server = mockServerPool.createServer(); - const client = new TrueForge({ maxRetries: 0, token: "test", baseUrl: server.baseUrl }); - - const rawResponseBody = { data: [{ key: "value" }] }; - - server - .mockEndpoint() - .get("/api/v1/settings/mcp-servers/name/tools") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.settings.mcpServers.listTools("name"); - expect(response).toEqual({ - data: [ - { - key: "value", - }, - ], - }); - }); - - test("list_tools (2)", async () => { - const server = mockServerPool.createServer(); - const client = new TrueForge({ maxRetries: 0, token: "test", baseUrl: server.baseUrl }); - - const rawResponseBody = { error: { message: "message" } }; - - server - .mockEndpoint() - .get("/api/v1/settings/mcp-servers/name/tools") - .respondWith() - .statusCode(401) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.settings.mcpServers.listTools("name"); - }).rejects.toThrow(TrueForgeTypes.UnauthorizedError); - }); - - test("list_tools (3)", async () => { - const server = mockServerPool.createServer(); - const client = new TrueForge({ maxRetries: 0, token: "test", baseUrl: server.baseUrl }); - - const rawResponseBody = { error: { message: "message" } }; - - server - .mockEndpoint() - .get("/api/v1/settings/mcp-servers/name/tools") - .respondWith() - .statusCode(404) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.settings.mcpServers.listTools("name"); - }).rejects.toThrow(TrueForgeTypes.NotFoundError); - }); - - test("list_tools (4)", async () => { - const server = mockServerPool.createServer(); - const client = new TrueForge({ maxRetries: 0, token: "test", baseUrl: server.baseUrl }); - - const rawResponseBody = { error: { message: "message" } }; - - server - .mockEndpoint() - .get("/api/v1/settings/mcp-servers/name/tools") - .respondWith() - .statusCode(422) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.settings.mcpServers.listTools("name"); - }).rejects.toThrow(TrueForgeTypes.UnprocessableEntityError); - }); - - test("list_tools (5)", async () => { - const server = mockServerPool.createServer(); - const client = new TrueForge({ maxRetries: 0, token: "test", baseUrl: server.baseUrl }); - - const rawResponseBody = { error: { message: "message" } }; - - server - .mockEndpoint() - .get("/api/v1/settings/mcp-servers/name/tools") - .respondWith() - .statusCode(502) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.settings.mcpServers.listTools("name"); - }).rejects.toThrow(TrueForgeTypes.BadGatewayError); - }); }); diff --git a/packages/trueforge-sdk/tests/wire/settings/modelProviders.test.ts b/packages/trueforge-sdk/tests/wire/settings/modelProviders.test.ts index 3a9ff7310..666adb3fb 100644 --- a/packages/trueforge-sdk/tests/wire/settings/modelProviders.test.ts +++ b/packages/trueforge-sdk/tests/wire/settings/modelProviders.test.ts @@ -254,7 +254,7 @@ describe("ModelProvidersClient", () => { }).rejects.toThrow(TrueForgeTypes.ConflictError); }); - test("upsert (1)", async () => { + test("create_or_update (1)", async () => { const server = mockServerPool.createServer(); const client = new TrueForge({ maxRetries: 0, token: "test", baseUrl: server.baseUrl }); const rawRequestBody = { @@ -285,7 +285,7 @@ describe("ModelProvidersClient", () => { .jsonBody(rawResponseBody) .build(); - const response = await client.settings.modelProviders.upsert({ + const response = await client.settings.modelProviders.createOrUpdate({ manifest: { auth: { apiKey: "api_key", @@ -321,7 +321,7 @@ describe("ModelProvidersClient", () => { }); }); - test("upsert (2)", async () => { + test("create_or_update (2)", async () => { const server = mockServerPool.createServer(); const client = new TrueForge({ maxRetries: 0, token: "test", baseUrl: server.baseUrl }); const rawRequestBody = { @@ -346,7 +346,7 @@ describe("ModelProvidersClient", () => { .build(); await expect(async () => { - return await client.settings.modelProviders.upsert({ + return await client.settings.modelProviders.createOrUpdate({ manifest: { auth: { apiKey: "x", diff --git a/packages/trueforge-sdk/tests/wire/settings/sandboxProviders.test.ts b/packages/trueforge-sdk/tests/wire/settings/sandboxProviders.test.ts index 743bed68f..0edb2ac60 100644 --- a/packages/trueforge-sdk/tests/wire/settings/sandboxProviders.test.ts +++ b/packages/trueforge-sdk/tests/wire/settings/sandboxProviders.test.ts @@ -70,7 +70,7 @@ describe("SandboxProvidersClient", () => { }).rejects.toThrow(TrueForgeTypes.NotFoundError); }); - test("upsert (1)", async () => { + test("create_or_update (1)", async () => { const server = mockServerPool.createServer(); const client = new TrueForge({ maxRetries: 0, token: "test", baseUrl: server.baseUrl }); const rawRequestBody = { @@ -107,7 +107,7 @@ describe("SandboxProvidersClient", () => { .jsonBody(rawResponseBody) .build(); - const response = await client.settings.sandboxProviders.upsert({ + const response = await client.settings.sandboxProviders.createOrUpdate({ manifest: { auth: { apiKey: "api_key", @@ -137,7 +137,7 @@ describe("SandboxProvidersClient", () => { }); }); - test("upsert (2)", async () => { + test("create_or_update (2)", async () => { const server = mockServerPool.createServer(); const client = new TrueForge({ maxRetries: 0, token: "test", baseUrl: server.baseUrl }); const rawRequestBody = { @@ -162,7 +162,7 @@ describe("SandboxProvidersClient", () => { .build(); await expect(async () => { - return await client.settings.sandboxProviders.upsert({ + return await client.settings.sandboxProviders.createOrUpdate({ manifest: { auth: { apiKey: "x", @@ -177,7 +177,7 @@ describe("SandboxProvidersClient", () => { }).rejects.toThrow(TrueForgeTypes.BadRequestError); }); - test("upsert (3)", async () => { + test("create_or_update (3)", async () => { const server = mockServerPool.createServer(); const client = new TrueForge({ maxRetries: 0, token: "test", baseUrl: server.baseUrl }); const rawRequestBody = { @@ -202,7 +202,7 @@ describe("SandboxProvidersClient", () => { .build(); await expect(async () => { - return await client.settings.sandboxProviders.upsert({ + return await client.settings.sandboxProviders.createOrUpdate({ manifest: { auth: { apiKey: "x", diff --git a/packages/trueforge-sdk/tests/wire/settings/skills.test.ts b/packages/trueforge-sdk/tests/wire/settings/skills.test.ts index 8b963a3ed..6dc8116a9 100644 --- a/packages/trueforge-sdk/tests/wire/settings/skills.test.ts +++ b/packages/trueforge-sdk/tests/wire/settings/skills.test.ts @@ -190,7 +190,7 @@ describe("SkillsClient", () => { }).rejects.toThrow(TrueForgeTypes.ConflictError); }); - test("upsert (1)", async () => { + test("create_or_update (1)", async () => { const server = mockServerPool.createServer(); const client = new TrueForge({ maxRetries: 0, token: "test", baseUrl: server.baseUrl }); const rawRequestBody = { @@ -219,7 +219,7 @@ describe("SkillsClient", () => { .jsonBody(rawResponseBody) .build(); - const response = await client.settings.skills.upsert({ + const response = await client.settings.skills.createOrUpdate({ manifest: { description: "description", name: "name", @@ -243,7 +243,7 @@ describe("SkillsClient", () => { }); }); - test("upsert (2)", async () => { + test("create_or_update (2)", async () => { const server = mockServerPool.createServer(); const client = new TrueForge({ maxRetries: 0, token: "test", baseUrl: server.baseUrl }); const rawRequestBody = { manifest: { description: "x", name: "xy", ref: "x", type: "git", url: "x" } }; @@ -259,7 +259,7 @@ describe("SkillsClient", () => { .build(); await expect(async () => { - return await client.settings.skills.upsert({ + return await client.settings.skills.createOrUpdate({ manifest: { description: "x", name: "xy", From 951484825cdbd74583513a723c524126554eb8f3 Mon Sep 17 00:00:00 2001 From: Bhavesh Patel Date: Tue, 18 Aug 2026 18:47:33 +0530 Subject: [PATCH 3/9] comment addressed --- packages/trueforge/src/schemas/common.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/trueforge/src/schemas/common.ts b/packages/trueforge/src/schemas/common.ts index 2b7eed32b..9f52cec90 100644 --- a/packages/trueforge/src/schemas/common.ts +++ b/packages/trueforge/src/schemas/common.ts @@ -19,7 +19,7 @@ export const NameSchema = z export type ResourceName = z.infer; -/** TODO: budget list payload size once, then set default and max from that. */ +/** TODO: keep default === max; budget payload size once and set that value. */ export const PAGE_LIMIT = 100; export const EVENTS_PAGE_LIMIT = 25; From 2f6c77c2c8f02af40b16c2a1221761dc82b983fe Mon Sep 17 00:00:00 2001 From: "trueforge-dev-bot[bot]" Date: Tue, 18 Aug 2026 13:24:16 +0000 Subject: [PATCH 4/9] Regenerate OpenAPI document and TypeScript SDK --- .github/fern/openapi/openapi.json | 24 +++++++++---------- docs/openapi.json | 24 +++++++++---------- .../api/resources/sessions/client/Client.ts | 4 ++-- .../requests/ListEventsSessionsRequest.ts | 2 +- .../client/requests/ListSessionsRequest.ts | 2 +- .../requests/ListTurnEventsSessionsRequest.ts | 2 +- .../requests/ListTurnsSessionsRequest.ts | 2 +- 7 files changed, 30 insertions(+), 30 deletions(-) diff --git a/.github/fern/openapi/openapi.json b/.github/fern/openapi/openapi.json index 8cfc79dca..b02416786 100644 --- a/.github/fern/openapi/openapi.json +++ b/.github/fern/openapi/openapi.json @@ -5177,13 +5177,13 @@ "description": "List the caller's sessions (newest first by default), token-paginated. Results are scoped to the authenticated identity via the session store's `created_by` filter (not a client query param). Optional `agent_id` filters to sessions bound to that named agent. Pass `page_token` to fetch the next page, keeping the other query params constant.", "parameters": [ { - "description": "Page size. Defaults to 10, max 100.", + "description": "Page size. Defaults to 100, max 100.", "in": "query", "name": "limit", "required": false, "schema": { - "default": 10, - "description": "Page size. Defaults to 10, max 100.", + "default": 100, + "description": "Page size. Defaults to 100, max 100.", "maximum": 100, "minimum": 1, "type": "integer" @@ -5645,14 +5645,14 @@ } }, { - "description": "Page size. Defaults to 25, max 100.", + "description": "Page size. Defaults to 25, max 25.", "in": "query", "name": "limit", "required": false, "schema": { "default": 25, - "description": "Page size. Defaults to 25, max 100.", - "maximum": 100, + "description": "Page size. Defaults to 25, max 25.", + "maximum": 25, "minimum": 1, "type": "integer" } @@ -5732,13 +5732,13 @@ } }, { - "description": "Page size. Defaults to 10, max 100.", + "description": "Page size. Defaults to 100, max 100.", "in": "query", "name": "limit", "required": false, "schema": { - "default": 10, - "description": "Page size. Defaults to 10, max 100.", + "default": 100, + "description": "Page size. Defaults to 100, max 100.", "maximum": 100, "minimum": 1, "type": "integer" @@ -6165,14 +6165,14 @@ } }, { - "description": "Page size. Defaults to 25, max 100.", + "description": "Page size. Defaults to 25, max 25.", "in": "query", "name": "limit", "required": false, "schema": { "default": 25, - "description": "Page size. Defaults to 25, max 100.", - "maximum": 100, + "description": "Page size. Defaults to 25, max 25.", + "maximum": 25, "minimum": 1, "type": "integer" } diff --git a/docs/openapi.json b/docs/openapi.json index 8cfc79dca..b02416786 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -5177,13 +5177,13 @@ "description": "List the caller's sessions (newest first by default), token-paginated. Results are scoped to the authenticated identity via the session store's `created_by` filter (not a client query param). Optional `agent_id` filters to sessions bound to that named agent. Pass `page_token` to fetch the next page, keeping the other query params constant.", "parameters": [ { - "description": "Page size. Defaults to 10, max 100.", + "description": "Page size. Defaults to 100, max 100.", "in": "query", "name": "limit", "required": false, "schema": { - "default": 10, - "description": "Page size. Defaults to 10, max 100.", + "default": 100, + "description": "Page size. Defaults to 100, max 100.", "maximum": 100, "minimum": 1, "type": "integer" @@ -5645,14 +5645,14 @@ } }, { - "description": "Page size. Defaults to 25, max 100.", + "description": "Page size. Defaults to 25, max 25.", "in": "query", "name": "limit", "required": false, "schema": { "default": 25, - "description": "Page size. Defaults to 25, max 100.", - "maximum": 100, + "description": "Page size. Defaults to 25, max 25.", + "maximum": 25, "minimum": 1, "type": "integer" } @@ -5732,13 +5732,13 @@ } }, { - "description": "Page size. Defaults to 10, max 100.", + "description": "Page size. Defaults to 100, max 100.", "in": "query", "name": "limit", "required": false, "schema": { - "default": 10, - "description": "Page size. Defaults to 10, max 100.", + "default": 100, + "description": "Page size. Defaults to 100, max 100.", "maximum": 100, "minimum": 1, "type": "integer" @@ -6165,14 +6165,14 @@ } }, { - "description": "Page size. Defaults to 25, max 100.", + "description": "Page size. Defaults to 25, max 25.", "in": "query", "name": "limit", "required": false, "schema": { "default": 25, - "description": "Page size. Defaults to 25, max 100.", - "maximum": 100, + "description": "Page size. Defaults to 25, max 25.", + "maximum": 25, "minimum": 1, "type": "integer" } diff --git a/packages/trueforge-sdk/src/api/resources/sessions/client/Client.ts b/packages/trueforge-sdk/src/api/resources/sessions/client/Client.ts index 304207d8a..4a6773daa 100644 --- a/packages/trueforge-sdk/src/api/resources/sessions/client/Client.ts +++ b/packages/trueforge-sdk/src/api/resources/sessions/client/Client.ts @@ -44,7 +44,7 @@ export class SessionsClient { async ( request: TrueForge.ListSessionsRequest, ): Promise> => { - const { limit = 10, order, pageToken, startTimestamp, endTimestamp, agentId } = request; + const { limit = 100, order, pageToken, startTimestamp, endTimestamp, agentId } = request; const _queryParams: Record = { limit, order: @@ -851,7 +851,7 @@ export class SessionsClient { async ( request: TrueForge.ListTurnsSessionsRequest, ): Promise> => { - const { limit = 10, pageToken } = request; + const { limit = 100, pageToken } = request; const _queryParams: Record = { limit, page_token: pageToken, diff --git a/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListEventsSessionsRequest.ts b/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListEventsSessionsRequest.ts index be9a83219..d690b1af1 100644 --- a/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListEventsSessionsRequest.ts +++ b/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListEventsSessionsRequest.ts @@ -9,6 +9,6 @@ export interface ListEventsSessionsRequest { pageToken?: string; /** Newest turn in the listing window (initial load only; ignored when `page_token` is set). Lists that turn and its ancestors, newest events first. Omit to use the session last turn. */ lastTurnId?: string; - /** Page size. Defaults to 25, max 100. */ + /** Page size. Defaults to 25, max 25. */ limit?: number; } diff --git a/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListSessionsRequest.ts b/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListSessionsRequest.ts index bbc6969e9..ce405d280 100644 --- a/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListSessionsRequest.ts +++ b/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListSessionsRequest.ts @@ -7,7 +7,7 @@ import type * as TrueForge from "../../../../index.js"; * {} */ export interface ListSessionsRequest { - /** Page size. Defaults to 10, max 100. */ + /** Page size. Defaults to 100, max 100. */ limit?: number; /** Sort sessions by `updated_at`. Defaults to "desc". */ order?: TrueForge.ListSessionsOrder; diff --git a/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListTurnEventsSessionsRequest.ts b/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListTurnEventsSessionsRequest.ts index 48d37fd4e..5b84aab61 100644 --- a/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListTurnEventsSessionsRequest.ts +++ b/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListTurnEventsSessionsRequest.ts @@ -7,7 +7,7 @@ import type * as TrueForge from "../../../../index.js"; * {} */ export interface ListTurnEventsSessionsRequest { - /** Page size. Defaults to 25, max 100. */ + /** Page size. Defaults to 25, max 25. */ limit?: number; /** Opaque token from a previous response `next_page_token`. */ pageToken?: string; diff --git a/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListTurnsSessionsRequest.ts b/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListTurnsSessionsRequest.ts index 6ee16708e..57db4ca64 100644 --- a/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListTurnsSessionsRequest.ts +++ b/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListTurnsSessionsRequest.ts @@ -5,7 +5,7 @@ * {} */ export interface ListTurnsSessionsRequest { - /** Page size. Defaults to 10, max 100. */ + /** Page size. Defaults to 100, max 100. */ limit?: number; /** Opaque token from a previous response `next_page_token`. */ pageToken?: string; From 1389d01cc461735ea0be2a0b4fd81231356e0390 Mon Sep 17 00:00:00 2001 From: Bhavesh Patel Date: Tue, 18 Aug 2026 19:59:13 +0530 Subject: [PATCH 5/9] List sessions, list turns, list session events, and list turn events all default and max to 100 --- .changeset/20260818100000-api-path-and-sdk-naming.md | 2 +- packages/trueforge/src/schemas/common.ts | 1 - packages/trueforge/src/schemas/events.ts | 8 ++++---- packages/trueforge/src/schemas/turn.ts | 8 ++++---- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/.changeset/20260818100000-api-path-and-sdk-naming.md b/.changeset/20260818100000-api-path-and-sdk-naming.md index 3eb4432f2..4ca397c5c 100644 --- a/.changeset/20260818100000-api-path-and-sdk-naming.md +++ b/.changeset/20260818100000-api-path-and-sdk-naming.md @@ -3,4 +3,4 @@ '@truefoundry/trueforge-ui': patch --- -Rename catalog, sandbox-file download, and MCP tools paths; Fern upsert becomes create_or_update. Paginated lists: sessions/turns 100, events 25 (default equals max). +Rename catalog, sandbox-file download, and MCP tools paths; Fern upsert becomes create_or_update. Paginated lists: sessions, turns, and events default and max 100. diff --git a/packages/trueforge/src/schemas/common.ts b/packages/trueforge/src/schemas/common.ts index 9f52cec90..8d7034c45 100644 --- a/packages/trueforge/src/schemas/common.ts +++ b/packages/trueforge/src/schemas/common.ts @@ -21,7 +21,6 @@ export type ResourceName = z.infer; /** TODO: keep default === max; budget payload size once and set that value. */ export const PAGE_LIMIT = 100; -export const EVENTS_PAGE_LIMIT = 25; /** Adds a validation issue if two entries share a name. */ export function uniqueNames(entries: { name: string }[], ctx: z.RefinementCtx): void { diff --git a/packages/trueforge/src/schemas/events.ts b/packages/trueforge/src/schemas/events.ts index 41e13d080..5f75c1239 100644 --- a/packages/trueforge/src/schemas/events.ts +++ b/packages/trueforge/src/schemas/events.ts @@ -22,7 +22,7 @@ import { ToolResponseEventSchema, ToolResponseRequiredEventSchema, } from '@truefoundry/trueforge-core/core'; -import { EVENTS_PAGE_LIMIT } from './common'; +import { PAGE_LIMIT } from './common'; export type { TurnCreatedEvent } from '@truefoundry/trueforge-core/agent-session'; export { EventType }; @@ -63,10 +63,10 @@ export const ListSessionEventsRequestQuerySchema = z .number() .int() .min(1) - .max(EVENTS_PAGE_LIMIT) + .max(PAGE_LIMIT) .optional() - .default(EVENTS_PAGE_LIMIT) - .describe(`Page size. Defaults to ${String(EVENTS_PAGE_LIMIT)}, max ${String(EVENTS_PAGE_LIMIT)}.`), + .default(PAGE_LIMIT) + .describe(`Page size. Defaults to ${String(PAGE_LIMIT)}, max ${String(PAGE_LIMIT)}.`), }) .openapi('ListSessionEventsRequestQuery'); diff --git a/packages/trueforge/src/schemas/turn.ts b/packages/trueforge/src/schemas/turn.ts index 6071fe053..a7f210fd2 100644 --- a/packages/trueforge/src/schemas/turn.ts +++ b/packages/trueforge/src/schemas/turn.ts @@ -1,7 +1,7 @@ /** Server-only turn wire schemas (SSE resume / cancel / list). Core turn schemas live in agent-session. */ import { z } from '@hono/zod-openapi'; import { SessionEventSchema, TokenPaginationSchema, TurnSchema } from '@truefoundry/trueforge-core/agent-session'; -import { EVENTS_PAGE_LIMIT, PAGE_LIMIT } from './common'; +import { PAGE_LIMIT } from './common'; export { CreateTurnRequestSchema, TurnSchema } from '@truefoundry/trueforge-core/agent-session'; export type { Turn } from '@truefoundry/trueforge-core/agent-session'; @@ -68,10 +68,10 @@ export const ListTurnEventsRequestQuerySchema = z .number() .int() .min(1) - .max(EVENTS_PAGE_LIMIT) + .max(PAGE_LIMIT) .optional() - .default(EVENTS_PAGE_LIMIT) - .describe(`Page size. Defaults to ${String(EVENTS_PAGE_LIMIT)}, max ${String(EVENTS_PAGE_LIMIT)}.`), + .default(PAGE_LIMIT) + .describe(`Page size. Defaults to ${String(PAGE_LIMIT)}, max ${String(PAGE_LIMIT)}.`), page_token: z.string().optional().describe('Opaque token from a previous response `next_page_token`.'), order: z .enum(['asc', 'desc']) From 76896671011aeff72b5cd7e8d6a0c6605dba726c Mon Sep 17 00:00:00 2001 From: Bhavesh Patel Date: Tue, 18 Aug 2026 20:04:04 +0530 Subject: [PATCH 6/9] comment updated --- packages/trueforge/src/schemas/common.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/trueforge/src/schemas/common.ts b/packages/trueforge/src/schemas/common.ts index 8d7034c45..76bf9555a 100644 --- a/packages/trueforge/src/schemas/common.ts +++ b/packages/trueforge/src/schemas/common.ts @@ -19,7 +19,7 @@ export const NameSchema = z export type ResourceName = z.infer; -/** TODO: keep default === max; budget payload size once and set that value. */ +/** default === max. 512 KiB uncompressed JSON; 100 from median of 16 Cursor real examples. */ export const PAGE_LIMIT = 100; /** Adds a validation issue if two entries share a name. */ From 2b5e21a964c0e123523c0088e34ae998fd5e9512 Mon Sep 17 00:00:00 2001 From: "trueforge-dev-bot[bot]" Date: Tue, 18 Aug 2026 15:58:24 +0000 Subject: [PATCH 7/9] Regenerate OpenAPI document and TypeScript SDK --- .github/fern/openapi/openapi.json | 16 ++++++++-------- docs/openapi.json | 16 ++++++++-------- .../src/api/resources/sessions/client/Client.ts | 4 ++-- .../client/requests/ListSessionsRequest.ts | 2 +- .../client/requests/ListTurnsSessionsRequest.ts | 2 +- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/.github/fern/openapi/openapi.json b/.github/fern/openapi/openapi.json index 972c652af..4e6fb1404 100644 --- a/.github/fern/openapi/openapi.json +++ b/.github/fern/openapi/openapi.json @@ -5176,14 +5176,14 @@ "description": "List the caller's sessions (newest first by default), token-paginated. Results are scoped to the authenticated identity via the session store's `created_by` filter (not a client query param). Optional `agent_id` filters to sessions bound to that named agent. Pass `page_token` to fetch the next page, keeping the other query params constant.", "parameters": [ { - "description": "Page size. Defaults to 100, max 100.", + "description": "Page size. Defaults to 25, max 25.", "in": "query", "name": "limit", "required": false, "schema": { - "default": 100, - "description": "Page size. Defaults to 100, max 100.", - "maximum": 100, + "default": 25, + "description": "Page size. Defaults to 25, max 25.", + "maximum": 25, "minimum": 1, "type": "integer" } @@ -5731,14 +5731,14 @@ } }, { - "description": "Page size. Defaults to 100, max 100.", + "description": "Page size. Defaults to 25, max 25.", "in": "query", "name": "limit", "required": false, "schema": { - "default": 100, - "description": "Page size. Defaults to 100, max 100.", - "maximum": 100, + "default": 25, + "description": "Page size. Defaults to 25, max 25.", + "maximum": 25, "minimum": 1, "type": "integer" } diff --git a/docs/openapi.json b/docs/openapi.json index 972c652af..4e6fb1404 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -5176,14 +5176,14 @@ "description": "List the caller's sessions (newest first by default), token-paginated. Results are scoped to the authenticated identity via the session store's `created_by` filter (not a client query param). Optional `agent_id` filters to sessions bound to that named agent. Pass `page_token` to fetch the next page, keeping the other query params constant.", "parameters": [ { - "description": "Page size. Defaults to 100, max 100.", + "description": "Page size. Defaults to 25, max 25.", "in": "query", "name": "limit", "required": false, "schema": { - "default": 100, - "description": "Page size. Defaults to 100, max 100.", - "maximum": 100, + "default": 25, + "description": "Page size. Defaults to 25, max 25.", + "maximum": 25, "minimum": 1, "type": "integer" } @@ -5731,14 +5731,14 @@ } }, { - "description": "Page size. Defaults to 100, max 100.", + "description": "Page size. Defaults to 25, max 25.", "in": "query", "name": "limit", "required": false, "schema": { - "default": 100, - "description": "Page size. Defaults to 100, max 100.", - "maximum": 100, + "default": 25, + "description": "Page size. Defaults to 25, max 25.", + "maximum": 25, "minimum": 1, "type": "integer" } diff --git a/packages/trueforge-sdk/src/api/resources/sessions/client/Client.ts b/packages/trueforge-sdk/src/api/resources/sessions/client/Client.ts index 4a6773daa..95ead5acc 100644 --- a/packages/trueforge-sdk/src/api/resources/sessions/client/Client.ts +++ b/packages/trueforge-sdk/src/api/resources/sessions/client/Client.ts @@ -44,7 +44,7 @@ export class SessionsClient { async ( request: TrueForge.ListSessionsRequest, ): Promise> => { - const { limit = 100, order, pageToken, startTimestamp, endTimestamp, agentId } = request; + const { limit = 25, order, pageToken, startTimestamp, endTimestamp, agentId } = request; const _queryParams: Record = { limit, order: @@ -851,7 +851,7 @@ export class SessionsClient { async ( request: TrueForge.ListTurnsSessionsRequest, ): Promise> => { - const { limit = 100, pageToken } = request; + const { limit = 25, pageToken } = request; const _queryParams: Record = { limit, page_token: pageToken, diff --git a/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListSessionsRequest.ts b/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListSessionsRequest.ts index ce405d280..c760f093e 100644 --- a/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListSessionsRequest.ts +++ b/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListSessionsRequest.ts @@ -7,7 +7,7 @@ import type * as TrueForge from "../../../../index.js"; * {} */ export interface ListSessionsRequest { - /** Page size. Defaults to 100, max 100. */ + /** Page size. Defaults to 25, max 25. */ limit?: number; /** Sort sessions by `updated_at`. Defaults to "desc". */ order?: TrueForge.ListSessionsOrder; diff --git a/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListTurnsSessionsRequest.ts b/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListTurnsSessionsRequest.ts index 57db4ca64..81882d9b4 100644 --- a/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListTurnsSessionsRequest.ts +++ b/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListTurnsSessionsRequest.ts @@ -5,7 +5,7 @@ * {} */ export interface ListTurnsSessionsRequest { - /** Page size. Defaults to 100, max 100. */ + /** Page size. Defaults to 25, max 25. */ limit?: number; /** Opaque token from a previous response `next_page_token`. */ pageToken?: string; From 6f65aa562ba51767fd13f6809fa7767aff0e1b45 Mon Sep 17 00:00:00 2001 From: Bhavesh Patel Date: Wed, 19 Aug 2026 12:04:57 +0530 Subject: [PATCH 8/9] comment addressed --- .changeset/20260818100000-api-path-and-sdk-naming.md | 2 +- packages/trueforge/src/schemas/common.ts | 3 +++ packages/trueforge/src/schemas/events.ts | 8 ++++---- packages/trueforge/src/schemas/turn.ts | 8 ++++---- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/.changeset/20260818100000-api-path-and-sdk-naming.md b/.changeset/20260818100000-api-path-and-sdk-naming.md index ad1137467..fc906e1a3 100644 --- a/.changeset/20260818100000-api-path-and-sdk-naming.md +++ b/.changeset/20260818100000-api-path-and-sdk-naming.md @@ -3,4 +3,4 @@ '@truefoundry/trueforge-ui': patch --- -Rename catalog, sandbox-file download, and MCP tools paths; Fern upsert becomes create_or_update. Paginated lists: sessions, turns, and events default and max 25. +Rename catalog, sandbox-file download, and MCP tools paths; Fern upsert becomes create_or_update. Sessions and turns default and max 25; session and turn event lists default and max 100. diff --git a/packages/trueforge/src/schemas/common.ts b/packages/trueforge/src/schemas/common.ts index 7679860a3..f16f4b43f 100644 --- a/packages/trueforge/src/schemas/common.ts +++ b/packages/trueforge/src/schemas/common.ts @@ -19,7 +19,10 @@ export const NameSchema = z export type ResourceName = z.infer; +/** Sessions and turns list page size (default = max). */ export const PAGE_LIMIT = 25; +/** Session/turn event list page size (default = max). */ +export const EVENTS_PAGE_LIMIT = 100; /** Adds a validation issue if two entries share a name. */ export function uniqueNames(entries: { name: string }[], ctx: z.RefinementCtx): void { diff --git a/packages/trueforge/src/schemas/events.ts b/packages/trueforge/src/schemas/events.ts index 5f75c1239..41e13d080 100644 --- a/packages/trueforge/src/schemas/events.ts +++ b/packages/trueforge/src/schemas/events.ts @@ -22,7 +22,7 @@ import { ToolResponseEventSchema, ToolResponseRequiredEventSchema, } from '@truefoundry/trueforge-core/core'; -import { PAGE_LIMIT } from './common'; +import { EVENTS_PAGE_LIMIT } from './common'; export type { TurnCreatedEvent } from '@truefoundry/trueforge-core/agent-session'; export { EventType }; @@ -63,10 +63,10 @@ export const ListSessionEventsRequestQuerySchema = z .number() .int() .min(1) - .max(PAGE_LIMIT) + .max(EVENTS_PAGE_LIMIT) .optional() - .default(PAGE_LIMIT) - .describe(`Page size. Defaults to ${String(PAGE_LIMIT)}, max ${String(PAGE_LIMIT)}.`), + .default(EVENTS_PAGE_LIMIT) + .describe(`Page size. Defaults to ${String(EVENTS_PAGE_LIMIT)}, max ${String(EVENTS_PAGE_LIMIT)}.`), }) .openapi('ListSessionEventsRequestQuery'); diff --git a/packages/trueforge/src/schemas/turn.ts b/packages/trueforge/src/schemas/turn.ts index a7f210fd2..6071fe053 100644 --- a/packages/trueforge/src/schemas/turn.ts +++ b/packages/trueforge/src/schemas/turn.ts @@ -1,7 +1,7 @@ /** Server-only turn wire schemas (SSE resume / cancel / list). Core turn schemas live in agent-session. */ import { z } from '@hono/zod-openapi'; import { SessionEventSchema, TokenPaginationSchema, TurnSchema } from '@truefoundry/trueforge-core/agent-session'; -import { PAGE_LIMIT } from './common'; +import { EVENTS_PAGE_LIMIT, PAGE_LIMIT } from './common'; export { CreateTurnRequestSchema, TurnSchema } from '@truefoundry/trueforge-core/agent-session'; export type { Turn } from '@truefoundry/trueforge-core/agent-session'; @@ -68,10 +68,10 @@ export const ListTurnEventsRequestQuerySchema = z .number() .int() .min(1) - .max(PAGE_LIMIT) + .max(EVENTS_PAGE_LIMIT) .optional() - .default(PAGE_LIMIT) - .describe(`Page size. Defaults to ${String(PAGE_LIMIT)}, max ${String(PAGE_LIMIT)}.`), + .default(EVENTS_PAGE_LIMIT) + .describe(`Page size. Defaults to ${String(EVENTS_PAGE_LIMIT)}, max ${String(EVENTS_PAGE_LIMIT)}.`), page_token: z.string().optional().describe('Opaque token from a previous response `next_page_token`.'), order: z .enum(['asc', 'desc']) From e7e3d4ef8c2f1a33db0bf8b54eb6f9d267df4f7a Mon Sep 17 00:00:00 2001 From: "trueforge-dev-bot[bot]" Date: Wed, 19 Aug 2026 06:36:48 +0000 Subject: [PATCH 9/9] Regenerate OpenAPI document and TypeScript SDK --- .github/fern/openapi/openapi.json | 16 ++++++++-------- docs/openapi.json | 16 ++++++++-------- .../src/api/resources/sessions/client/Client.ts | 4 ++-- .../client/requests/ListEventsSessionsRequest.ts | 2 +- .../requests/ListTurnEventsSessionsRequest.ts | 2 +- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/.github/fern/openapi/openapi.json b/.github/fern/openapi/openapi.json index 4e6fb1404..0c344c41b 100644 --- a/.github/fern/openapi/openapi.json +++ b/.github/fern/openapi/openapi.json @@ -5644,14 +5644,14 @@ } }, { - "description": "Page size. Defaults to 25, max 25.", + "description": "Page size. Defaults to 100, max 100.", "in": "query", "name": "limit", "required": false, "schema": { - "default": 25, - "description": "Page size. Defaults to 25, max 25.", - "maximum": 25, + "default": 100, + "description": "Page size. Defaults to 100, max 100.", + "maximum": 100, "minimum": 1, "type": "integer" } @@ -6164,14 +6164,14 @@ } }, { - "description": "Page size. Defaults to 25, max 25.", + "description": "Page size. Defaults to 100, max 100.", "in": "query", "name": "limit", "required": false, "schema": { - "default": 25, - "description": "Page size. Defaults to 25, max 25.", - "maximum": 25, + "default": 100, + "description": "Page size. Defaults to 100, max 100.", + "maximum": 100, "minimum": 1, "type": "integer" } diff --git a/docs/openapi.json b/docs/openapi.json index 4e6fb1404..0c344c41b 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -5644,14 +5644,14 @@ } }, { - "description": "Page size. Defaults to 25, max 25.", + "description": "Page size. Defaults to 100, max 100.", "in": "query", "name": "limit", "required": false, "schema": { - "default": 25, - "description": "Page size. Defaults to 25, max 25.", - "maximum": 25, + "default": 100, + "description": "Page size. Defaults to 100, max 100.", + "maximum": 100, "minimum": 1, "type": "integer" } @@ -6164,14 +6164,14 @@ } }, { - "description": "Page size. Defaults to 25, max 25.", + "description": "Page size. Defaults to 100, max 100.", "in": "query", "name": "limit", "required": false, "schema": { - "default": 25, - "description": "Page size. Defaults to 25, max 25.", - "maximum": 25, + "default": 100, + "description": "Page size. Defaults to 100, max 100.", + "maximum": 100, "minimum": 1, "type": "integer" } diff --git a/packages/trueforge-sdk/src/api/resources/sessions/client/Client.ts b/packages/trueforge-sdk/src/api/resources/sessions/client/Client.ts index 95ead5acc..bd756c624 100644 --- a/packages/trueforge-sdk/src/api/resources/sessions/client/Client.ts +++ b/packages/trueforge-sdk/src/api/resources/sessions/client/Client.ts @@ -718,7 +718,7 @@ export class SessionsClient { async ( request: TrueForge.ListEventsSessionsRequest, ): Promise> => { - const { pageToken, lastTurnId, limit = 25 } = request; + const { pageToken, lastTurnId, limit = 100 } = request; const _queryParams: Record = { page_token: pageToken, last_turn_id: lastTurnId, @@ -1580,7 +1580,7 @@ export class SessionsClient { async ( request: TrueForge.ListTurnEventsSessionsRequest, ): Promise> => { - const { limit = 25, pageToken, order } = request; + const { limit = 100, pageToken, order } = request; const _queryParams: Record = { limit, page_token: pageToken, diff --git a/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListEventsSessionsRequest.ts b/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListEventsSessionsRequest.ts index d690b1af1..8692334f6 100644 --- a/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListEventsSessionsRequest.ts +++ b/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListEventsSessionsRequest.ts @@ -9,6 +9,6 @@ export interface ListEventsSessionsRequest { pageToken?: string; /** Newest turn in the listing window (initial load only; ignored when `page_token` is set). Lists that turn and its ancestors, newest events first. Omit to use the session last turn. */ lastTurnId?: string; - /** Page size. Defaults to 25, max 25. */ + /** Page size. Defaults to 100, max 100. */ limit?: number; } diff --git a/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListTurnEventsSessionsRequest.ts b/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListTurnEventsSessionsRequest.ts index 5b84aab61..25e51255a 100644 --- a/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListTurnEventsSessionsRequest.ts +++ b/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListTurnEventsSessionsRequest.ts @@ -7,7 +7,7 @@ import type * as TrueForge from "../../../../index.js"; * {} */ export interface ListTurnEventsSessionsRequest { - /** Page size. Defaults to 25, max 25. */ + /** Page size. Defaults to 100, max 100. */ limit?: number; /** Opaque token from a previous response `next_page_token`. */ pageToken?: string;