gitlab-ai-provider 6.9.0 → 6.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,11 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
4
4
 
5
+ ## <small>6.9.1 (2026-06-10)</small>
6
+
7
+ - Merge branch 'fix-security-review-hardening' into 'main' ([81e627b](https://gitlab.com/vglafirov/gitlab-ai-provider/commit/81e627b))
8
+ - fix: harden security, auth reliability, and stream lifecycle across provider ([ba754bf](https://gitlab.com/vglafirov/gitlab-ai-provider/commit/ba754bf))
9
+
5
10
  ## 6.9.0 (2026-06-10)
6
11
 
7
12
  - feat: add Claude Fable 5 model mapping ([0677b06](https://gitlab.com/vglafirov/gitlab-ai-provider/commit/0677b06))
package/dist/index.d.mts CHANGED
@@ -257,6 +257,8 @@ interface ModelCacheEntry {
257
257
  selectedModelRef: string | null;
258
258
  selectedModelName: string | null;
259
259
  updatedAt: string;
260
+ /** Timestamp of the last successful discovery write — drives the discovery TTL. */
261
+ discoveryUpdatedAt?: string;
260
262
  }
261
263
  declare class GitLabModelCache {
262
264
  private readonly filePath;
@@ -275,6 +277,7 @@ declare class GitLabModelCache {
275
277
  save(entry: ModelCacheEntry): void;
276
278
  /**
277
279
  * Returns true if the discovery data is missing or older than DISCOVERY_TTL_MS.
280
+ * Invalid or missing timestamps are treated as expired (fail closed).
278
281
  */
279
282
  isDiscoveryExpired(): boolean;
280
283
  /**
@@ -673,7 +676,7 @@ declare const AGENT_PRIVILEGES: {
673
676
  readonly RUN_MCP_TOOLS: 6;
674
677
  };
675
678
  /** Default agent privileges — matches gitlab-lsp defaults */
676
- declare const DEFAULT_AGENT_PRIVILEGES: (1 | 2 | 4 | 3 | 5 | 6)[];
679
+ declare const DEFAULT_AGENT_PRIVILEGES: (1 | 2 | 3 | 4 | 5 | 6)[];
677
680
  /** Workflow execution environment */
678
681
  declare const WORKFLOW_ENVIRONMENT: "ide";
679
682
 
@@ -714,6 +717,12 @@ declare class GitLabWorkflowLanguageModel implements LanguageModelV3 {
714
717
  private readonly modelCache;
715
718
  private detectedProjectPath;
716
719
  private readonly sessionWorkflows;
720
+ private static readonly MAX_SESSION_WORKFLOWS;
721
+ /**
722
+ * Store a session workflow entry, refreshing its LRU position and
723
+ * evicting the oldest entries beyond MAX_SESSION_WORKFLOWS.
724
+ */
725
+ private setSessionWorkflow;
717
726
  private currentWorkflowId;
718
727
  private currentWorkflowDefinition;
719
728
  private persistedAgentEmitted;
@@ -1096,6 +1105,16 @@ declare class GitLabOpenAILanguageModel implements LanguageModelV3 {
1096
1105
  * These should NOT trigger token refresh and should be reported to the user.
1097
1106
  */
1098
1107
  private isContextOverflowError;
1108
+ /**
1109
+ * Build a descriptive error message from an OpenAI APIError.
1110
+ *
1111
+ * The AI Gateway proxy often returns errors with empty bodies, which the
1112
+ * OpenAI SDK renders as "500 status code (no body)". This helper surfaces
1113
+ * everything that is actually available: the parsed error body, the
1114
+ * request ID for support, and — for 5xx responses with a large tool set —
1115
+ * a hint that the gateway may be rejecting the request due to tool count.
1116
+ */
1117
+ private formatOpenAIError;
1099
1118
  private convertTools;
1100
1119
  private convertToolChoice;
1101
1120
  private convertPrompt;
@@ -1273,13 +1292,16 @@ interface RefreshTokenParams extends TokenExchangeParams {
1273
1292
  }
1274
1293
  declare class GitLabOAuthManager {
1275
1294
  private fetch;
1295
+ private inFlightRefreshes;
1276
1296
  constructor(fetchImpl?: typeof fetch);
1277
1297
  /**
1278
- * Check if a token is expired
1298
+ * Check if a token is expired.
1299
+ * Invalid expiry values (NaN) are treated as expired (fail closed).
1279
1300
  */
1280
1301
  isTokenExpired(expiresAt: number): boolean;
1281
1302
  /**
1282
- * Check if a token needs refresh (within skew window)
1303
+ * Check if a token needs refresh (within skew window).
1304
+ * Invalid expiry values (NaN) are treated as needing refresh (fail closed).
1283
1305
  */
1284
1306
  needsRefresh(expiresAt: number): boolean;
1285
1307
  /**
@@ -1310,7 +1332,8 @@ declare class GitLabOAuthManager {
1310
1332
  */
1311
1333
  private exchangeToken;
1312
1334
  /**
1313
- * Create GitLabOAuthTokens from token response
1335
+ * Create GitLabOAuthTokens from token response.
1336
+ * Falls back to the previous refresh token when the server omits one.
1314
1337
  */
1315
1338
  private createTokensFromResponse;
1316
1339
  /**
@@ -1494,6 +1517,7 @@ declare class GitLabWorkflowClient {
1494
1517
  private heartbeatInterval;
1495
1518
  private eventCallback;
1496
1519
  private closed;
1520
+ private closedEmitted;
1497
1521
  private lastSendTime;
1498
1522
  /**
1499
1523
  * Connect to the DWS WebSocket and start listening for events.
@@ -1513,6 +1537,9 @@ declare class GitLabWorkflowClient {
1513
1537
  sendActionResponse(requestID: string, response: string, error?: string | null): void;
1514
1538
  /**
1515
1539
  * Stop the workflow gracefully.
1540
+ *
1541
+ * Sends a stopWorkflow event, then closes the socket and clears all
1542
+ * timers so no heartbeats keep firing if the server never closes.
1516
1543
  */
1517
1544
  stop(): void;
1518
1545
  /**
@@ -1531,6 +1558,20 @@ declare class GitLabWorkflowClient {
1531
1558
  private send;
1532
1559
  private sendHeartbeatIfNeeded;
1533
1560
  private emit;
1561
+ /**
1562
+ * Emit the 'closed' event exactly once.
1563
+ */
1564
+ private emitClosed;
1565
+ /**
1566
+ * Decode an incoming WebSocket frame to a UTF-8 string.
1567
+ * Handles string, Buffer, ArrayBuffer and Buffer[] payloads.
1568
+ */
1569
+ private decodeMessageData;
1570
+ /**
1571
+ * Detach and close any existing socket before creating a new one.
1572
+ * Prevents socket and interval leaks on repeated connect() calls.
1573
+ */
1574
+ private disposeSocket;
1534
1575
  /**
1535
1576
  * Start ws.ping() keepalive (45s interval).
1536
1577
  * Keeps TCP connection alive through proxies/load balancers.
@@ -1705,4 +1746,4 @@ interface WorkflowDiscoveryResult {
1705
1746
  }
1706
1747
  declare function discoverWorkflowModels(config: WorkflowDiscoveryConfig, options: WorkflowDiscoveryOptions): Promise<WorkflowDiscoveryResult>;
1707
1748
 
1708
- export { AGENT_PRIVILEGES, type ActionResponsePayload, type AdditionalContext, type AiChatAvailableModels, type AiModel, type ApprovalDecision, BUNDLED_CLIENT_ID, CLIENT_VERSION, type ClientEvent, DEFAULT_AGENT_PRIVILEGES, DEFAULT_AI_GATEWAY_URL, DEFAULT_CLIENT_CAPABILITIES, DEFAULT_WORKFLOW_DEFINITION, type DirectAccessToken, type DiscoveredModels, type DiscoveredWorkflowModel, GITLAB_COM_URL, type GenerateTokenResponse, type GitLabAgenticOptions, type GitLabAnthropicConfig, GitLabAnthropicLanguageModel, GitLabDirectAccessClient, type GitLabDirectAccessConfig, GitLabError, type GitLabErrorOptions, GitLabModelCache, GitLabModelConfigRegistry, GitLabModelDiscovery, GitLabOAuthManager, type GitLabOAuthTokenResponse, type GitLabOAuthTokens, type GitLabOpenAIConfig, GitLabOpenAILanguageModel, type GitLabProject, GitLabProjectCache, GitLabProjectDetector, type GitLabProjectDetectorConfig, type GitLabProvider, type GitLabProviderSettings, GitLabWorkflowClient, type GitLabWorkflowClientConfig, GitLabWorkflowLanguageModel, type GitLabWorkflowLanguageModelConfig, type GitLabWorkflowOptions, GitLabWorkflowTokenClient, MODEL_ID_TO_ANTHROPIC_MODEL, MODEL_MAPPINGS, type McpToolDefinition, type ModelCacheEntry, type ModelConfig, type ModelConfigRegistryOptions, type ModelDiscoveryConfig, type ModelMapping, type ModelProvider, type NewCheckpoint, OAUTH_SCOPES, OPENCODE_GITLAB_AUTH_CLIENT_ID, type OpenAIApiType, type OpenCodeAuth, type OpenCodeAuthApi, type OpenCodeAuthOAuth, type RunMcpTool, type StartRequest, TOKEN_EXPIRY_SKEW_MS, VERSION, WORKFLOW_ENVIRONMENT, WS_HEARTBEAT_INTERVAL_MS, WS_KEEPALIVE_PING_INTERVAL_MS, type WorkflowAction, type WorkflowClientEvent, type WorkflowDiscoveryConfig, type WorkflowDiscoveryOptions, type WorkflowDiscoveryResult, type WorkflowStatus, type WorkflowToolExecutor, WorkflowType, type WorkflowWebSocketOptions, createGitLab, discoverWorkflowModels, getAnthropicModelForModelId, getModelMapping, getOpenAIApiType, getOpenAIModelForModelId, getProviderForModelId, getValidModelsForProvider, getWorkflowModelRef, gitlab, isResponsesApiModel, isWorkflowModel, parseModelsYml };
1749
+ export { AGENT_PRIVILEGES, type ActionResponsePayload, type AdditionalContext, type AiChatAvailableModels, type AiModel, type ApprovalDecision, BUNDLED_CLIENT_ID, CLIENT_VERSION, type ClientEvent, DEFAULT_AGENT_PRIVILEGES, DEFAULT_AI_GATEWAY_URL, DEFAULT_CLIENT_CAPABILITIES, DEFAULT_WORKFLOW_DEFINITION, type DirectAccessToken, type DiscoveredModels, type DiscoveredWorkflowModel, GITLAB_COM_URL, type GenerateTokenResponse, type GitLabAgenticOptions, type GitLabAnthropicConfig, GitLabAnthropicLanguageModel, GitLabDirectAccessClient, type GitLabDirectAccessConfig, GitLabError, type GitLabErrorOptions, GitLabModelCache, GitLabModelConfigRegistry, GitLabModelDiscovery, GitLabOAuthManager, type GitLabOAuthTokenResponse, type GitLabOAuthTokens, type GitLabOpenAIConfig, GitLabOpenAILanguageModel, type GitLabProject, GitLabProjectCache, GitLabProjectDetector, type GitLabProjectDetectorConfig, type GitLabProvider, type GitLabProviderSettings, GitLabWorkflowClient, type GitLabWorkflowClientConfig, GitLabWorkflowLanguageModel, type GitLabWorkflowLanguageModelConfig, type GitLabWorkflowOptions, GitLabWorkflowTokenClient, MODEL_ID_TO_ANTHROPIC_MODEL, MODEL_MAPPINGS, type McpToolDefinition, type ModelCacheEntry, type ModelConfig, type ModelConfigRegistryOptions, type ModelDiscoveryConfig, type ModelMapping, type ModelProvider, type NewCheckpoint, OAUTH_SCOPES, OPENCODE_GITLAB_AUTH_CLIENT_ID, type OpenAIApiType, type OpenCodeAuth, type OpenCodeAuthApi, type OpenCodeAuthOAuth, type RunMcpTool, type StartRequest, TOKEN_EXPIRY_SKEW_MS, VERSION, WORKFLOW_ENVIRONMENT, WS_HEARTBEAT_INTERVAL_MS, WS_KEEPALIVE_PING_INTERVAL_MS, type WorkflowAction, type WorkflowClientEvent, type WorkflowDiscoveryConfig, type WorkflowDiscoveryOptions, type WorkflowDiscoveryResult, type WorkflowStatus, type WorkflowToolExecutor, WorkflowType, type WorkflowWebSocketOptions, createGitLab, discoverWorkflowModels, getAnthropicModelForModelId, getModelMapping, getOpenAIApiType, getOpenAIModelForModelId, getProviderForModelId, getValidModelsForProvider, getWorkflowModelRef, gitlab, gitlabOAuthTokenResponseSchema, isResponsesApiModel, isWorkflowModel, parseModelsYml };
package/dist/index.d.ts CHANGED
@@ -257,6 +257,8 @@ interface ModelCacheEntry {
257
257
  selectedModelRef: string | null;
258
258
  selectedModelName: string | null;
259
259
  updatedAt: string;
260
+ /** Timestamp of the last successful discovery write — drives the discovery TTL. */
261
+ discoveryUpdatedAt?: string;
260
262
  }
261
263
  declare class GitLabModelCache {
262
264
  private readonly filePath;
@@ -275,6 +277,7 @@ declare class GitLabModelCache {
275
277
  save(entry: ModelCacheEntry): void;
276
278
  /**
277
279
  * Returns true if the discovery data is missing or older than DISCOVERY_TTL_MS.
280
+ * Invalid or missing timestamps are treated as expired (fail closed).
278
281
  */
279
282
  isDiscoveryExpired(): boolean;
280
283
  /**
@@ -673,7 +676,7 @@ declare const AGENT_PRIVILEGES: {
673
676
  readonly RUN_MCP_TOOLS: 6;
674
677
  };
675
678
  /** Default agent privileges — matches gitlab-lsp defaults */
676
- declare const DEFAULT_AGENT_PRIVILEGES: (1 | 2 | 4 | 3 | 5 | 6)[];
679
+ declare const DEFAULT_AGENT_PRIVILEGES: (1 | 2 | 3 | 4 | 5 | 6)[];
677
680
  /** Workflow execution environment */
678
681
  declare const WORKFLOW_ENVIRONMENT: "ide";
679
682
 
@@ -714,6 +717,12 @@ declare class GitLabWorkflowLanguageModel implements LanguageModelV3 {
714
717
  private readonly modelCache;
715
718
  private detectedProjectPath;
716
719
  private readonly sessionWorkflows;
720
+ private static readonly MAX_SESSION_WORKFLOWS;
721
+ /**
722
+ * Store a session workflow entry, refreshing its LRU position and
723
+ * evicting the oldest entries beyond MAX_SESSION_WORKFLOWS.
724
+ */
725
+ private setSessionWorkflow;
717
726
  private currentWorkflowId;
718
727
  private currentWorkflowDefinition;
719
728
  private persistedAgentEmitted;
@@ -1096,6 +1105,16 @@ declare class GitLabOpenAILanguageModel implements LanguageModelV3 {
1096
1105
  * These should NOT trigger token refresh and should be reported to the user.
1097
1106
  */
1098
1107
  private isContextOverflowError;
1108
+ /**
1109
+ * Build a descriptive error message from an OpenAI APIError.
1110
+ *
1111
+ * The AI Gateway proxy often returns errors with empty bodies, which the
1112
+ * OpenAI SDK renders as "500 status code (no body)". This helper surfaces
1113
+ * everything that is actually available: the parsed error body, the
1114
+ * request ID for support, and — for 5xx responses with a large tool set —
1115
+ * a hint that the gateway may be rejecting the request due to tool count.
1116
+ */
1117
+ private formatOpenAIError;
1099
1118
  private convertTools;
1100
1119
  private convertToolChoice;
1101
1120
  private convertPrompt;
@@ -1273,13 +1292,16 @@ interface RefreshTokenParams extends TokenExchangeParams {
1273
1292
  }
1274
1293
  declare class GitLabOAuthManager {
1275
1294
  private fetch;
1295
+ private inFlightRefreshes;
1276
1296
  constructor(fetchImpl?: typeof fetch);
1277
1297
  /**
1278
- * Check if a token is expired
1298
+ * Check if a token is expired.
1299
+ * Invalid expiry values (NaN) are treated as expired (fail closed).
1279
1300
  */
1280
1301
  isTokenExpired(expiresAt: number): boolean;
1281
1302
  /**
1282
- * Check if a token needs refresh (within skew window)
1303
+ * Check if a token needs refresh (within skew window).
1304
+ * Invalid expiry values (NaN) are treated as needing refresh (fail closed).
1283
1305
  */
1284
1306
  needsRefresh(expiresAt: number): boolean;
1285
1307
  /**
@@ -1310,7 +1332,8 @@ declare class GitLabOAuthManager {
1310
1332
  */
1311
1333
  private exchangeToken;
1312
1334
  /**
1313
- * Create GitLabOAuthTokens from token response
1335
+ * Create GitLabOAuthTokens from token response.
1336
+ * Falls back to the previous refresh token when the server omits one.
1314
1337
  */
1315
1338
  private createTokensFromResponse;
1316
1339
  /**
@@ -1494,6 +1517,7 @@ declare class GitLabWorkflowClient {
1494
1517
  private heartbeatInterval;
1495
1518
  private eventCallback;
1496
1519
  private closed;
1520
+ private closedEmitted;
1497
1521
  private lastSendTime;
1498
1522
  /**
1499
1523
  * Connect to the DWS WebSocket and start listening for events.
@@ -1513,6 +1537,9 @@ declare class GitLabWorkflowClient {
1513
1537
  sendActionResponse(requestID: string, response: string, error?: string | null): void;
1514
1538
  /**
1515
1539
  * Stop the workflow gracefully.
1540
+ *
1541
+ * Sends a stopWorkflow event, then closes the socket and clears all
1542
+ * timers so no heartbeats keep firing if the server never closes.
1516
1543
  */
1517
1544
  stop(): void;
1518
1545
  /**
@@ -1531,6 +1558,20 @@ declare class GitLabWorkflowClient {
1531
1558
  private send;
1532
1559
  private sendHeartbeatIfNeeded;
1533
1560
  private emit;
1561
+ /**
1562
+ * Emit the 'closed' event exactly once.
1563
+ */
1564
+ private emitClosed;
1565
+ /**
1566
+ * Decode an incoming WebSocket frame to a UTF-8 string.
1567
+ * Handles string, Buffer, ArrayBuffer and Buffer[] payloads.
1568
+ */
1569
+ private decodeMessageData;
1570
+ /**
1571
+ * Detach and close any existing socket before creating a new one.
1572
+ * Prevents socket and interval leaks on repeated connect() calls.
1573
+ */
1574
+ private disposeSocket;
1534
1575
  /**
1535
1576
  * Start ws.ping() keepalive (45s interval).
1536
1577
  * Keeps TCP connection alive through proxies/load balancers.
@@ -1705,4 +1746,4 @@ interface WorkflowDiscoveryResult {
1705
1746
  }
1706
1747
  declare function discoverWorkflowModels(config: WorkflowDiscoveryConfig, options: WorkflowDiscoveryOptions): Promise<WorkflowDiscoveryResult>;
1707
1748
 
1708
- export { AGENT_PRIVILEGES, type ActionResponsePayload, type AdditionalContext, type AiChatAvailableModels, type AiModel, type ApprovalDecision, BUNDLED_CLIENT_ID, CLIENT_VERSION, type ClientEvent, DEFAULT_AGENT_PRIVILEGES, DEFAULT_AI_GATEWAY_URL, DEFAULT_CLIENT_CAPABILITIES, DEFAULT_WORKFLOW_DEFINITION, type DirectAccessToken, type DiscoveredModels, type DiscoveredWorkflowModel, GITLAB_COM_URL, type GenerateTokenResponse, type GitLabAgenticOptions, type GitLabAnthropicConfig, GitLabAnthropicLanguageModel, GitLabDirectAccessClient, type GitLabDirectAccessConfig, GitLabError, type GitLabErrorOptions, GitLabModelCache, GitLabModelConfigRegistry, GitLabModelDiscovery, GitLabOAuthManager, type GitLabOAuthTokenResponse, type GitLabOAuthTokens, type GitLabOpenAIConfig, GitLabOpenAILanguageModel, type GitLabProject, GitLabProjectCache, GitLabProjectDetector, type GitLabProjectDetectorConfig, type GitLabProvider, type GitLabProviderSettings, GitLabWorkflowClient, type GitLabWorkflowClientConfig, GitLabWorkflowLanguageModel, type GitLabWorkflowLanguageModelConfig, type GitLabWorkflowOptions, GitLabWorkflowTokenClient, MODEL_ID_TO_ANTHROPIC_MODEL, MODEL_MAPPINGS, type McpToolDefinition, type ModelCacheEntry, type ModelConfig, type ModelConfigRegistryOptions, type ModelDiscoveryConfig, type ModelMapping, type ModelProvider, type NewCheckpoint, OAUTH_SCOPES, OPENCODE_GITLAB_AUTH_CLIENT_ID, type OpenAIApiType, type OpenCodeAuth, type OpenCodeAuthApi, type OpenCodeAuthOAuth, type RunMcpTool, type StartRequest, TOKEN_EXPIRY_SKEW_MS, VERSION, WORKFLOW_ENVIRONMENT, WS_HEARTBEAT_INTERVAL_MS, WS_KEEPALIVE_PING_INTERVAL_MS, type WorkflowAction, type WorkflowClientEvent, type WorkflowDiscoveryConfig, type WorkflowDiscoveryOptions, type WorkflowDiscoveryResult, type WorkflowStatus, type WorkflowToolExecutor, WorkflowType, type WorkflowWebSocketOptions, createGitLab, discoverWorkflowModels, getAnthropicModelForModelId, getModelMapping, getOpenAIApiType, getOpenAIModelForModelId, getProviderForModelId, getValidModelsForProvider, getWorkflowModelRef, gitlab, isResponsesApiModel, isWorkflowModel, parseModelsYml };
1749
+ export { AGENT_PRIVILEGES, type ActionResponsePayload, type AdditionalContext, type AiChatAvailableModels, type AiModel, type ApprovalDecision, BUNDLED_CLIENT_ID, CLIENT_VERSION, type ClientEvent, DEFAULT_AGENT_PRIVILEGES, DEFAULT_AI_GATEWAY_URL, DEFAULT_CLIENT_CAPABILITIES, DEFAULT_WORKFLOW_DEFINITION, type DirectAccessToken, type DiscoveredModels, type DiscoveredWorkflowModel, GITLAB_COM_URL, type GenerateTokenResponse, type GitLabAgenticOptions, type GitLabAnthropicConfig, GitLabAnthropicLanguageModel, GitLabDirectAccessClient, type GitLabDirectAccessConfig, GitLabError, type GitLabErrorOptions, GitLabModelCache, GitLabModelConfigRegistry, GitLabModelDiscovery, GitLabOAuthManager, type GitLabOAuthTokenResponse, type GitLabOAuthTokens, type GitLabOpenAIConfig, GitLabOpenAILanguageModel, type GitLabProject, GitLabProjectCache, GitLabProjectDetector, type GitLabProjectDetectorConfig, type GitLabProvider, type GitLabProviderSettings, GitLabWorkflowClient, type GitLabWorkflowClientConfig, GitLabWorkflowLanguageModel, type GitLabWorkflowLanguageModelConfig, type GitLabWorkflowOptions, GitLabWorkflowTokenClient, MODEL_ID_TO_ANTHROPIC_MODEL, MODEL_MAPPINGS, type McpToolDefinition, type ModelCacheEntry, type ModelConfig, type ModelConfigRegistryOptions, type ModelDiscoveryConfig, type ModelMapping, type ModelProvider, type NewCheckpoint, OAUTH_SCOPES, OPENCODE_GITLAB_AUTH_CLIENT_ID, type OpenAIApiType, type OpenCodeAuth, type OpenCodeAuthApi, type OpenCodeAuthOAuth, type RunMcpTool, type StartRequest, TOKEN_EXPIRY_SKEW_MS, VERSION, WORKFLOW_ENVIRONMENT, WS_HEARTBEAT_INTERVAL_MS, WS_KEEPALIVE_PING_INTERVAL_MS, type WorkflowAction, type WorkflowClientEvent, type WorkflowDiscoveryConfig, type WorkflowDiscoveryOptions, type WorkflowDiscoveryResult, type WorkflowStatus, type WorkflowToolExecutor, WorkflowType, type WorkflowWebSocketOptions, createGitLab, discoverWorkflowModels, getAnthropicModelForModelId, getModelMapping, getOpenAIApiType, getOpenAIModelForModelId, getProviderForModelId, getValidModelsForProvider, getWorkflowModelRef, gitlab, gitlabOAuthTokenResponseSchema, isResponsesApiModel, isWorkflowModel, parseModelsYml };