From 8840cefa1f6c62c42ceca21a2469ecb4d3aafc0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Banaszewski?= Date: Tue, 2 Jun 2026 13:37:14 +0000 Subject: [PATCH] agentic review 3 + make gen diff --- coderd/apidoc/docs.go | 194 ++++++++++++------------ coderd/apidoc/swagger.json | 170 ++++++++++----------- coderd/database/querier_test.go | 10 +- docs/reference/api/enterprise.md | 38 ++--- docs/reference/api/schemas.md | 6 +- enterprise/coderd/aigatewaykeys_test.go | 2 + 6 files changed, 211 insertions(+), 209 deletions(-) diff --git a/coderd/apidoc/docs.go b/coderd/apidoc/docs.go index fa66ef1bdb..cf1d93feed 100644 --- a/coderd/apidoc/docs.go +++ b/coderd/apidoc/docs.go @@ -1422,100 +1422,6 @@ const docTemplate = `{ ] } }, - "/api/v2/aibridge/coderd-keys": { - "get": { - "produces": [ - "application/json" - ], - "tags": [ - "Enterprise" - ], - "summary": "List AI Gateway coderd keys", - "operationId": "list-ai-gateway-coderd-keys", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/codersdk.AIGatewayCoderdKey" - } - } - } - }, - "security": [ - { - "CoderSessionToken": [] - } - ] - }, - "post": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "Enterprise" - ], - "summary": "Create AI Gateway coderd key", - "operationId": "create-ai-gateway-coderd-key", - "parameters": [ - { - "description": "Create AI Gateway coderd key request", - "name": "request", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/codersdk.CreateAIGatewayCoderdKeyRequest" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/codersdk.CreateAIGatewayCoderdKeyResponse" - } - } - }, - "security": [ - { - "CoderSessionToken": [] - } - ] - } - }, - "/api/v2/aibridge/coderd-keys/{key}": { - "delete": { - "tags": [ - "Enterprise" - ], - "summary": "Delete AI Gateway coderd key", - "operationId": "delete-ai-gateway-coderd-key", - "parameters": [ - { - "type": "string", - "format": "uuid", - "description": "Key ID", - "name": "key", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content" - } - }, - "security": [ - { - "CoderSessionToken": [] - } - ] - } - }, "/api/v2/aibridge/interceptions": { "get": { "produces": [ @@ -1568,6 +1474,100 @@ const docTemplate = `{ ] } }, + "/api/v2/aibridge/keys": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Enterprise" + ], + "summary": "List AI Gateway keys", + "operationId": "list-ai-gatewaykeys", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/codersdk.AIGatewayKey" + } + } + } + }, + "security": [ + { + "CoderSessionToken": [] + } + ] + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "Enterprise" + ], + "summary": "Create AI Gateway key", + "operationId": "create-ai-gateway-key", + "parameters": [ + { + "description": "Create AI Gateway key request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/codersdk.CreateAIGatewayKeyRequest" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/codersdk.CreateAIGatewayKeyResponse" + } + } + }, + "security": [ + { + "CoderSessionToken": [] + } + ] + } + }, + "/api/v2/aibridge/keys/{key}": { + "delete": { + "tags": [ + "Enterprise" + ], + "summary": "Delete AI Gateway key", + "operationId": "delete-ai-gateway-key", + "parameters": [ + { + "type": "string", + "format": "uuid", + "description": "Key ID", + "name": "key", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + }, + "security": [ + { + "CoderSessionToken": [] + } + ] + } + }, "/api/v2/aibridge/models": { "get": { "produces": [ @@ -15142,7 +15142,7 @@ const docTemplate = `{ } } }, - "codersdk.AIGatewayCoderdKey": { + "codersdk.AIGatewayKey": { "type": "object", "properties": { "created_at": { @@ -17699,7 +17699,7 @@ const docTemplate = `{ } } }, - "codersdk.CreateAIGatewayCoderdKeyRequest": { + "codersdk.CreateAIGatewayKeyRequest": { "type": "object", "required": [ "name" @@ -17710,7 +17710,7 @@ const docTemplate = `{ } } }, - "codersdk.CreateAIGatewayCoderdKeyResponse": { + "codersdk.CreateAIGatewayKeyResponse": { "type": "object", "properties": { "created_at": { diff --git a/coderd/apidoc/swagger.json b/coderd/apidoc/swagger.json index 2a0823a023..7a4cda5fe1 100644 --- a/coderd/apidoc/swagger.json +++ b/coderd/apidoc/swagger.json @@ -1255,88 +1255,6 @@ ] } }, - "/api/v2/aibridge/coderd-keys": { - "get": { - "produces": ["application/json"], - "tags": ["Enterprise"], - "summary": "List AI Gateway coderd keys", - "operationId": "list-ai-gateway-coderd-keys", - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/codersdk.AIGatewayCoderdKey" - } - } - } - }, - "security": [ - { - "CoderSessionToken": [] - } - ] - }, - "post": { - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["Enterprise"], - "summary": "Create AI Gateway coderd key", - "operationId": "create-ai-gateway-coderd-key", - "parameters": [ - { - "description": "Create AI Gateway coderd key request", - "name": "request", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/codersdk.CreateAIGatewayCoderdKeyRequest" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/codersdk.CreateAIGatewayCoderdKeyResponse" - } - } - }, - "security": [ - { - "CoderSessionToken": [] - } - ] - } - }, - "/api/v2/aibridge/coderd-keys/{key}": { - "delete": { - "tags": ["Enterprise"], - "summary": "Delete AI Gateway coderd key", - "operationId": "delete-ai-gateway-coderd-key", - "parameters": [ - { - "type": "string", - "format": "uuid", - "description": "Key ID", - "name": "key", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content" - } - }, - "security": [ - { - "CoderSessionToken": [] - } - ] - } - }, "/api/v2/aibridge/interceptions": { "get": { "produces": ["application/json"], @@ -1385,6 +1303,88 @@ ] } }, + "/api/v2/aibridge/keys": { + "get": { + "produces": ["application/json"], + "tags": ["Enterprise"], + "summary": "List AI Gateway keys", + "operationId": "list-ai-gatewaykeys", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/codersdk.AIGatewayKey" + } + } + } + }, + "security": [ + { + "CoderSessionToken": [] + } + ] + }, + "post": { + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["Enterprise"], + "summary": "Create AI Gateway key", + "operationId": "create-ai-gateway-key", + "parameters": [ + { + "description": "Create AI Gateway key request", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/codersdk.CreateAIGatewayKeyRequest" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/codersdk.CreateAIGatewayKeyResponse" + } + } + }, + "security": [ + { + "CoderSessionToken": [] + } + ] + } + }, + "/api/v2/aibridge/keys/{key}": { + "delete": { + "tags": ["Enterprise"], + "summary": "Delete AI Gateway key", + "operationId": "delete-ai-gateway-key", + "parameters": [ + { + "type": "string", + "format": "uuid", + "description": "Key ID", + "name": "key", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + } + }, + "security": [ + { + "CoderSessionToken": [] + } + ] + } + }, "/api/v2/aibridge/models": { "get": { "produces": ["application/json"], @@ -13522,7 +13522,7 @@ } } }, - "codersdk.AIGatewayCoderdKey": { + "codersdk.AIGatewayKey": { "type": "object", "properties": { "created_at": { @@ -15992,7 +15992,7 @@ } } }, - "codersdk.CreateAIGatewayCoderdKeyRequest": { + "codersdk.CreateAIGatewayKeyRequest": { "type": "object", "required": ["name"], "properties": { @@ -16001,7 +16001,7 @@ } } }, - "codersdk.CreateAIGatewayCoderdKeyResponse": { + "codersdk.CreateAIGatewayKeyResponse": { "type": "object", "properties": { "created_at": { diff --git a/coderd/database/querier_test.go b/coderd/database/querier_test.go index 3139f70934..d38177675d 100644 --- a/coderd/database/querier_test.go +++ b/coderd/database/querier_test.go @@ -14740,13 +14740,13 @@ func TestAIGatewayKeysTableConstraints(t *testing.T) { db, _ := dbtestutil.NewDB(t) ctx := testutil.Context(t, testutil.WaitMedium) - preExsiting := database.InsertAIGatewayKeyParams{ + preExisting := database.InsertAIGatewayKeyParams{ ID: uuid.New(), Name: "name", SecretPrefix: "key_test__1", HashedSecret: []byte("first-secret"), } - _, err := db.InsertAIGatewayKey(ctx, preExsiting) + _, err := db.InsertAIGatewayKey(ctx, preExisting) require.NoError(t, err) tests := []struct { @@ -14757,17 +14757,17 @@ func TestAIGatewayKeysTableConstraints(t *testing.T) { }{ { name: "duplicate name", - params: aiGatewayKeyParams(preExsiting.Name, "key_test002"), + params: aiGatewayKeyParams(preExisting.Name, "key_test002"), expectUniqueErr: database.UniqueAiGatewayKeysNameIndex, }, { name: "duplicate secret prefix", - params: aiGatewayKeyParams("different-key", preExsiting.SecretPrefix), + params: aiGatewayKeyParams("different-key", preExisting.SecretPrefix), expectUniqueErr: database.UniqueAiGatewayKeysSecretPrefixIndex, }, { name: "duplicate hashed secret", - params: database.InsertAIGatewayKeyParams{ID: uuid.New(), Name: "other-name", SecretPrefix: "key_1234567", HashedSecret: preExsiting.HashedSecret}, + params: database.InsertAIGatewayKeyParams{ID: uuid.New(), Name: "other-name", SecretPrefix: "key_1234567", HashedSecret: preExisting.HashedSecret}, expectUniqueErr: database.UniqueAiGatewayKeysHashedSecretIndex, }, { diff --git a/docs/reference/api/enterprise.md b/docs/reference/api/enterprise.md index b1c7fa6b0a..c2d193aa32 100644 --- a/docs/reference/api/enterprise.md +++ b/docs/reference/api/enterprise.md @@ -84,18 +84,18 @@ curl -X GET http://coder-server:8080/.well-known/oauth-protected-resource \ |--------|---------------------------------------------------------|-------------|------------------------------------------------------------------------------------------------| | 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | OK | [codersdk.OAuth2ProtectedResourceMetadata](schemas.md#codersdkoauth2protectedresourcemetadata) | -## List AI Gateway coderd keys +## List AI Gateway keys ### Code samples ```shell # Example request using curl -curl -X GET http://coder-server:8080/api/v2/aibridge/coderd-keys \ +curl -X GET http://coder-server:8080/api/v2/aibridge/keys \ -H 'Accept: application/json' \ -H 'Coder-Session-Token: API_KEY' ``` -`GET /api/v2/aibridge/coderd-keys` +`GET /api/v2/aibridge/keys` ### Example responses @@ -115,11 +115,11 @@ curl -X GET http://coder-server:8080/api/v2/aibridge/coderd-keys \ ### Responses -| Status | Meaning | Description | Schema | -|--------|---------------------------------------------------------|-------------|-------------------------------------------------------------------------------| -| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | OK | array of [codersdk.AIGatewayCoderdKey](schemas.md#codersdkaigatewaycoderdkey) | +| Status | Meaning | Description | Schema | +|--------|---------------------------------------------------------|-------------|-------------------------------------------------------------------| +| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | OK | array of [codersdk.AIGatewayKey](schemas.md#codersdkaigatewaykey) | -

Response Schema

+

Response Schema

Status Code **200** @@ -134,19 +134,19 @@ Status Code **200** To perform this operation, you must be authenticated. [Learn more](authentication.md). -## Create AI Gateway coderd key +## Create AI Gateway key ### Code samples ```shell # Example request using curl -curl -X POST http://coder-server:8080/api/v2/aibridge/coderd-keys \ +curl -X POST http://coder-server:8080/api/v2/aibridge/keys \ -H 'Content-Type: application/json' \ -H 'Accept: application/json' \ -H 'Coder-Session-Token: API_KEY' ``` -`POST /api/v2/aibridge/coderd-keys` +`POST /api/v2/aibridge/keys` > Body parameter @@ -158,9 +158,9 @@ curl -X POST http://coder-server:8080/api/v2/aibridge/coderd-keys \ ### Parameters -| Name | In | Type | Required | Description | -|--------|------|------------------------------------------------------------------------------------------------|----------|--------------------------------------| -| `body` | body | [codersdk.CreateAIGatewayCoderdKeyRequest](schemas.md#codersdkcreateaigatewaycoderdkeyrequest) | true | Create AI Gateway coderd key request | +| Name | In | Type | Required | Description | +|--------|------|------------------------------------------------------------------------------------|----------|-------------------------------| +| `body` | body | [codersdk.CreateAIGatewayKeyRequest](schemas.md#codersdkcreateaigatewaykeyrequest) | true | Create AI Gateway key request | ### Example responses @@ -178,23 +178,23 @@ curl -X POST http://coder-server:8080/api/v2/aibridge/coderd-keys \ ### Responses -| Status | Meaning | Description | Schema | -|--------|--------------------------------------------------------------|-------------|--------------------------------------------------------------------------------------------------| -| 201 | [Created](https://tools.ietf.org/html/rfc7231#section-6.3.2) | Created | [codersdk.CreateAIGatewayCoderdKeyResponse](schemas.md#codersdkcreateaigatewaycoderdkeyresponse) | +| Status | Meaning | Description | Schema | +|--------|--------------------------------------------------------------|-------------|--------------------------------------------------------------------------------------| +| 201 | [Created](https://tools.ietf.org/html/rfc7231#section-6.3.2) | Created | [codersdk.CreateAIGatewayKeyResponse](schemas.md#codersdkcreateaigatewaykeyresponse) | To perform this operation, you must be authenticated. [Learn more](authentication.md). -## Delete AI Gateway coderd key +## Delete AI Gateway key ### Code samples ```shell # Example request using curl -curl -X DELETE http://coder-server:8080/api/v2/aibridge/coderd-keys/{key} \ +curl -X DELETE http://coder-server:8080/api/v2/aibridge/keys/{key} \ -H 'Coder-Session-Token: API_KEY' ``` -`DELETE /api/v2/aibridge/coderd-keys/{key}` +`DELETE /api/v2/aibridge/keys/{key}` ### Parameters diff --git a/docs/reference/api/schemas.md b/docs/reference/api/schemas.md index 56a0bf6454..91db75c177 100644 --- a/docs/reference/api/schemas.md +++ b/docs/reference/api/schemas.md @@ -1248,7 +1248,7 @@ | `bridge` | [codersdk.AIBridgeConfig](#codersdkaibridgeconfig) | false | | | | `chat` | [codersdk.ChatConfig](#codersdkchatconfig) | false | | | -## codersdk.AIGatewayCoderdKey +## codersdk.AIGatewayKey ```json { @@ -4428,7 +4428,7 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in | `password` | string | true | | | | `to_type` | [codersdk.LoginType](#codersdklogintype) | true | | To type is the login type to convert to. | -## codersdk.CreateAIGatewayCoderdKeyRequest +## codersdk.CreateAIGatewayKeyRequest ```json { @@ -4442,7 +4442,7 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in |--------|--------|----------|--------------|-------------| | `name` | string | true | | | -## codersdk.CreateAIGatewayCoderdKeyResponse +## codersdk.CreateAIGatewayKeyResponse ```json { diff --git a/enterprise/coderd/aigatewaykeys_test.go b/enterprise/coderd/aigatewaykeys_test.go index 82e12c2f06..f23b673a42 100644 --- a/enterprise/coderd/aigatewaykeys_test.go +++ b/enterprise/coderd/aigatewaykeys_test.go @@ -85,8 +85,10 @@ func TestAIGatewayKeys(t *testing.T) { var raw []map[string]any require.NoError(t, json.NewDecoder(resp.Body).Decode(&raw)) require.NotEmpty(t, raw) + _, hasKey := raw[0]["key"] _, hasSecret := raw[0]["secret"] _, hasHashed := raw[0]["hashed_secret"] + require.False(t, hasKey, "LIST response leaked full key") require.False(t, hasSecret, "LIST response leaked plaintext secret") require.False(t, hasHashed, "LIST response leaked hashed_secret") })