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..fc906e1a3
--- /dev/null
+++ b/.changeset/20260818100000-api-path-and-sdk-naming.md
@@ -0,0 +1,6 @@
+---
+'@truefoundry/trueforge': patch
+'@truefoundry/trueforge-ui': patch
+---
+
+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/.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 7638276bc..0c344c41b 100644
--- a/.github/fern/openapi/openapi.json
+++ b/.github/fern/openapi/openapi.json
@@ -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"
@@ -5058,6 +5058,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`.",
@@ -5098,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 10, max 100.",
+ "description": "Page size. Defaults to 25, max 25.",
"in": "query",
"name": "limit",
"required": false,
"schema": {
- "default": 10,
- "description": "Page size. Defaults to 10, max 100.",
- "maximum": 100,
+ "default": 25,
+ "description": "Page size. Defaults to 25, max 25.",
+ "maximum": 25,
"minimum": 1,
"type": "integer"
}
@@ -5566,13 +5644,13 @@
}
},
{
- "description": "Max events per response. Default 100, max 100.",
+ "description": "Page size. Defaults to 100, max 100.",
"in": "query",
"name": "limit",
"required": false,
"schema": {
"default": 100,
- "description": "Max events per response. Default 100, max 100.",
+ "description": "Page size. Defaults to 100, max 100.",
"maximum": 100,
"minimum": 1,
"type": "integer"
@@ -5653,14 +5731,14 @@
}
},
{
- "description": "Page size. Defaults to 10, max 100.",
+ "description": "Page size. Defaults to 25, max 25.",
"in": "query",
"name": "limit",
"required": false,
"schema": {
- "default": 10,
- "description": "Page size. Defaults to 10, max 100.",
- "maximum": 100,
+ "default": 25,
+ "description": "Page size. Defaults to 25, max 25.",
+ "maximum": 25,
"minimum": 1,
"type": "integer"
}
@@ -5926,7 +6004,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": [
@@ -6086,13 +6164,13 @@
}
},
{
- "description": "Max events per response. Default 25, max 100.",
+ "description": "Page size. Defaults to 100, max 100.",
"in": "query",
"name": "limit",
"required": false,
"schema": {
- "default": 25,
- "description": "Max events per response. Default 25, max 100.",
+ "default": 100,
+ "description": "Page size. Defaults to 100, max 100.",
"maximum": 100,
"minimum": 1,
"type": "integer"
@@ -6444,7 +6522,7 @@
"settings",
"mcpServers"
],
- "x-fern-sdk-method-name": "upsert"
+ "x-fern-sdk-method-name": "create_or_update"
}
},
"/api/v1/settings/mcp-servers/{name}": {
@@ -6496,85 +6574,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.",
@@ -6716,7 +6715,7 @@
"settings",
"modelProviders"
],
- "x-fern-sdk-method-name": "upsert"
+ "x-fern-sdk-method-name": "create_or_update"
}
},
"/api/v1/settings/sandbox-providers": {
@@ -6806,7 +6805,7 @@
"settings",
"sandboxProviders"
],
- "x-fern-sdk-method-name": "upsert"
+ "x-fern-sdk-method-name": "create_or_update"
}
},
"/api/v1/settings/skills": {
@@ -6950,7 +6949,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 7638276bc..0c344c41b 100644
--- a/docs/openapi.json
+++ b/docs/openapi.json
@@ -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"
@@ -5058,6 +5058,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`.",
@@ -5098,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 10, max 100.",
+ "description": "Page size. Defaults to 25, max 25.",
"in": "query",
"name": "limit",
"required": false,
"schema": {
- "default": 10,
- "description": "Page size. Defaults to 10, max 100.",
- "maximum": 100,
+ "default": 25,
+ "description": "Page size. Defaults to 25, max 25.",
+ "maximum": 25,
"minimum": 1,
"type": "integer"
}
@@ -5566,13 +5644,13 @@
}
},
{
- "description": "Max events per response. Default 100, max 100.",
+ "description": "Page size. Defaults to 100, max 100.",
"in": "query",
"name": "limit",
"required": false,
"schema": {
"default": 100,
- "description": "Max events per response. Default 100, max 100.",
+ "description": "Page size. Defaults to 100, max 100.",
"maximum": 100,
"minimum": 1,
"type": "integer"
@@ -5653,14 +5731,14 @@
}
},
{
- "description": "Page size. Defaults to 10, max 100.",
+ "description": "Page size. Defaults to 25, max 25.",
"in": "query",
"name": "limit",
"required": false,
"schema": {
- "default": 10,
- "description": "Page size. Defaults to 10, max 100.",
- "maximum": 100,
+ "default": 25,
+ "description": "Page size. Defaults to 25, max 25.",
+ "maximum": 25,
"minimum": 1,
"type": "integer"
}
@@ -5926,7 +6004,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": [
@@ -6086,13 +6164,13 @@
}
},
{
- "description": "Max events per response. Default 25, max 100.",
+ "description": "Page size. Defaults to 100, max 100.",
"in": "query",
"name": "limit",
"required": false,
"schema": {
- "default": 25,
- "description": "Max events per response. Default 25, max 100.",
+ "default": 100,
+ "description": "Page size. Defaults to 100, max 100.",
"maximum": 100,
"minimum": 1,
"type": "integer"
@@ -6444,7 +6522,7 @@
"settings",
"mcpServers"
],
- "x-fern-sdk-method-name": "upsert"
+ "x-fern-sdk-method-name": "create_or_update"
}
},
"/api/v1/settings/mcp-servers/{name}": {
@@ -6496,85 +6574,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.",
@@ -6716,7 +6715,7 @@
"settings",
"modelProviders"
],
- "x-fern-sdk-method-name": "upsert"
+ "x-fern-sdk-method-name": "create_or_update"
}
},
"/api/v1/settings/sandbox-providers": {
@@ -6806,7 +6805,7 @@
"settings",
"sandboxProviders"
],
- "x-fern-sdk-method-name": "upsert"
+ "x-fern-sdk-method-name": "create_or_update"
}
},
"/api/v1/settings/skills": {
@@ -6950,7 +6949,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 eb1b52752..687d5bd05 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 c4f0cb802..653c51c92 100644
--- a/packages/trueforge-sdk/reference.md
+++ b/packages/trueforge-sdk/reference.md
@@ -681,6 +681,69 @@ await client.mcpServers.deleteAuthorization("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 effe7a704..38dd6d2ff 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..bd756c624 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 = 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 = 10, pageToken } = request;
+ const { limit = 25, pageToken } = request;
const _queryParams: Record = {
limit,
page_token: pageToken,
@@ -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",
);
}
@@ -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 85b649636..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;
- /** Max events per response. Default 100, max 100. */
+ /** Page size. Defaults to 100, max 100. */
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..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 10, 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/ListTurnEventsSessionsRequest.ts b/packages/trueforge-sdk/src/api/resources/sessions/client/requests/ListTurnEventsSessionsRequest.ts
index 2daebab86..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 {
- /** Max events per response. Default 25, max 100. */
+ /** Page size. Defaults to 100, max 100. */
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..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 10, 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/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 baed67e07..76183071d 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.deleteAuthorization("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",
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 76a053e57..b149321cf 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..fe8903913 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). Flag `x-fern-sdk-method-name: upsert` — PUT create-or-replace must be `create_or_update`. 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..0114cb7d8 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). PUT create-or-replace MUST use `create_or_update`, never `upsert`. 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 1ffe38115..7c1636499 100644
--- a/packages/trueforge/src/apis/mcpServers.ts
+++ b/packages/trueforge/src/apis/mcpServers.ts
@@ -307,61 +307,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');
@@ -417,6 +371,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 deleteAuthorizationHandler: RouteHandler = async c => {
const { name } = c.req.valid('param');
const userRef = deps.resolveUserContext(c).userRef;
@@ -445,6 +443,7 @@ export function createMcpServersRouter(deps: McpServersRouterDeps<
200,
);
});
+ router.openapi(listMcpServerToolsRoute, listToolsHandler);
router.openapi(authorizeMcpServerRoute, authorizeHandler);
router.openapi(deleteAuthorizationMcpServerRoute, deleteAuthorizationHandler);
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 8c2b51392..1efd668e5 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..f16f4b43f 100644
--- a/packages/trueforge/src/schemas/common.ts
+++ b/packages/trueforge/src/schemas/common.ts
@@ -19,6 +19,11 @@ 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 {
const seen = new Set();
diff --git a/packages/trueforge/src/schemas/events.ts b/packages/trueforge/src/schemas/events.ts
index 867ac548b..41e13d080 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 { EVENTS_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(EVENTS_PAGE_LIMIT)
.optional()
- .default(SESSION_EVENTS_LIMIT)
- .describe(
- `Max events per response. Default ${String(SESSION_EVENTS_LIMIT)}, max ${String(SESSION_EVENTS_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/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..0583bdf7f 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 { NameSchema, PAGE_LIMIT } 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(PAGE_LIMIT)
.optional()
- .default(DEFAULT_SESSIONS_LIMIT)
- .describe(`Page size. Defaults to ${String(DEFAULT_SESSIONS_LIMIT)}, max ${String(SESSIONS_MAX_LIMIT)}.`),
+ .default(PAGE_LIMIT)
+ .describe(`Page size. Defaults to ${String(PAGE_LIMIT)}, max ${String(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..6071fe053 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 { 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';
@@ -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(PAGE_LIMIT)
.optional()
- .default(DEFAULT_TURNS_LIMIT)
- .describe(`Page size. Defaults to ${String(DEFAULT_TURNS_LIMIT)}, max ${String(TURNS_MAX_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`.'),
})
.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(EVENTS_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(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'])
diff --git a/packages/trueforge/tests/unit/apis/mcpServers.test.ts b/packages/trueforge/tests/unit/apis/mcpServers.test.ts
index 2cf41b1cb..725c73239 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);