fork of hey-api/openapi-ts because I need some additional things
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: python sdk params

Lubos 717443c5 66642e66

+1955 -192
+1
.vscode/settings.json
··· 4 4 }, 5 5 "editor.defaultFormatter": "oxc.oxc-vscode", 6 6 "editor.quickSuggestions": { 7 + "other": "on", 7 8 "strings": "on" 8 9 }, 9 10 "eslint.format.enable": true,
+37 -37
packages/openapi-python-tests/pydantic/v2/__snapshots__/3.1.x/opencode/pydantic_gen.py
··· 2 2 3 3 from enum import Enum 4 4 from pydantic import BaseModel, Field 5 - from typing import Any, List, Literal, Optional, TypeAlias, Union 5 + from typing import Any, Literal, Optional, TypeAlias, Union 6 6 7 7 8 8 class EventInstallationUpdatedProperties(BaseModel): ··· 87 87 class UserMessageSummary(BaseModel): 88 88 title: Optional[str] = Field(default=None) 89 89 body: Optional[str] = Field(default=None) 90 - diffs: List[FileDiff] 90 + diffs: list[FileDiff] 91 91 92 92 93 93 class UserMessageModel(BaseModel): ··· 330 330 title: str 331 331 metadata: dict[str, Any] 332 332 time: ToolStateCompletedTime 333 - attachments: Optional[List[FilePart]] = Field(default=None) 333 + attachments: Optional[list[FilePart]] = Field(default=None) 334 334 335 335 336 336 class ToolStateErrorTime(BaseModel): ··· 405 405 message_id: str = Field(..., alias="messageID") 406 406 type_: Literal["patch"] = Field(..., alias="type") 407 407 hash_: str = Field(..., alias="hash") 408 - files: List[str] 408 + files: list[str] 409 409 410 410 411 411 class AgentPartSource(BaseModel): ··· 489 489 id_: str = Field(..., alias="id", pattern="^per.*") 490 490 session_id: str = Field(..., alias="sessionID", pattern="^ses.*") 491 491 permission: str 492 - patterns: List[str] 492 + patterns: list[str] 493 493 metadata: dict[str, Any] 494 - always: List[str] 494 + always: list[str] 495 495 tool: Optional[PermissionRequestTool] = Field(default=None) 496 496 497 497 ··· 581 581 582 582 class EventTodoUpdatedProperties(BaseModel): 583 583 session_id: str = Field(..., alias="sessionID") 584 - todos: List[Todo] 584 + todos: list[Todo] 585 585 586 586 587 587 class EventTodoUpdated(BaseModel): ··· 676 676 action: PermissionAction 677 677 678 678 679 - PermissionRuleset: TypeAlias = List[PermissionRule] 679 + PermissionRuleset: TypeAlias = list[PermissionRule] 680 680 681 681 682 682 class SessionSummary(BaseModel): 683 683 additions: float 684 684 deletions: float 685 685 files: float 686 - diffs: Optional[List[FileDiff]] = Field(default=None) 686 + diffs: Optional[list[FileDiff]] = Field(default=None) 687 687 688 688 689 689 class SessionShare(BaseModel): ··· 747 747 748 748 class EventSessionDiffProperties(BaseModel): 749 749 session_id: str = Field(..., alias="sessionID") 750 - diff: List[FileDiff] 750 + diff: list[FileDiff] 751 751 752 752 753 753 class EventSessionDiff(BaseModel): ··· 793 793 id_: str = Field(..., alias="id", pattern="^pty.*") 794 794 title: str 795 795 command: str 796 - args: List[str] 796 + args: list[str] 797 797 cwd: str 798 798 status: PtyStatus 799 799 pid: float ··· 856 856 857 857 class BadRequestError(BaseModel): 858 858 data: Any 859 - errors: List[dict[str, Any]] 859 + errors: list[dict[str, Any]] 860 860 success: Literal[False] 861 861 862 862 ··· 970 970 port: Optional[int] = Field(default=None, description="Port to listen on", gt=0, le=9007199254740991) 971 971 hostname: Optional[str] = Field(default=None, description="Hostname to listen on") 972 972 mdns: Optional[bool] = Field(default=None) 973 - cors: Optional[List[str]] = Field(default=None, description="Additional domains to allow for CORS") 973 + cors: Optional[list[str]] = Field(default=None, description="Additional domains to allow for CORS") 974 974 975 975 976 976 class PermissionActionConfig(Enum, str): ··· 1055 1055 1056 1056 1057 1057 class ProviderConfigModelsValueModalities(BaseModel): 1058 - input_: List[ProviderConfigModelsValueModalitiesInput] = Field(..., alias="input") 1059 - output: List[ProviderConfigModelsValueModalitiesOutput] 1058 + input_: list[ProviderConfigModelsValueModalitiesInput] = Field(..., alias="input") 1059 + output: list[ProviderConfigModelsValueModalitiesOutput] 1060 1060 1061 1061 1062 1062 class ProviderConfigModelsValueStatus(Enum, str): ··· 1099 1099 class ProviderConfig(BaseModel): 1100 1100 api: Optional[str] = Field(default=None) 1101 1101 name: Optional[str] = Field(default=None) 1102 - env: Optional[List[str]] = Field(default=None) 1102 + env: Optional[list[str]] = Field(default=None) 1103 1103 id_: Optional[str] = Field(default=None, alias="id") 1104 1104 npm: Optional[str] = Field(default=None) 1105 1105 models: Optional[dict[str, Any]] = Field(default=None) 1106 - whitelist: Optional[List[str]] = Field(default=None) 1107 - blacklist: Optional[List[str]] = Field(default=None) 1106 + whitelist: Optional[list[str]] = Field(default=None) 1107 + blacklist: Optional[list[str]] = Field(default=None) 1108 1108 options: Optional[ProviderConfigOptions] = Field(default=None) 1109 1109 1110 1110 1111 1111 class McpLocalConfig(BaseModel): 1112 1112 type_: Literal["local"] = Field(..., alias="type") 1113 - command: List[str] = Field(..., description="Command and arguments to run the MCP server") 1113 + command: list[str] = Field(..., description="Command and arguments to run the MCP server") 1114 1114 environment: Optional[dict[str, Any]] = Field(default=None) 1115 1115 enabled: Optional[bool] = Field(default=None) 1116 1116 timeout: Optional[int] = Field(default=None, description="Timeout in ms for fetching tools from the MCP server. Defaults to 5000 (5 seconds) if not specified.", gt=0, le=9007199254740991) ··· 1160 1160 1161 1161 1162 1162 class ConfigWatcher(BaseModel): 1163 - ignore: Optional[List[str]] = Field(default=None) 1163 + ignore: Optional[list[str]] = Field(default=None) 1164 1164 1165 1165 1166 1166 class ConfigShare(Enum, str): ··· 1186 1186 1187 1187 class ConfigFormatterValue(BaseModel): 1188 1188 disabled: Optional[bool] = Field(default=None) 1189 - command: Optional[List[str]] = Field(default=None) 1189 + command: Optional[list[str]] = Field(default=None) 1190 1190 environment: Optional[dict[str, Any]] = Field(default=None) 1191 - extensions: Optional[List[str]] = Field(default=None) 1191 + extensions: Optional[list[str]] = Field(default=None) 1192 1192 1193 1193 1194 1194 class ConfigEnterprise(BaseModel): ··· 1201 1201 1202 1202 1203 1203 class ConfigExperimentalHookFileEditedValue(BaseModel): 1204 - command: List[str] 1204 + command: list[str] 1205 1205 environment: Optional[dict[str, Any]] = Field(default=None) 1206 1206 1207 1207 1208 1208 class ConfigExperimentalHookSessionCompleted(BaseModel): 1209 - command: List[str] 1209 + command: list[str] 1210 1210 environment: Optional[dict[str, Any]] = Field(default=None) 1211 1211 1212 1212 1213 1213 class ConfigExperimentalHook(BaseModel): 1214 1214 file_edited: Optional[dict[str, Any]] = Field(default=None) 1215 - session_completed: Optional[List[ConfigExperimentalHookSessionCompleted]] = Field(default=None) 1215 + session_completed: Optional[list[ConfigExperimentalHookSessionCompleted]] = Field(default=None) 1216 1216 1217 1217 1218 1218 class ConfigExperimental(BaseModel): ··· 1221 1221 disable_paste_summary: Optional[bool] = Field(default=None) 1222 1222 batch_tool: Optional[bool] = Field(default=None) 1223 1223 open_telemetry: Optional[bool] = Field(default=None, alias="openTelemetry") 1224 - primary_tools: Optional[List[str]] = Field(default=None, description="Tools that should only be available to primary agents.") 1224 + primary_tools: Optional[list[str]] = Field(default=None, description="Tools that should only be available to primary agents.") 1225 1225 continue_loop_on_deny: Optional[bool] = Field(default=None) 1226 1226 mcp_timeout: Optional[int] = Field(default=None, description="Timeout in milliseconds for model context protocol (MCP) requests", gt=0, le=9007199254740991) 1227 1227 ··· 1235 1235 server: Optional[ServerConfig] = Field(default=None) 1236 1236 command: Optional[dict[str, Any]] = Field(default=None) 1237 1237 watcher: Optional[ConfigWatcher] = Field(default=None) 1238 - plugin: Optional[List[str]] = Field(default=None) 1238 + plugin: Optional[list[str]] = Field(default=None) 1239 1239 snapshot: Optional[bool] = Field(default=None) 1240 1240 share: Optional[ConfigShare] = Field(default=None) 1241 1241 autoshare: Optional[bool] = Field(default=None) 1242 1242 autoupdate: Optional[Union[bool, Literal["notify"]]] = Field(default=None, description="Automatically update to the latest version. Set to true to auto-update, false to disable, or 'notify' to show update notifications") 1243 - disabled_providers: Optional[List[str]] = Field(default=None, description="Disable providers that are loaded automatically") 1244 - enabled_providers: Optional[List[str]] = Field(default=None, description="When set, ONLY these providers will be enabled. All other providers will be ignored") 1243 + disabled_providers: Optional[list[str]] = Field(default=None, description="Disable providers that are loaded automatically") 1244 + enabled_providers: Optional[list[str]] = Field(default=None, description="When set, ONLY these providers will be enabled. All other providers will be ignored") 1245 1245 model: Optional[str] = Field(default=None, description="Model to use in the format of provider/model, eg anthropic/claude-2") 1246 1246 small_model: Optional[str] = Field(default=None, description="Small model to use for tasks like title generation in the format of provider/model") 1247 1247 default_agent: Optional[str] = Field(default=None, description="Default agent to use when none is specified. Must be a primary agent. Falls back to 'build' if not set or if the specified agent is invalid.") ··· 1252 1252 mcp: Optional[dict[str, Any]] = Field(default=None) 1253 1253 formatter: Optional[Union[Literal[False], dict[str, Any]]] = Field(default=None) 1254 1254 lsp: Optional[Union[Literal[False], dict[str, Any]]] = Field(default=None) 1255 - instructions: Optional[List[str]] = Field(default=None, description="Additional instruction files or patterns to include") 1255 + instructions: Optional[list[str]] = Field(default=None, description="Additional instruction files or patterns to include") 1256 1256 layout: Optional[LayoutConfig] = Field(default=None) 1257 1257 permission: Optional[PermissionConfig_2] = Field(default=None) 1258 1258 tools: Optional[dict[str, Any]] = Field(default=None) ··· 1261 1261 experimental: Optional[ConfigExperimental] = Field(default=None) 1262 1262 1263 1263 1264 - ToolIds: TypeAlias = List[str] 1264 + ToolIds: TypeAlias = list[str] 1265 1265 1266 1266 1267 1267 class ToolListItem(BaseModel): ··· 1270 1270 parameters: Any 1271 1271 1272 1272 1273 - ToolList: TypeAlias = List[ToolListItem] 1273 + ToolList: TypeAlias = list[ToolListItem] 1274 1274 1275 1275 1276 1276 class Path(BaseModel): ··· 1339 1339 mcp: Optional[bool] = Field(default=None) 1340 1340 template: str 1341 1341 subtask: Optional[bool] = Field(default=None) 1342 - hints: List[str] 1342 + hints: list[str] 1343 1343 1344 1344 1345 1345 class ModelApi(BaseModel): ··· 1445 1445 id_: str = Field(..., alias="id") 1446 1446 name: str 1447 1447 source: ProviderSource 1448 - env: List[str] 1448 + env: list[str] 1449 1449 key: Optional[str] = Field(default=None) 1450 1450 options: dict[str, Any] 1451 1451 models: dict[str, Any] ··· 1491 1491 old_lines: float = Field(..., alias="oldLines") 1492 1492 new_start: float = Field(..., alias="newStart") 1493 1493 new_lines: float = Field(..., alias="newLines") 1494 - lines: List[str] 1494 + lines: list[str] 1495 1495 1496 1496 1497 1497 class FileContentPatch(BaseModel): ··· 1499 1499 new_file_name: str = Field(..., alias="newFileName") 1500 1500 old_header: Optional[str] = Field(default=None, alias="oldHeader") 1501 1501 new_header: Optional[str] = Field(default=None, alias="newHeader") 1502 - hunks: List[FileContentPatchHunks] 1502 + hunks: list[FileContentPatchHunks] 1503 1503 index: Optional[str] = Field(default=None) 1504 1504 1505 1505 ··· 1586 1586 1587 1587 class FormatterStatus(BaseModel): 1588 1588 name: str 1589 - extensions: List[str] 1589 + extensions: list[str] 1590 1590 enabled: bool 1591 1591 1592 1592
+2 -2
packages/openapi-python-tests/sdks/__snapshots__/opencode/default/client/__init__.py
··· 1 1 # This file is auto-generated by @hey-api/openapi-python 2 2 3 - from .client_gen import Client, create_client 3 + from .client_gen import Client, build_client_params, create_client 4 4 5 - __all__ = ["Client", "create_client"] 5 + __all__ = ["Client", "build_client_params", "create_client"]
+67 -1
packages/openapi-python-tests/sdks/__snapshots__/opencode/default/client/client_gen.py
··· 1 1 # This file is auto-generated by @hey-api/openapi-python 2 2 3 - from typing import Optional 3 + from typing import Any, Optional 4 4 import httpx 5 + 6 + 7 + EXTRA_PREFIXES_MAP = { 8 + "$body_": "json", 9 + "$headers_": "headers", 10 + "$path_": "path", 11 + "$query_": "params", 12 + } 13 + 14 + 15 + def build_client_params(fields: list[dict[str, Any]], **kwargs) -> dict[str, Any]: 16 + """Build client parameters from flat keyword arguments. 17 + 18 + Args: 19 + fields: List of field configurations with 'in', 'key', and optional 'map'. 20 + **kwargs: Flat parameters passed to the SDK method. 21 + 22 + Returns: 23 + Dict suitable for httpx client methods: {params: {...}, headers: {...}, json: Any} 24 + """ 25 + result: dict[str, Any] = {} 26 + 27 + key_map = {} 28 + for field in fields: 29 + key = field.get("key") 30 + if key: 31 + key_map[key] = { 32 + "in": field.get("in"), 33 + "map": field.get("map", key), 34 + } 35 + 36 + for key, value in kwargs.items(): 37 + if value is None: 38 + continue 39 + 40 + field = key_map.get(key) 41 + 42 + if field: 43 + in_slot = field["in"] 44 + map_key = field["map"] 45 + slot = "json" if in_slot == "body" else in_slot 46 + 47 + if in_slot == "body": 48 + result[slot] = value 49 + else: 50 + if slot not in result: 51 + result[slot] = {} 52 + result[slot][map_key] = value 53 + else: 54 + for prefix, slot in EXTRA_PREFIXES_MAP.items(): 55 + if key.startswith(prefix): 56 + actual_key = key[len(prefix) :] 57 + if slot not in result: 58 + result[slot] = {} 59 + result[slot][actual_key] = value 60 + break 61 + else: 62 + if "params" not in result: 63 + result["params"] = {} 64 + result["params"][key] = value 65 + 66 + for slot in list(result.keys()): 67 + if not result[slot]: 68 + del result[slot] 69 + 70 + return result 5 71 6 72 7 73 class BaseClient:
+1612
packages/openapi-python-tests/sdks/__snapshots__/opencode/default/pydantic_gen.py
··· 1 + # This file is auto-generated by @hey-api/openapi-python 2 + 3 + from enum import Enum 4 + from pydantic import BaseModel, Field 5 + from typing import Any, Literal, Optional, TypeAlias, Union 6 + 7 + 8 + class EventInstallationUpdatedProperties(BaseModel): 9 + version: str 10 + 11 + 12 + class EventInstallationUpdated(BaseModel): 13 + type_: Literal["installation.updated"] = Field(..., alias="type") 14 + properties: EventInstallationUpdatedProperties 15 + 16 + 17 + class EventInstallationUpdateAvailableProperties(BaseModel): 18 + version: str 19 + 20 + 21 + class EventInstallationUpdateAvailable(BaseModel): 22 + type_: Literal["installation.update-available"] = Field(..., alias="type") 23 + properties: EventInstallationUpdateAvailableProperties 24 + 25 + 26 + class ProjectIcon(BaseModel): 27 + url: Optional[str] = Field(default=None) 28 + color: Optional[str] = Field(default=None) 29 + 30 + 31 + class ProjectTime(BaseModel): 32 + created: float 33 + updated: float 34 + initialized: Optional[float] = Field(default=None) 35 + 36 + 37 + class Project(BaseModel): 38 + id_: str = Field(..., alias="id") 39 + worktree: str 40 + vcs: Optional[Literal["git"]] = Field(default=None) 41 + name: Optional[str] = Field(default=None) 42 + icon: Optional[ProjectIcon] = Field(default=None) 43 + time: ProjectTime 44 + 45 + 46 + class EventProjectUpdated(BaseModel): 47 + type_: Literal["project.updated"] = Field(..., alias="type") 48 + properties: Project 49 + 50 + 51 + class EventServerInstanceDisposedProperties(BaseModel): 52 + directory: str 53 + 54 + 55 + class EventServerInstanceDisposed(BaseModel): 56 + type_: Literal["server.instance.disposed"] = Field(..., alias="type") 57 + properties: EventServerInstanceDisposedProperties 58 + 59 + 60 + class EventLspClientDiagnosticsProperties(BaseModel): 61 + server_id: str = Field(..., alias="serverID") 62 + path: str 63 + 64 + 65 + class EventLspClientDiagnostics(BaseModel): 66 + type_: Literal["lsp.client.diagnostics"] = Field(..., alias="type") 67 + properties: EventLspClientDiagnosticsProperties 68 + 69 + 70 + class EventLspUpdated(BaseModel): 71 + type_: Literal["lsp.updated"] = Field(..., alias="type") 72 + properties: dict[str, Any] 73 + 74 + 75 + class FileDiff(BaseModel): 76 + file: str 77 + before: str 78 + after: str 79 + additions: float 80 + deletions: float 81 + 82 + 83 + class UserMessageTime(BaseModel): 84 + created: float 85 + 86 + 87 + class UserMessageSummary(BaseModel): 88 + title: Optional[str] = Field(default=None) 89 + body: Optional[str] = Field(default=None) 90 + diffs: list[FileDiff] 91 + 92 + 93 + class UserMessageModel(BaseModel): 94 + provider_id: str = Field(..., alias="providerID") 95 + model_id: str = Field(..., alias="modelID") 96 + 97 + 98 + class UserMessage(BaseModel): 99 + id_: str = Field(..., alias="id") 100 + session_id: str = Field(..., alias="sessionID") 101 + role: Literal["user"] 102 + time: UserMessageTime 103 + summary: Optional[UserMessageSummary] = Field(default=None) 104 + agent: str 105 + model: UserMessageModel 106 + system: Optional[str] = Field(default=None) 107 + tools: Optional[dict[str, Any]] = Field(default=None) 108 + variant: Optional[str] = Field(default=None) 109 + 110 + 111 + class ProviderAuthErrorData(BaseModel): 112 + provider_id: str = Field(..., alias="providerID") 113 + message: str 114 + 115 + 116 + class ProviderAuthError(BaseModel): 117 + name: Literal["ProviderAuthError"] 118 + data: ProviderAuthErrorData 119 + 120 + 121 + class UnknownErrorData(BaseModel): 122 + message: str 123 + 124 + 125 + class UnknownError(BaseModel): 126 + name: Literal["UnknownError"] 127 + data: UnknownErrorData 128 + 129 + 130 + class MessageOutputLengthError(BaseModel): 131 + name: Literal["MessageOutputLengthError"] 132 + data: dict[str, Any] 133 + 134 + 135 + class MessageAbortedErrorData(BaseModel): 136 + message: str 137 + 138 + 139 + class MessageAbortedError(BaseModel): 140 + name: Literal["MessageAbortedError"] 141 + data: MessageAbortedErrorData 142 + 143 + 144 + class ApiErrorData(BaseModel): 145 + message: str 146 + status_code: Optional[float] = Field(default=None, alias="statusCode") 147 + is_retryable: bool = Field(..., alias="isRetryable") 148 + response_headers: Optional[dict[str, Any]] = Field(default=None, alias="responseHeaders") 149 + response_body: Optional[str] = Field(default=None, alias="responseBody") 150 + metadata: Optional[dict[str, Any]] = Field(default=None) 151 + 152 + 153 + class ApiError(BaseModel): 154 + name: Literal["APIError"] 155 + data: ApiErrorData 156 + 157 + 158 + class AssistantMessageTime(BaseModel): 159 + created: float 160 + completed: Optional[float] = Field(default=None) 161 + 162 + 163 + class AssistantMessagePath(BaseModel): 164 + cwd: str 165 + root: str 166 + 167 + 168 + class AssistantMessageTokensCache(BaseModel): 169 + read: float 170 + write: float 171 + 172 + 173 + class AssistantMessageTokens(BaseModel): 174 + input_: float = Field(..., alias="input") 175 + output: float 176 + reasoning: float 177 + cache: AssistantMessageTokensCache 178 + 179 + 180 + class AssistantMessage(BaseModel): 181 + id_: str = Field(..., alias="id") 182 + session_id: str = Field(..., alias="sessionID") 183 + role: Literal["assistant"] 184 + time: AssistantMessageTime 185 + error: Optional[Union[ProviderAuthError, UnknownError, MessageOutputLengthError, MessageAbortedError, ApiError]] = Field(default=None) 186 + parent_id: str = Field(..., alias="parentID") 187 + model_id: str = Field(..., alias="modelID") 188 + provider_id: str = Field(..., alias="providerID") 189 + mode: str 190 + agent: str 191 + path: AssistantMessagePath 192 + summary: Optional[bool] = Field(default=None) 193 + cost: float 194 + tokens: AssistantMessageTokens 195 + finish: Optional[str] = Field(default=None) 196 + 197 + 198 + Message: TypeAlias = Union[UserMessage, AssistantMessage] 199 + 200 + 201 + class EventMessageUpdatedProperties(BaseModel): 202 + info: Message 203 + 204 + 205 + class EventMessageUpdated(BaseModel): 206 + type_: Literal["message.updated"] = Field(..., alias="type") 207 + properties: EventMessageUpdatedProperties 208 + 209 + 210 + class EventMessageRemovedProperties(BaseModel): 211 + session_id: str = Field(..., alias="sessionID") 212 + message_id: str = Field(..., alias="messageID") 213 + 214 + 215 + class EventMessageRemoved(BaseModel): 216 + type_: Literal["message.removed"] = Field(..., alias="type") 217 + properties: EventMessageRemovedProperties 218 + 219 + 220 + class TextPartTime(BaseModel): 221 + start: float 222 + end: Optional[float] = Field(default=None) 223 + 224 + 225 + class TextPart(BaseModel): 226 + id_: str = Field(..., alias="id") 227 + session_id: str = Field(..., alias="sessionID") 228 + message_id: str = Field(..., alias="messageID") 229 + type_: Literal["text"] = Field(..., alias="type") 230 + text: str 231 + synthetic: Optional[bool] = Field(default=None) 232 + ignored: Optional[bool] = Field(default=None) 233 + time: Optional[TextPartTime] = Field(default=None) 234 + metadata: Optional[dict[str, Any]] = Field(default=None) 235 + 236 + 237 + class ReasoningPartTime(BaseModel): 238 + start: float 239 + end: Optional[float] = Field(default=None) 240 + 241 + 242 + class ReasoningPart(BaseModel): 243 + id_: str = Field(..., alias="id") 244 + session_id: str = Field(..., alias="sessionID") 245 + message_id: str = Field(..., alias="messageID") 246 + type_: Literal["reasoning"] = Field(..., alias="type") 247 + text: str 248 + metadata: Optional[dict[str, Any]] = Field(default=None) 249 + time: ReasoningPartTime 250 + 251 + 252 + class FilePartSourceText(BaseModel): 253 + value: str 254 + start: int = Field(..., ge=-9007199254740991, le=9007199254740991) 255 + end: int = Field(..., ge=-9007199254740991, le=9007199254740991) 256 + 257 + 258 + class FileSource(BaseModel): 259 + text: FilePartSourceText 260 + type_: Literal["file"] = Field(..., alias="type") 261 + path: str 262 + 263 + 264 + class RangeStart(BaseModel): 265 + line: float 266 + character: float 267 + 268 + 269 + class RangeEnd(BaseModel): 270 + line: float 271 + character: float 272 + 273 + 274 + class Range(BaseModel): 275 + start: RangeStart 276 + end: RangeEnd 277 + 278 + 279 + class SymbolSource(BaseModel): 280 + text: FilePartSourceText 281 + type_: Literal["symbol"] = Field(..., alias="type") 282 + path: str 283 + range_: Range = Field(..., alias="range") 284 + name: str 285 + kind: int = Field(..., ge=-9007199254740991, le=9007199254740991) 286 + 287 + 288 + FilePartSource: TypeAlias = Union[FileSource, SymbolSource] 289 + 290 + 291 + class FilePart(BaseModel): 292 + id_: str = Field(..., alias="id") 293 + session_id: str = Field(..., alias="sessionID") 294 + message_id: str = Field(..., alias="messageID") 295 + type_: Literal["file"] = Field(..., alias="type") 296 + mime: str 297 + filename: Optional[str] = Field(default=None) 298 + url: str 299 + source: Optional[FilePartSource] = Field(default=None) 300 + 301 + 302 + class ToolStatePending(BaseModel): 303 + status: Literal["pending"] 304 + input_: dict[str, Any] = Field(..., alias="input") 305 + raw: str 306 + 307 + 308 + class ToolStateRunningTime(BaseModel): 309 + start: float 310 + 311 + 312 + class ToolStateRunning(BaseModel): 313 + status: Literal["running"] 314 + input_: dict[str, Any] = Field(..., alias="input") 315 + title: Optional[str] = Field(default=None) 316 + metadata: Optional[dict[str, Any]] = Field(default=None) 317 + time: ToolStateRunningTime 318 + 319 + 320 + class ToolStateCompletedTime(BaseModel): 321 + start: float 322 + end: float 323 + compacted: Optional[float] = Field(default=None) 324 + 325 + 326 + class ToolStateCompleted(BaseModel): 327 + status: Literal["completed"] 328 + input_: dict[str, Any] = Field(..., alias="input") 329 + output: str 330 + title: str 331 + metadata: dict[str, Any] 332 + time: ToolStateCompletedTime 333 + attachments: Optional[list[FilePart]] = Field(default=None) 334 + 335 + 336 + class ToolStateErrorTime(BaseModel): 337 + start: float 338 + end: float 339 + 340 + 341 + class ToolStateError(BaseModel): 342 + status: Literal["error"] 343 + input_: dict[str, Any] = Field(..., alias="input") 344 + error: str 345 + metadata: Optional[dict[str, Any]] = Field(default=None) 346 + time: ToolStateErrorTime 347 + 348 + 349 + ToolState: TypeAlias = Union[ToolStatePending, ToolStateRunning, ToolStateCompleted, ToolStateError] 350 + 351 + 352 + class ToolPart(BaseModel): 353 + id_: str = Field(..., alias="id") 354 + session_id: str = Field(..., alias="sessionID") 355 + message_id: str = Field(..., alias="messageID") 356 + type_: Literal["tool"] = Field(..., alias="type") 357 + call_id: str = Field(..., alias="callID") 358 + tool: str 359 + state: ToolState 360 + metadata: Optional[dict[str, Any]] = Field(default=None) 361 + 362 + 363 + class StepStartPart(BaseModel): 364 + id_: str = Field(..., alias="id") 365 + session_id: str = Field(..., alias="sessionID") 366 + message_id: str = Field(..., alias="messageID") 367 + type_: Literal["step-start"] = Field(..., alias="type") 368 + snapshot: Optional[str] = Field(default=None) 369 + 370 + 371 + class StepFinishPartTokensCache(BaseModel): 372 + read: float 373 + write: float 374 + 375 + 376 + class StepFinishPartTokens(BaseModel): 377 + input_: float = Field(..., alias="input") 378 + output: float 379 + reasoning: float 380 + cache: StepFinishPartTokensCache 381 + 382 + 383 + class StepFinishPart(BaseModel): 384 + id_: str = Field(..., alias="id") 385 + session_id: str = Field(..., alias="sessionID") 386 + message_id: str = Field(..., alias="messageID") 387 + type_: Literal["step-finish"] = Field(..., alias="type") 388 + reason: str 389 + snapshot: Optional[str] = Field(default=None) 390 + cost: float 391 + tokens: StepFinishPartTokens 392 + 393 + 394 + class SnapshotPart(BaseModel): 395 + id_: str = Field(..., alias="id") 396 + session_id: str = Field(..., alias="sessionID") 397 + message_id: str = Field(..., alias="messageID") 398 + type_: Literal["snapshot"] = Field(..., alias="type") 399 + snapshot: str 400 + 401 + 402 + class PatchPart(BaseModel): 403 + id_: str = Field(..., alias="id") 404 + session_id: str = Field(..., alias="sessionID") 405 + message_id: str = Field(..., alias="messageID") 406 + type_: Literal["patch"] = Field(..., alias="type") 407 + hash_: str = Field(..., alias="hash") 408 + files: list[str] 409 + 410 + 411 + class AgentPartSource(BaseModel): 412 + value: str 413 + start: int = Field(..., ge=-9007199254740991, le=9007199254740991) 414 + end: int = Field(..., ge=-9007199254740991, le=9007199254740991) 415 + 416 + 417 + class AgentPart(BaseModel): 418 + id_: str = Field(..., alias="id") 419 + session_id: str = Field(..., alias="sessionID") 420 + message_id: str = Field(..., alias="messageID") 421 + type_: Literal["agent"] = Field(..., alias="type") 422 + name: str 423 + source: Optional[AgentPartSource] = Field(default=None) 424 + 425 + 426 + class RetryPartTime(BaseModel): 427 + created: float 428 + 429 + 430 + class RetryPart(BaseModel): 431 + id_: str = Field(..., alias="id") 432 + session_id: str = Field(..., alias="sessionID") 433 + message_id: str = Field(..., alias="messageID") 434 + type_: Literal["retry"] = Field(..., alias="type") 435 + attempt: float 436 + error: ApiError 437 + time: RetryPartTime 438 + 439 + 440 + class CompactionPart(BaseModel): 441 + id_: str = Field(..., alias="id") 442 + session_id: str = Field(..., alias="sessionID") 443 + message_id: str = Field(..., alias="messageID") 444 + type_: Literal["compaction"] = Field(..., alias="type") 445 + auto: bool 446 + 447 + 448 + class Part(BaseModel): 449 + id_: str = Field(..., alias="id") 450 + session_id: str = Field(..., alias="sessionID") 451 + message_id: str = Field(..., alias="messageID") 452 + type_: Literal["subtask"] = Field(..., alias="type") 453 + prompt: str 454 + description: str 455 + agent: str 456 + command: Optional[str] = Field(default=None) 457 + 458 + 459 + Part_2: TypeAlias = Union[TextPart, Part, ReasoningPart, FilePart, ToolPart, StepStartPart, StepFinishPart, SnapshotPart, PatchPart, AgentPart, RetryPart, CompactionPart] 460 + 461 + 462 + class EventMessagePartUpdatedProperties(BaseModel): 463 + part: Part_2 464 + delta: Optional[str] = Field(default=None) 465 + 466 + 467 + class EventMessagePartUpdated(BaseModel): 468 + type_: Literal["message.part.updated"] = Field(..., alias="type") 469 + properties: EventMessagePartUpdatedProperties 470 + 471 + 472 + class EventMessagePartRemovedProperties(BaseModel): 473 + session_id: str = Field(..., alias="sessionID") 474 + message_id: str = Field(..., alias="messageID") 475 + part_id: str = Field(..., alias="partID") 476 + 477 + 478 + class EventMessagePartRemoved(BaseModel): 479 + type_: Literal["message.part.removed"] = Field(..., alias="type") 480 + properties: EventMessagePartRemovedProperties 481 + 482 + 483 + class PermissionRequestTool(BaseModel): 484 + message_id: str = Field(..., alias="messageID") 485 + call_id: str = Field(..., alias="callID") 486 + 487 + 488 + class PermissionRequest(BaseModel): 489 + id_: str = Field(..., alias="id", pattern="^per.*") 490 + session_id: str = Field(..., alias="sessionID", pattern="^ses.*") 491 + permission: str 492 + patterns: list[str] 493 + metadata: dict[str, Any] 494 + always: list[str] 495 + tool: Optional[PermissionRequestTool] = Field(default=None) 496 + 497 + 498 + class EventPermissionAsked(BaseModel): 499 + type_: Literal["permission.asked"] = Field(..., alias="type") 500 + properties: PermissionRequest 501 + 502 + 503 + class EventPermissionRepliedPropertiesReply(Enum, str): 504 + ONCE = "once" 505 + ALWAYS = "always" 506 + REJECT = "reject" 507 + 508 + 509 + class EventPermissionRepliedProperties(BaseModel): 510 + session_id: str = Field(..., alias="sessionID") 511 + request_id: str = Field(..., alias="requestID") 512 + reply: EventPermissionRepliedPropertiesReply 513 + 514 + 515 + class EventPermissionReplied(BaseModel): 516 + type_: Literal["permission.replied"] = Field(..., alias="type") 517 + properties: EventPermissionRepliedProperties 518 + 519 + 520 + class SessionStatus(BaseModel): 521 + type_: Literal["idle"] = Field(..., alias="type") 522 + 523 + 524 + class SessionStatus_2(BaseModel): 525 + type_: Literal["retry"] = Field(..., alias="type") 526 + attempt: float 527 + message: str 528 + next_: float = Field(..., alias="next") 529 + 530 + 531 + class SessionStatus_3(BaseModel): 532 + type_: Literal["busy"] = Field(..., alias="type") 533 + 534 + 535 + SessionStatus_4: TypeAlias = Union[SessionStatus, SessionStatus_2, SessionStatus_3] 536 + 537 + 538 + class EventSessionStatusProperties(BaseModel): 539 + session_id: str = Field(..., alias="sessionID") 540 + status: SessionStatus_4 541 + 542 + 543 + class EventSessionStatus(BaseModel): 544 + type_: Literal["session.status"] = Field(..., alias="type") 545 + properties: EventSessionStatusProperties 546 + 547 + 548 + class EventSessionIdleProperties(BaseModel): 549 + session_id: str = Field(..., alias="sessionID") 550 + 551 + 552 + class EventSessionIdle(BaseModel): 553 + type_: Literal["session.idle"] = Field(..., alias="type") 554 + properties: EventSessionIdleProperties 555 + 556 + 557 + class EventSessionCompactedProperties(BaseModel): 558 + session_id: str = Field(..., alias="sessionID") 559 + 560 + 561 + class EventSessionCompacted(BaseModel): 562 + type_: Literal["session.compacted"] = Field(..., alias="type") 563 + properties: EventSessionCompactedProperties 564 + 565 + 566 + class EventFileEditedProperties(BaseModel): 567 + file: str 568 + 569 + 570 + class EventFileEdited(BaseModel): 571 + type_: Literal["file.edited"] = Field(..., alias="type") 572 + properties: EventFileEditedProperties 573 + 574 + 575 + class Todo(BaseModel): 576 + content: str = Field(..., description="Brief description of the task") 577 + status: str = Field(..., description="Current status of the task: pending, in_progress, completed, cancelled") 578 + priority: str = Field(..., description="Priority level of the task: high, medium, low") 579 + id_: str = Field(..., alias="id", description="Unique identifier for the todo item") 580 + 581 + 582 + class EventTodoUpdatedProperties(BaseModel): 583 + session_id: str = Field(..., alias="sessionID") 584 + todos: list[Todo] 585 + 586 + 587 + class EventTodoUpdated(BaseModel): 588 + type_: Literal["todo.updated"] = Field(..., alias="type") 589 + properties: EventTodoUpdatedProperties 590 + 591 + 592 + class EventTuiPromptAppendProperties(BaseModel): 593 + text: str 594 + 595 + 596 + class EventTuiPromptAppend(BaseModel): 597 + type_: Literal["tui.prompt.append"] = Field(..., alias="type") 598 + properties: EventTuiPromptAppendProperties 599 + 600 + 601 + class EventTuiCommandExecutePropertiesCommand(Enum, str): 602 + SESSION_LIST = "session.list" 603 + SESSION_NEW = "session.new" 604 + SESSION_SHARE = "session.share" 605 + SESSION_INTERRUPT = "session.interrupt" 606 + SESSION_COMPACT = "session.compact" 607 + SESSION_PAGE_UP = "session.page.up" 608 + SESSION_PAGE_DOWN = "session.page.down" 609 + SESSION_HALF_PAGE_UP = "session.half.page.up" 610 + SESSION_HALF_PAGE_DOWN = "session.half.page.down" 611 + SESSION_FIRST = "session.first" 612 + SESSION_LAST = "session.last" 613 + PROMPT_CLEAR = "prompt.clear" 614 + PROMPT_SUBMIT = "prompt.submit" 615 + AGENT_CYCLE = "agent.cycle" 616 + 617 + 618 + class EventTuiCommandExecuteProperties(BaseModel): 619 + command: Union[EventTuiCommandExecutePropertiesCommand, str] 620 + 621 + 622 + class EventTuiCommandExecute(BaseModel): 623 + type_: Literal["tui.command.execute"] = Field(..., alias="type") 624 + properties: EventTuiCommandExecuteProperties 625 + 626 + 627 + class EventTuiToastShowPropertiesVariant(Enum, str): 628 + INFO = "info" 629 + SUCCESS = "success" 630 + WARNING = "warning" 631 + ERROR = "error" 632 + 633 + 634 + class EventTuiToastShowProperties(BaseModel): 635 + title: Optional[str] = Field(default=None) 636 + message: str 637 + variant: EventTuiToastShowPropertiesVariant 638 + duration: Optional[float] = Field(default=5000, description="Duration in milliseconds") 639 + 640 + 641 + class EventTuiToastShow(BaseModel): 642 + type_: Literal["tui.toast.show"] = Field(..., alias="type") 643 + properties: EventTuiToastShowProperties 644 + 645 + 646 + class EventMcpToolsChangedProperties(BaseModel): 647 + server: str 648 + 649 + 650 + class EventMcpToolsChanged(BaseModel): 651 + type_: Literal["mcp.tools.changed"] = Field(..., alias="type") 652 + properties: EventMcpToolsChangedProperties 653 + 654 + 655 + class EventCommandExecutedProperties(BaseModel): 656 + name: str 657 + session_id: str = Field(..., alias="sessionID", pattern="^ses.*") 658 + arguments: str 659 + message_id: str = Field(..., alias="messageID", pattern="^msg.*") 660 + 661 + 662 + class EventCommandExecuted(BaseModel): 663 + type_: Literal["command.executed"] = Field(..., alias="type") 664 + properties: EventCommandExecutedProperties 665 + 666 + 667 + class PermissionAction(Enum, str): 668 + ALLOW = "allow" 669 + DENY = "deny" 670 + ASK = "ask" 671 + 672 + 673 + class PermissionRule(BaseModel): 674 + permission: str 675 + pattern: str 676 + action: PermissionAction 677 + 678 + 679 + PermissionRuleset: TypeAlias = list[PermissionRule] 680 + 681 + 682 + class SessionSummary(BaseModel): 683 + additions: float 684 + deletions: float 685 + files: float 686 + diffs: Optional[list[FileDiff]] = Field(default=None) 687 + 688 + 689 + class SessionShare(BaseModel): 690 + url: str 691 + 692 + 693 + class SessionTime(BaseModel): 694 + created: float 695 + updated: float 696 + compacting: Optional[float] = Field(default=None) 697 + archived: Optional[float] = Field(default=None) 698 + 699 + 700 + class SessionRevert(BaseModel): 701 + message_id: str = Field(..., alias="messageID") 702 + part_id: Optional[str] = Field(default=None, alias="partID") 703 + snapshot: Optional[str] = Field(default=None) 704 + diff: Optional[str] = Field(default=None) 705 + 706 + 707 + class Session(BaseModel): 708 + id_: str = Field(..., alias="id", pattern="^ses.*") 709 + project_id: str = Field(..., alias="projectID") 710 + directory: str 711 + parent_id: Optional[str] = Field(default=None, alias="parentID", pattern="^ses.*") 712 + summary: Optional[SessionSummary] = Field(default=None) 713 + share: Optional[SessionShare] = Field(default=None) 714 + title: str 715 + version: str 716 + time: SessionTime 717 + permission: Optional[PermissionRuleset] = Field(default=None) 718 + revert: Optional[SessionRevert] = Field(default=None) 719 + 720 + 721 + class EventSessionCreatedProperties(BaseModel): 722 + info: Session 723 + 724 + 725 + class EventSessionCreated(BaseModel): 726 + type_: Literal["session.created"] = Field(..., alias="type") 727 + properties: EventSessionCreatedProperties 728 + 729 + 730 + class EventSessionUpdatedProperties(BaseModel): 731 + info: Session 732 + 733 + 734 + class EventSessionUpdated(BaseModel): 735 + type_: Literal["session.updated"] = Field(..., alias="type") 736 + properties: EventSessionUpdatedProperties 737 + 738 + 739 + class EventSessionDeletedProperties(BaseModel): 740 + info: Session 741 + 742 + 743 + class EventSessionDeleted(BaseModel): 744 + type_: Literal["session.deleted"] = Field(..., alias="type") 745 + properties: EventSessionDeletedProperties 746 + 747 + 748 + class EventSessionDiffProperties(BaseModel): 749 + session_id: str = Field(..., alias="sessionID") 750 + diff: list[FileDiff] 751 + 752 + 753 + class EventSessionDiff(BaseModel): 754 + type_: Literal["session.diff"] = Field(..., alias="type") 755 + properties: EventSessionDiffProperties 756 + 757 + 758 + class EventSessionErrorProperties(BaseModel): 759 + session_id: Optional[str] = Field(default=None, alias="sessionID") 760 + error: Optional[Union[ProviderAuthError, UnknownError, MessageOutputLengthError, MessageAbortedError, ApiError]] = Field(default=None) 761 + 762 + 763 + class EventSessionError(BaseModel): 764 + type_: Literal["session.error"] = Field(..., alias="type") 765 + properties: EventSessionErrorProperties 766 + 767 + 768 + class EventFileWatcherUpdatedProperties(BaseModel): 769 + file: str 770 + event: Union[Literal["add"], Literal["change"], Literal["unlink"]] 771 + 772 + 773 + class EventFileWatcherUpdated(BaseModel): 774 + type_: Literal["file.watcher.updated"] = Field(..., alias="type") 775 + properties: EventFileWatcherUpdatedProperties 776 + 777 + 778 + class EventVcsBranchUpdatedProperties(BaseModel): 779 + branch: Optional[str] = Field(default=None) 780 + 781 + 782 + class EventVcsBranchUpdated(BaseModel): 783 + type_: Literal["vcs.branch.updated"] = Field(..., alias="type") 784 + properties: EventVcsBranchUpdatedProperties 785 + 786 + 787 + class PtyStatus(Enum, str): 788 + RUNNING = "running" 789 + EXITED = "exited" 790 + 791 + 792 + class Pty(BaseModel): 793 + id_: str = Field(..., alias="id", pattern="^pty.*") 794 + title: str 795 + command: str 796 + args: list[str] 797 + cwd: str 798 + status: PtyStatus 799 + pid: float 800 + 801 + 802 + class EventPtyCreatedProperties(BaseModel): 803 + info: Pty 804 + 805 + 806 + class EventPtyCreated(BaseModel): 807 + type_: Literal["pty.created"] = Field(..., alias="type") 808 + properties: EventPtyCreatedProperties 809 + 810 + 811 + class EventPtyUpdatedProperties(BaseModel): 812 + info: Pty 813 + 814 + 815 + class EventPtyUpdated(BaseModel): 816 + type_: Literal["pty.updated"] = Field(..., alias="type") 817 + properties: EventPtyUpdatedProperties 818 + 819 + 820 + class EventPtyExitedProperties(BaseModel): 821 + id_: str = Field(..., alias="id", pattern="^pty.*") 822 + exit_code: float = Field(..., alias="exitCode") 823 + 824 + 825 + class EventPtyExited(BaseModel): 826 + type_: Literal["pty.exited"] = Field(..., alias="type") 827 + properties: EventPtyExitedProperties 828 + 829 + 830 + class EventPtyDeletedProperties(BaseModel): 831 + id_: str = Field(..., alias="id", pattern="^pty.*") 832 + 833 + 834 + class EventPtyDeleted(BaseModel): 835 + type_: Literal["pty.deleted"] = Field(..., alias="type") 836 + properties: EventPtyDeletedProperties 837 + 838 + 839 + class EventServerConnected(BaseModel): 840 + type_: Literal["server.connected"] = Field(..., alias="type") 841 + properties: dict[str, Any] 842 + 843 + 844 + class EventGlobalDisposed(BaseModel): 845 + type_: Literal["global.disposed"] = Field(..., alias="type") 846 + properties: dict[str, Any] 847 + 848 + 849 + Event: TypeAlias = Union[EventInstallationUpdated, EventInstallationUpdateAvailable, EventProjectUpdated, EventServerInstanceDisposed, EventLspClientDiagnostics, EventLspUpdated, EventMessageUpdated, EventMessageRemoved, EventMessagePartUpdated, EventMessagePartRemoved, EventPermissionAsked, EventPermissionReplied, EventSessionStatus, EventSessionIdle, EventSessionCompacted, EventFileEdited, EventTodoUpdated, EventTuiPromptAppend, EventTuiCommandExecute, EventTuiToastShow, EventMcpToolsChanged, EventCommandExecuted, EventSessionCreated, EventSessionUpdated, EventSessionDeleted, EventSessionDiff, EventSessionError, EventFileWatcherUpdated, EventVcsBranchUpdated, EventPtyCreated, EventPtyUpdated, EventPtyExited, EventPtyDeleted, EventServerConnected, EventGlobalDisposed] 850 + 851 + 852 + class GlobalEvent(BaseModel): 853 + directory: str 854 + payload: Event 855 + 856 + 857 + class BadRequestError(BaseModel): 858 + data: Any 859 + errors: list[dict[str, Any]] 860 + success: Literal[False] 861 + 862 + 863 + class NotFoundErrorData(BaseModel): 864 + message: str 865 + 866 + 867 + class NotFoundError(BaseModel): 868 + name: Literal["NotFoundError"] 869 + data: NotFoundErrorData 870 + 871 + 872 + class KeybindsConfig(BaseModel): 873 + leader: Optional[str] = Field(default="ctrl+x", description="Leader key for keybind combinations") 874 + app_exit: Optional[str] = Field(default="ctrl+c,ctrl+d,<leader>q", description="Exit the application") 875 + editor_open: Optional[str] = Field(default="<leader>e", description="Open external editor") 876 + theme_list: Optional[str] = Field(default="<leader>t", description="List available themes") 877 + sidebar_toggle: Optional[str] = Field(default="<leader>b", description="Toggle sidebar") 878 + scrollbar_toggle: Optional[str] = Field(default="none", description="Toggle session scrollbar") 879 + username_toggle: Optional[str] = Field(default="none", description="Toggle username visibility") 880 + status_view: Optional[str] = Field(default="<leader>s", description="View status") 881 + session_export: Optional[str] = Field(default="<leader>x", description="Export session to editor") 882 + session_new: Optional[str] = Field(default="<leader>n", description="Create a new session") 883 + session_list: Optional[str] = Field(default="<leader>l", description="List all sessions") 884 + session_timeline: Optional[str] = Field(default="<leader>g", description="Show session timeline") 885 + session_fork: Optional[str] = Field(default="none", description="Fork session from message") 886 + session_rename: Optional[str] = Field(default="none", description="Rename session") 887 + session_share: Optional[str] = Field(default="none", description="Share current session") 888 + session_unshare: Optional[str] = Field(default="none", description="Unshare current session") 889 + session_interrupt: Optional[str] = Field(default="escape", description="Interrupt current session") 890 + session_compact: Optional[str] = Field(default="<leader>c", description="Compact the session") 891 + messages_page_up: Optional[str] = Field(default="pageup", description="Scroll messages up by one page") 892 + messages_page_down: Optional[str] = Field(default="pagedown", description="Scroll messages down by one page") 893 + messages_half_page_up: Optional[str] = Field(default="ctrl+alt+u", description="Scroll messages up by half page") 894 + messages_half_page_down: Optional[str] = Field(default="ctrl+alt+d", description="Scroll messages down by half page") 895 + messages_first: Optional[str] = Field(default="ctrl+g,home", description="Navigate to first message") 896 + messages_last: Optional[str] = Field(default="ctrl+alt+g,end", description="Navigate to last message") 897 + messages_next: Optional[str] = Field(default="none", description="Navigate to next message") 898 + messages_previous: Optional[str] = Field(default="none", description="Navigate to previous message") 899 + messages_last_user: Optional[str] = Field(default="none", description="Navigate to last user message") 900 + messages_copy: Optional[str] = Field(default="<leader>y", description="Copy message") 901 + messages_undo: Optional[str] = Field(default="<leader>u", description="Undo message") 902 + messages_redo: Optional[str] = Field(default="<leader>r", description="Redo message") 903 + messages_toggle_conceal: Optional[str] = Field(default="<leader>h", description="Toggle code block concealment in messages") 904 + tool_details: Optional[str] = Field(default="none", description="Toggle tool details visibility") 905 + model_list: Optional[str] = Field(default="<leader>m", description="List available models") 906 + model_cycle_recent: Optional[str] = Field(default="f2", description="Next recently used model") 907 + model_cycle_recent_reverse: Optional[str] = Field(default="shift+f2", description="Previous recently used model") 908 + model_cycle_favorite: Optional[str] = Field(default="none", description="Next favorite model") 909 + model_cycle_favorite_reverse: Optional[str] = Field(default="none", description="Previous favorite model") 910 + command_list: Optional[str] = Field(default="ctrl+p", description="List available commands") 911 + agent_list: Optional[str] = Field(default="<leader>a", description="List agents") 912 + agent_cycle: Optional[str] = Field(default="tab", description="Next agent") 913 + agent_cycle_reverse: Optional[str] = Field(default="shift+tab", description="Previous agent") 914 + variant_cycle: Optional[str] = Field(default="ctrl+t", description="Cycle model variants") 915 + input_clear: Optional[str] = Field(default="ctrl+c", description="Clear input field") 916 + input_paste: Optional[str] = Field(default="ctrl+v", description="Paste from clipboard") 917 + input_submit: Optional[str] = Field(default="return", description="Submit input") 918 + input_newline: Optional[str] = Field(default="shift+return,ctrl+return,alt+return,ctrl+j", description="Insert newline in input") 919 + input_move_left: Optional[str] = Field(default="left,ctrl+b", description="Move cursor left in input") 920 + input_move_right: Optional[str] = Field(default="right,ctrl+f", description="Move cursor right in input") 921 + input_move_up: Optional[str] = Field(default="up", description="Move cursor up in input") 922 + input_move_down: Optional[str] = Field(default="down", description="Move cursor down in input") 923 + input_select_left: Optional[str] = Field(default="shift+left", description="Select left in input") 924 + input_select_right: Optional[str] = Field(default="shift+right", description="Select right in input") 925 + input_select_up: Optional[str] = Field(default="shift+up", description="Select up in input") 926 + input_select_down: Optional[str] = Field(default="shift+down", description="Select down in input") 927 + input_line_home: Optional[str] = Field(default="ctrl+a", description="Move to start of line in input") 928 + input_line_end: Optional[str] = Field(default="ctrl+e", description="Move to end of line in input") 929 + input_select_line_home: Optional[str] = Field(default="ctrl+shift+a", description="Select to start of line in input") 930 + input_select_line_end: Optional[str] = Field(default="ctrl+shift+e", description="Select to end of line in input") 931 + input_visual_line_home: Optional[str] = Field(default="alt+a", description="Move to start of visual line in input") 932 + input_visual_line_end: Optional[str] = Field(default="alt+e", description="Move to end of visual line in input") 933 + input_select_visual_line_home: Optional[str] = Field(default="alt+shift+a", description="Select to start of visual line in input") 934 + input_select_visual_line_end: Optional[str] = Field(default="alt+shift+e", description="Select to end of visual line in input") 935 + input_buffer_home: Optional[str] = Field(default="home", description="Move to start of buffer in input") 936 + input_buffer_end: Optional[str] = Field(default="end", description="Move to end of buffer in input") 937 + input_select_buffer_home: Optional[str] = Field(default="shift+home", description="Select to start of buffer in input") 938 + input_select_buffer_end: Optional[str] = Field(default="shift+end", description="Select to end of buffer in input") 939 + input_delete_line: Optional[str] = Field(default="ctrl+shift+d", description="Delete line in input") 940 + input_delete_to_line_end: Optional[str] = Field(default="ctrl+k", description="Delete to end of line in input") 941 + input_delete_to_line_start: Optional[str] = Field(default="ctrl+u", description="Delete to start of line in input") 942 + input_backspace: Optional[str] = Field(default="backspace,shift+backspace", description="Backspace in input") 943 + input_delete: Optional[str] = Field(default="ctrl+d,delete,shift+delete", description="Delete character in input") 944 + input_undo: Optional[str] = Field(default="ctrl+-,super+z", description="Undo in input") 945 + input_redo: Optional[str] = Field(default="ctrl+.,super+shift+z", description="Redo in input") 946 + input_word_forward: Optional[str] = Field(default="alt+f,alt+right,ctrl+right", description="Move word forward in input") 947 + input_word_backward: Optional[str] = Field(default="alt+b,alt+left,ctrl+left", description="Move word backward in input") 948 + input_select_word_forward: Optional[str] = Field(default="alt+shift+f,alt+shift+right", description="Select word forward in input") 949 + input_select_word_backward: Optional[str] = Field(default="alt+shift+b,alt+shift+left", description="Select word backward in input") 950 + input_delete_word_forward: Optional[str] = Field(default="alt+d,alt+delete,ctrl+delete", description="Delete word forward in input") 951 + input_delete_word_backward: Optional[str] = Field(default="ctrl+w,ctrl+backspace,alt+backspace", description="Delete word backward in input") 952 + history_previous: Optional[str] = Field(default="up", description="Previous history item") 953 + history_next: Optional[str] = Field(default="down", description="Next history item") 954 + session_child_cycle: Optional[str] = Field(default="<leader>right", description="Next child session") 955 + session_child_cycle_reverse: Optional[str] = Field(default="<leader>left", description="Previous child session") 956 + session_parent: Optional[str] = Field(default="<leader>up", description="Go to parent session") 957 + terminal_suspend: Optional[str] = Field(default="ctrl+z", description="Suspend terminal") 958 + terminal_title_toggle: Optional[str] = Field(default="none", description="Toggle terminal title") 959 + tips_toggle: Optional[str] = Field(default="<leader>h", description="Toggle tips on home screen") 960 + 961 + 962 + class LogLevel(Enum, str): 963 + DEBUG = "DEBUG" 964 + INFO = "INFO" 965 + WARN = "WARN" 966 + ERROR = "ERROR" 967 + 968 + 969 + class ServerConfig(BaseModel): 970 + port: Optional[int] = Field(default=None, description="Port to listen on", gt=0, le=9007199254740991) 971 + hostname: Optional[str] = Field(default=None, description="Hostname to listen on") 972 + mdns: Optional[bool] = Field(default=None) 973 + cors: Optional[list[str]] = Field(default=None, description="Additional domains to allow for CORS") 974 + 975 + 976 + class PermissionActionConfig(Enum, str): 977 + ASK = "ask" 978 + ALLOW = "allow" 979 + DENY = "deny" 980 + 981 + 982 + PermissionObjectConfig: TypeAlias = dict[str, Any] 983 + 984 + 985 + PermissionRuleConfig: TypeAlias = Union[PermissionActionConfig, PermissionObjectConfig] 986 + 987 + 988 + class PermissionConfig(BaseModel): 989 + read: Optional[PermissionRuleConfig] = Field(default=None) 990 + edit: Optional[PermissionRuleConfig] = Field(default=None) 991 + glob: Optional[PermissionRuleConfig] = Field(default=None) 992 + grep: Optional[PermissionRuleConfig] = Field(default=None) 993 + list_: Optional[PermissionRuleConfig] = Field(default=None, alias="list") 994 + bash: Optional[PermissionRuleConfig] = Field(default=None) 995 + task: Optional[PermissionRuleConfig] = Field(default=None) 996 + external_directory: Optional[PermissionRuleConfig] = Field(default=None) 997 + todowrite: Optional[PermissionActionConfig] = Field(default=None) 998 + todoread: Optional[PermissionActionConfig] = Field(default=None) 999 + webfetch: Optional[PermissionActionConfig] = Field(default=None) 1000 + websearch: Optional[PermissionActionConfig] = Field(default=None) 1001 + codesearch: Optional[PermissionActionConfig] = Field(default=None) 1002 + lsp: Optional[PermissionRuleConfig] = Field(default=None) 1003 + doom_loop: Optional[PermissionActionConfig] = Field(default=None) 1004 + 1005 + 1006 + PermissionConfig_2: TypeAlias = Union[PermissionConfig, PermissionActionConfig] 1007 + 1008 + 1009 + AgentConfig: TypeAlias = dict[str, Any] 1010 + 1011 + 1012 + class ProviderConfigModelsValueInterleavedField(Enum, str): 1013 + REASONING_CONTENT = "reasoning_content" 1014 + REASONING_DETAILS = "reasoning_details" 1015 + 1016 + 1017 + class ProviderConfigModelsValueInterleaved(BaseModel): 1018 + field: ProviderConfigModelsValueInterleavedField 1019 + 1020 + 1021 + class ProviderConfigModelsValueCostContextOver200k(BaseModel): 1022 + input_: float = Field(..., alias="input") 1023 + output: float 1024 + cache_read: Optional[float] = Field(default=None) 1025 + cache_write: Optional[float] = Field(default=None) 1026 + 1027 + 1028 + class ProviderConfigModelsValueCost(BaseModel): 1029 + input_: float = Field(..., alias="input") 1030 + output: float 1031 + cache_read: Optional[float] = Field(default=None) 1032 + cache_write: Optional[float] = Field(default=None) 1033 + context_over_200k: Optional[ProviderConfigModelsValueCostContextOver200k] = Field(default=None) 1034 + 1035 + 1036 + class ProviderConfigModelsValueLimit(BaseModel): 1037 + context: float 1038 + output: float 1039 + 1040 + 1041 + class ProviderConfigModelsValueModalitiesInput(Enum, str): 1042 + TEXT = "text" 1043 + AUDIO = "audio" 1044 + IMAGE = "image" 1045 + VIDEO = "video" 1046 + PDF = "pdf" 1047 + 1048 + 1049 + class ProviderConfigModelsValueModalitiesOutput(Enum, str): 1050 + TEXT = "text" 1051 + AUDIO = "audio" 1052 + IMAGE = "image" 1053 + VIDEO = "video" 1054 + PDF = "pdf" 1055 + 1056 + 1057 + class ProviderConfigModelsValueModalities(BaseModel): 1058 + input_: list[ProviderConfigModelsValueModalitiesInput] = Field(..., alias="input") 1059 + output: list[ProviderConfigModelsValueModalitiesOutput] 1060 + 1061 + 1062 + class ProviderConfigModelsValueStatus(Enum, str): 1063 + ALPHA = "alpha" 1064 + BETA = "beta" 1065 + DEPRECATED = "deprecated" 1066 + 1067 + 1068 + class ProviderConfigModelsValueProvider(BaseModel): 1069 + npm: str 1070 + 1071 + 1072 + ProviderConfigModelsValueVariantsValue: TypeAlias = dict[str, Any] 1073 + 1074 + 1075 + class ProviderConfigModelsValue(BaseModel): 1076 + id_: Optional[str] = Field(default=None, alias="id") 1077 + name: Optional[str] = Field(default=None) 1078 + family: Optional[str] = Field(default=None) 1079 + release_date: Optional[str] = Field(default=None) 1080 + attachment: Optional[bool] = Field(default=None) 1081 + reasoning: Optional[bool] = Field(default=None) 1082 + temperature: Optional[bool] = Field(default=None) 1083 + tool_call: Optional[bool] = Field(default=None) 1084 + interleaved: Optional[Union[Literal[True], ProviderConfigModelsValueInterleaved]] = Field(default=None) 1085 + cost: Optional[ProviderConfigModelsValueCost] = Field(default=None) 1086 + limit: Optional[ProviderConfigModelsValueLimit] = Field(default=None) 1087 + modalities: Optional[ProviderConfigModelsValueModalities] = Field(default=None) 1088 + experimental: Optional[bool] = Field(default=None) 1089 + status: Optional[ProviderConfigModelsValueStatus] = Field(default=None) 1090 + options: Optional[dict[str, Any]] = Field(default=None) 1091 + headers: Optional[dict[str, Any]] = Field(default=None) 1092 + provider: Optional[ProviderConfigModelsValueProvider] = Field(default=None) 1093 + variants: Optional[dict[str, Any]] = Field(default=None) 1094 + 1095 + 1096 + ProviderConfigOptions: TypeAlias = dict[str, Any] 1097 + 1098 + 1099 + class ProviderConfig(BaseModel): 1100 + api: Optional[str] = Field(default=None) 1101 + name: Optional[str] = Field(default=None) 1102 + env: Optional[list[str]] = Field(default=None) 1103 + id_: Optional[str] = Field(default=None, alias="id") 1104 + npm: Optional[str] = Field(default=None) 1105 + models: Optional[dict[str, Any]] = Field(default=None) 1106 + whitelist: Optional[list[str]] = Field(default=None) 1107 + blacklist: Optional[list[str]] = Field(default=None) 1108 + options: Optional[ProviderConfigOptions] = Field(default=None) 1109 + 1110 + 1111 + class McpLocalConfig(BaseModel): 1112 + type_: Literal["local"] = Field(..., alias="type") 1113 + command: list[str] = Field(..., description="Command and arguments to run the MCP server") 1114 + environment: Optional[dict[str, Any]] = Field(default=None) 1115 + enabled: Optional[bool] = Field(default=None) 1116 + timeout: Optional[int] = Field(default=None, description="Timeout in ms for fetching tools from the MCP server. Defaults to 5000 (5 seconds) if not specified.", gt=0, le=9007199254740991) 1117 + 1118 + 1119 + class McpOAuthConfig(BaseModel): 1120 + client_id: Optional[str] = Field(default=None, alias="clientId", description="OAuth client ID. If not provided, dynamic client registration (RFC 7591) will be attempted.") 1121 + client_secret: Optional[str] = Field(default=None, alias="clientSecret", description="OAuth client secret (if required by the authorization server)") 1122 + scope: Optional[str] = Field(default=None, description="OAuth scopes to request during authorization") 1123 + 1124 + 1125 + class McpRemoteConfig(BaseModel): 1126 + type_: Literal["remote"] = Field(..., alias="type") 1127 + url: str = Field(..., description="URL of the remote MCP server") 1128 + enabled: Optional[bool] = Field(default=None) 1129 + headers: Optional[dict[str, Any]] = Field(default=None) 1130 + oauth: Optional[Union[McpOAuthConfig, Literal[False]]] = Field(default=None, description="OAuth authentication configuration for the MCP server. Set to false to disable OAuth auto-detection.") 1131 + timeout: Optional[int] = Field(default=None, description="Timeout in ms for fetching tools from the MCP server. Defaults to 5000 (5 seconds) if not specified.", gt=0, le=9007199254740991) 1132 + 1133 + 1134 + class LayoutConfig(Enum, str): 1135 + AUTO = "auto" 1136 + STRETCH = "stretch" 1137 + 1138 + 1139 + class ConfigTuiScrollAcceleration(BaseModel): 1140 + enabled: bool 1141 + 1142 + 1143 + class ConfigTuiDiffStyle(Enum, str): 1144 + AUTO = "auto" 1145 + STACKED = "stacked" 1146 + 1147 + 1148 + class ConfigTui(BaseModel): 1149 + scroll_speed: Optional[float] = Field(default=None, description="TUI scroll speed", ge=0.001) 1150 + scroll_acceleration: Optional[ConfigTuiScrollAcceleration] = Field(default=None) 1151 + diff_style: Optional[ConfigTuiDiffStyle] = Field(default=None) 1152 + 1153 + 1154 + class ConfigCommandValue(BaseModel): 1155 + template: str 1156 + description: Optional[str] = Field(default=None) 1157 + agent: Optional[str] = Field(default=None) 1158 + model: Optional[str] = Field(default=None) 1159 + subtask: Optional[bool] = Field(default=None) 1160 + 1161 + 1162 + class ConfigWatcher(BaseModel): 1163 + ignore: Optional[list[str]] = Field(default=None) 1164 + 1165 + 1166 + class ConfigShare(Enum, str): 1167 + MANUAL = "manual" 1168 + AUTO = "auto" 1169 + DISABLED = "disabled" 1170 + 1171 + 1172 + class ConfigMode(BaseModel): 1173 + build: Optional[AgentConfig] = Field(default=None) 1174 + plan: Optional[AgentConfig] = Field(default=None) 1175 + 1176 + 1177 + class ConfigAgent(BaseModel): 1178 + plan: Optional[AgentConfig] = Field(default=None) 1179 + build: Optional[AgentConfig] = Field(default=None) 1180 + general: Optional[AgentConfig] = Field(default=None) 1181 + explore: Optional[AgentConfig] = Field(default=None) 1182 + title: Optional[AgentConfig] = Field(default=None) 1183 + summary: Optional[AgentConfig] = Field(default=None) 1184 + compaction: Optional[AgentConfig] = Field(default=None) 1185 + 1186 + 1187 + class ConfigFormatterValue(BaseModel): 1188 + disabled: Optional[bool] = Field(default=None) 1189 + command: Optional[list[str]] = Field(default=None) 1190 + environment: Optional[dict[str, Any]] = Field(default=None) 1191 + extensions: Optional[list[str]] = Field(default=None) 1192 + 1193 + 1194 + class ConfigEnterprise(BaseModel): 1195 + url: Optional[str] = Field(default=None, description="Enterprise URL") 1196 + 1197 + 1198 + class ConfigCompaction(BaseModel): 1199 + auto: Optional[bool] = Field(default=None) 1200 + prune: Optional[bool] = Field(default=None) 1201 + 1202 + 1203 + class ConfigExperimentalHookFileEditedValue(BaseModel): 1204 + command: list[str] 1205 + environment: Optional[dict[str, Any]] = Field(default=None) 1206 + 1207 + 1208 + class ConfigExperimentalHookSessionCompleted(BaseModel): 1209 + command: list[str] 1210 + environment: Optional[dict[str, Any]] = Field(default=None) 1211 + 1212 + 1213 + class ConfigExperimentalHook(BaseModel): 1214 + file_edited: Optional[dict[str, Any]] = Field(default=None) 1215 + session_completed: Optional[list[ConfigExperimentalHookSessionCompleted]] = Field(default=None) 1216 + 1217 + 1218 + class ConfigExperimental(BaseModel): 1219 + hook: Optional[ConfigExperimentalHook] = Field(default=None) 1220 + chat_max_retries: Optional[float] = Field(default=None, alias="chatMaxRetries", description="Number of retries for chat completions on failure") 1221 + disable_paste_summary: Optional[bool] = Field(default=None) 1222 + batch_tool: Optional[bool] = Field(default=None) 1223 + open_telemetry: Optional[bool] = Field(default=None, alias="openTelemetry") 1224 + primary_tools: Optional[list[str]] = Field(default=None, description="Tools that should only be available to primary agents.") 1225 + continue_loop_on_deny: Optional[bool] = Field(default=None) 1226 + mcp_timeout: Optional[int] = Field(default=None, description="Timeout in milliseconds for model context protocol (MCP) requests", gt=0, le=9007199254740991) 1227 + 1228 + 1229 + class Config(BaseModel): 1230 + schema: Optional[str] = Field(default=None, alias="$schema", description="JSON schema reference for configuration validation") 1231 + theme: Optional[str] = Field(default=None, description="Theme name to use for the interface") 1232 + keybinds: Optional[KeybindsConfig] = Field(default=None) 1233 + log_level: Optional[LogLevel] = Field(default=None, alias="logLevel") 1234 + tui: Optional[ConfigTui] = Field(default=None) 1235 + server: Optional[ServerConfig] = Field(default=None) 1236 + command: Optional[dict[str, Any]] = Field(default=None) 1237 + watcher: Optional[ConfigWatcher] = Field(default=None) 1238 + plugin: Optional[list[str]] = Field(default=None) 1239 + snapshot: Optional[bool] = Field(default=None) 1240 + share: Optional[ConfigShare] = Field(default=None) 1241 + autoshare: Optional[bool] = Field(default=None) 1242 + autoupdate: Optional[Union[bool, Literal["notify"]]] = Field(default=None, description="Automatically update to the latest version. Set to true to auto-update, false to disable, or 'notify' to show update notifications") 1243 + disabled_providers: Optional[list[str]] = Field(default=None, description="Disable providers that are loaded automatically") 1244 + enabled_providers: Optional[list[str]] = Field(default=None, description="When set, ONLY these providers will be enabled. All other providers will be ignored") 1245 + model: Optional[str] = Field(default=None, description="Model to use in the format of provider/model, eg anthropic/claude-2") 1246 + small_model: Optional[str] = Field(default=None, description="Small model to use for tasks like title generation in the format of provider/model") 1247 + default_agent: Optional[str] = Field(default=None, description="Default agent to use when none is specified. Must be a primary agent. Falls back to 'build' if not set or if the specified agent is invalid.") 1248 + username: Optional[str] = Field(default=None, description="Custom username to display in conversations instead of system username") 1249 + mode: Optional[ConfigMode] = Field(default=None) 1250 + agent: Optional[ConfigAgent] = Field(default=None) 1251 + provider: Optional[dict[str, Any]] = Field(default=None) 1252 + mcp: Optional[dict[str, Any]] = Field(default=None) 1253 + formatter: Optional[Union[Literal[False], dict[str, Any]]] = Field(default=None) 1254 + lsp: Optional[Union[Literal[False], dict[str, Any]]] = Field(default=None) 1255 + instructions: Optional[list[str]] = Field(default=None, description="Additional instruction files or patterns to include") 1256 + layout: Optional[LayoutConfig] = Field(default=None) 1257 + permission: Optional[PermissionConfig_2] = Field(default=None) 1258 + tools: Optional[dict[str, Any]] = Field(default=None) 1259 + enterprise: Optional[ConfigEnterprise] = Field(default=None) 1260 + compaction: Optional[ConfigCompaction] = Field(default=None) 1261 + experimental: Optional[ConfigExperimental] = Field(default=None) 1262 + 1263 + 1264 + ToolIds: TypeAlias = list[str] 1265 + 1266 + 1267 + class ToolListItem(BaseModel): 1268 + id_: str = Field(..., alias="id") 1269 + description: str 1270 + parameters: Any 1271 + 1272 + 1273 + ToolList: TypeAlias = list[ToolListItem] 1274 + 1275 + 1276 + class Path(BaseModel): 1277 + home: str 1278 + state: str 1279 + config: str 1280 + worktree: str 1281 + directory: str 1282 + 1283 + 1284 + class VcsInfo(BaseModel): 1285 + branch: str 1286 + 1287 + 1288 + class TextPartInputTime(BaseModel): 1289 + start: float 1290 + end: Optional[float] = Field(default=None) 1291 + 1292 + 1293 + class TextPartInput(BaseModel): 1294 + id_: Optional[str] = Field(default=None, alias="id") 1295 + type_: Literal["text"] = Field(..., alias="type") 1296 + text: str 1297 + synthetic: Optional[bool] = Field(default=None) 1298 + ignored: Optional[bool] = Field(default=None) 1299 + time: Optional[TextPartInputTime] = Field(default=None) 1300 + metadata: Optional[dict[str, Any]] = Field(default=None) 1301 + 1302 + 1303 + class FilePartInput(BaseModel): 1304 + id_: Optional[str] = Field(default=None, alias="id") 1305 + type_: Literal["file"] = Field(..., alias="type") 1306 + mime: str 1307 + filename: Optional[str] = Field(default=None) 1308 + url: str 1309 + source: Optional[FilePartSource] = Field(default=None) 1310 + 1311 + 1312 + class AgentPartInputSource(BaseModel): 1313 + value: str 1314 + start: int = Field(..., ge=-9007199254740991, le=9007199254740991) 1315 + end: int = Field(..., ge=-9007199254740991, le=9007199254740991) 1316 + 1317 + 1318 + class AgentPartInput(BaseModel): 1319 + id_: Optional[str] = Field(default=None, alias="id") 1320 + type_: Literal["agent"] = Field(..., alias="type") 1321 + name: str 1322 + source: Optional[AgentPartInputSource] = Field(default=None) 1323 + 1324 + 1325 + class SubtaskPartInput(BaseModel): 1326 + id_: Optional[str] = Field(default=None, alias="id") 1327 + type_: Literal["subtask"] = Field(..., alias="type") 1328 + prompt: str 1329 + description: str 1330 + agent: str 1331 + command: Optional[str] = Field(default=None) 1332 + 1333 + 1334 + class Command(BaseModel): 1335 + name: str 1336 + description: Optional[str] = Field(default=None) 1337 + agent: Optional[str] = Field(default=None) 1338 + model: Optional[str] = Field(default=None) 1339 + mcp: Optional[bool] = Field(default=None) 1340 + template: str 1341 + subtask: Optional[bool] = Field(default=None) 1342 + hints: list[str] 1343 + 1344 + 1345 + class ModelApi(BaseModel): 1346 + id_: str = Field(..., alias="id") 1347 + url: str 1348 + npm: str 1349 + 1350 + 1351 + class ModelCapabilitiesInput(BaseModel): 1352 + text: bool 1353 + audio: bool 1354 + image: bool 1355 + video: bool 1356 + pdf: bool 1357 + 1358 + 1359 + class ModelCapabilitiesOutput(BaseModel): 1360 + text: bool 1361 + audio: bool 1362 + image: bool 1363 + video: bool 1364 + pdf: bool 1365 + 1366 + 1367 + class ModelCapabilitiesInterleavedField(Enum, str): 1368 + REASONING_CONTENT = "reasoning_content" 1369 + REASONING_DETAILS = "reasoning_details" 1370 + 1371 + 1372 + class ModelCapabilitiesInterleaved(BaseModel): 1373 + field: ModelCapabilitiesInterleavedField 1374 + 1375 + 1376 + class ModelCapabilities(BaseModel): 1377 + temperature: bool 1378 + reasoning: bool 1379 + attachment: bool 1380 + toolcall: bool 1381 + input_: ModelCapabilitiesInput = Field(..., alias="input") 1382 + output: ModelCapabilitiesOutput 1383 + interleaved: Union[bool, ModelCapabilitiesInterleaved] 1384 + 1385 + 1386 + class ModelCostCache(BaseModel): 1387 + read: float 1388 + write: float 1389 + 1390 + 1391 + class ModelCostExperimentalOver200kCache(BaseModel): 1392 + read: float 1393 + write: float 1394 + 1395 + 1396 + class ModelCostExperimentalOver200k(BaseModel): 1397 + input_: float = Field(..., alias="input") 1398 + output: float 1399 + cache: ModelCostExperimentalOver200kCache 1400 + 1401 + 1402 + class ModelCost(BaseModel): 1403 + input_: float = Field(..., alias="input") 1404 + output: float 1405 + cache: ModelCostCache 1406 + experimental_over200k: Optional[ModelCostExperimentalOver200k] = Field(default=None, alias="experimentalOver200K") 1407 + 1408 + 1409 + class ModelLimit(BaseModel): 1410 + context: float 1411 + output: float 1412 + 1413 + 1414 + class ModelStatus(Enum, str): 1415 + ALPHA = "alpha" 1416 + BETA = "beta" 1417 + DEPRECATED = "deprecated" 1418 + ACTIVE = "active" 1419 + 1420 + 1421 + class Model(BaseModel): 1422 + id_: str = Field(..., alias="id") 1423 + provider_id: str = Field(..., alias="providerID") 1424 + api: ModelApi 1425 + name: str 1426 + family: Optional[str] = Field(default=None) 1427 + capabilities: ModelCapabilities 1428 + cost: ModelCost 1429 + limit: ModelLimit 1430 + status: ModelStatus 1431 + options: dict[str, Any] 1432 + headers: dict[str, Any] 1433 + release_date: str 1434 + variants: Optional[dict[str, Any]] = Field(default=None) 1435 + 1436 + 1437 + class ProviderSource(Enum, str): 1438 + ENV = "env" 1439 + CONFIG = "config" 1440 + CUSTOM = "custom" 1441 + API = "api" 1442 + 1443 + 1444 + class Provider(BaseModel): 1445 + id_: str = Field(..., alias="id") 1446 + name: str 1447 + source: ProviderSource 1448 + env: list[str] 1449 + key: Optional[str] = Field(default=None) 1450 + options: dict[str, Any] 1451 + models: dict[str, Any] 1452 + 1453 + 1454 + class ProviderAuthMethod(BaseModel): 1455 + type_: Union[Literal["oauth"], Literal["api"]] = Field(..., alias="type") 1456 + label: str 1457 + 1458 + 1459 + class ProviderAuthAuthorization(BaseModel): 1460 + url: str 1461 + method: Union[Literal["auto"], Literal["code"]] 1462 + instructions: str 1463 + 1464 + 1465 + class SymbolLocation(BaseModel): 1466 + uri: str 1467 + range_: Range = Field(..., alias="range") 1468 + 1469 + 1470 + class Symbol(BaseModel): 1471 + name: str 1472 + kind: float 1473 + location: SymbolLocation 1474 + 1475 + 1476 + class FileNodeType(Enum, str): 1477 + FILE = "file" 1478 + DIRECTORY = "directory" 1479 + 1480 + 1481 + class FileNode(BaseModel): 1482 + name: str 1483 + path: str 1484 + absolute: str 1485 + type_: FileNodeType = Field(..., alias="type") 1486 + ignored: bool 1487 + 1488 + 1489 + class FileContentPatchHunks(BaseModel): 1490 + old_start: float = Field(..., alias="oldStart") 1491 + old_lines: float = Field(..., alias="oldLines") 1492 + new_start: float = Field(..., alias="newStart") 1493 + new_lines: float = Field(..., alias="newLines") 1494 + lines: list[str] 1495 + 1496 + 1497 + class FileContentPatch(BaseModel): 1498 + old_file_name: str = Field(..., alias="oldFileName") 1499 + new_file_name: str = Field(..., alias="newFileName") 1500 + old_header: Optional[str] = Field(default=None, alias="oldHeader") 1501 + new_header: Optional[str] = Field(default=None, alias="newHeader") 1502 + hunks: list[FileContentPatchHunks] 1503 + index: Optional[str] = Field(default=None) 1504 + 1505 + 1506 + class FileContent(BaseModel): 1507 + type_: Literal["text"] = Field(..., alias="type") 1508 + content: str 1509 + diff: Optional[str] = Field(default=None) 1510 + patch: Optional[FileContentPatch] = Field(default=None) 1511 + encoding: Optional[Literal["base64"]] = Field(default=None) 1512 + mime_type: Optional[str] = Field(default=None, alias="mimeType") 1513 + 1514 + 1515 + class FileStatus(Enum, str): 1516 + ADDED = "added" 1517 + DELETED = "deleted" 1518 + MODIFIED = "modified" 1519 + 1520 + 1521 + class File(BaseModel): 1522 + path: str 1523 + added: int = Field(..., ge=-9007199254740991, le=9007199254740991) 1524 + removed: int = Field(..., ge=-9007199254740991, le=9007199254740991) 1525 + status: FileStatus 1526 + 1527 + 1528 + class AgentMode(Enum, str): 1529 + SUBAGENT = "subagent" 1530 + PRIMARY = "primary" 1531 + ALL = "all" 1532 + 1533 + 1534 + class AgentModel(BaseModel): 1535 + model_id: str = Field(..., alias="modelID") 1536 + provider_id: str = Field(..., alias="providerID") 1537 + 1538 + 1539 + class Agent(BaseModel): 1540 + name: str 1541 + description: Optional[str] = Field(default=None) 1542 + mode: AgentMode 1543 + native: Optional[bool] = Field(default=None) 1544 + hidden: Optional[bool] = Field(default=None) 1545 + top_p: Optional[float] = Field(default=None, alias="topP") 1546 + temperature: Optional[float] = Field(default=None) 1547 + color: Optional[str] = Field(default=None) 1548 + permission: PermissionRuleset 1549 + model: Optional[AgentModel] = Field(default=None) 1550 + prompt: Optional[str] = Field(default=None) 1551 + options: dict[str, Any] 1552 + steps: Optional[int] = Field(default=None, gt=0, le=9007199254740991) 1553 + 1554 + 1555 + class McpStatusConnected(BaseModel): 1556 + status: Literal["connected"] 1557 + 1558 + 1559 + class McpStatusDisabled(BaseModel): 1560 + status: Literal["disabled"] 1561 + 1562 + 1563 + class McpStatusFailed(BaseModel): 1564 + status: Literal["failed"] 1565 + error: str 1566 + 1567 + 1568 + class McpStatusNeedsAuth(BaseModel): 1569 + status: Literal["needs_auth"] 1570 + 1571 + 1572 + class McpStatusNeedsClientRegistration(BaseModel): 1573 + status: Literal["needs_client_registration"] 1574 + error: str 1575 + 1576 + 1577 + McpStatus: TypeAlias = Union[McpStatusConnected, McpStatusDisabled, McpStatusFailed, McpStatusNeedsAuth, McpStatusNeedsClientRegistration] 1578 + 1579 + 1580 + class LspStatus(BaseModel): 1581 + id_: str = Field(..., alias="id") 1582 + name: str 1583 + root: str 1584 + status: Union[Literal["connected"], Literal["error"]] 1585 + 1586 + 1587 + class FormatterStatus(BaseModel): 1588 + name: str 1589 + extensions: list[str] 1590 + enabled: bool 1591 + 1592 + 1593 + class OAuth(BaseModel): 1594 + type_: Literal["oauth"] = Field(..., alias="type") 1595 + refresh: str 1596 + access: str 1597 + expires: float 1598 + enterprise_url: Optional[str] = Field(default=None, alias="enterpriseUrl") 1599 + 1600 + 1601 + class ApiAuth(BaseModel): 1602 + type_: Literal["api"] = Field(..., alias="type") 1603 + key: str 1604 + 1605 + 1606 + class WellKnownAuth(BaseModel): 1607 + type_: Literal["wellknown"] = Field(..., alias="type") 1608 + key: str 1609 + token: str 1610 + 1611 + 1612 + Auth: TypeAlias = Union[OAuth, ApiAuth, WellKnownAuth]
+2 -2
packages/openapi-python/src/plugins/@hey-api/client-httpx/bundle/__init__.py
··· 1 - from .client import Client, create_client 1 + from .client import Client, build_client_params, create_client 2 2 3 - __all__ = ["Client", "create_client"] 3 + __all__ = ["Client", "build_client_params", "create_client"]
+67 -1
packages/openapi-python/src/plugins/@hey-api/client-httpx/bundle/client.py
··· 1 - from typing import Optional 1 + from typing import Any, Optional 2 2 import httpx 3 + 4 + 5 + EXTRA_PREFIXES_MAP = { 6 + "$body_": "json", 7 + "$headers_": "headers", 8 + "$path_": "path", 9 + "$query_": "params", 10 + } 11 + 12 + 13 + def build_client_params(fields: list[dict[str, Any]], **kwargs) -> dict[str, Any]: 14 + """Build client parameters from flat keyword arguments. 15 + 16 + Args: 17 + fields: List of field configurations with 'in', 'key', and optional 'map'. 18 + **kwargs: Flat parameters passed to the SDK method. 19 + 20 + Returns: 21 + Dict suitable for httpx client methods: {params: {...}, headers: {...}, json: Any} 22 + """ 23 + result: dict[str, Any] = {} 24 + 25 + key_map = {} 26 + for field in fields: 27 + key = field.get("key") 28 + if key: 29 + key_map[key] = { 30 + "in": field.get("in"), 31 + "map": field.get("map", key), 32 + } 33 + 34 + for key, value in kwargs.items(): 35 + if value is None: 36 + continue 37 + 38 + field = key_map.get(key) 39 + 40 + if field: 41 + in_slot = field["in"] 42 + map_key = field["map"] 43 + slot = "json" if in_slot == "body" else in_slot 44 + 45 + if in_slot == "body": 46 + result[slot] = value 47 + else: 48 + if slot not in result: 49 + result[slot] = {} 50 + result[slot][map_key] = value 51 + else: 52 + for prefix, slot in EXTRA_PREFIXES_MAP.items(): 53 + if key.startswith(prefix): 54 + actual_key = key[len(prefix) :] 55 + if slot not in result: 56 + result[slot] = {} 57 + result[slot][actual_key] = value 58 + break 59 + else: 60 + if "params" not in result: 61 + result["params"] = {} 62 + result["params"][key] = value 63 + 64 + for slot in list(result.keys()): 65 + if not result[slot]: 66 + del result[slot] 67 + 68 + return result 3 69 4 70 5 71 class BaseClient:
+1
packages/openapi-python/src/plugins/@hey-api/sdk/config.ts
··· 15 15 // transformer: false, 16 16 // validator: false, 17 17 }, 18 + dependencies: ['pydantic'], 18 19 handler, 19 20 name: '@hey-api/python-sdk', 20 21 resolveConfig: (plugin, context) => {
+43 -111
packages/openapi-python/src/plugins/@hey-api/sdk/shared/operation.ts
··· 1 + import type { Symbol } from '@hey-api/codegen-core'; 1 2 import type { IR } from '@hey-api/shared'; 2 - import { toCase } from '@hey-api/shared'; 3 3 4 - import type { $ } from '../../../../py-dsl'; 5 - // import { py } from '../../../../ts-python'; 4 + import { $ } from '../../../../py-dsl'; 6 5 import type { HeyApiSdkPlugin } from '../types'; 7 6 import { getSignatureParameters } from './signature'; 8 7 9 8 type OperationParameters = { 10 9 bodyRef?: string; 10 + fields: Array<{ 11 + in: string; 12 + key: string; 13 + map?: string; 14 + }>; 11 15 parameters: Array<ReturnType<typeof $.param>>; 12 - // parameters: Array<{ 13 - // annotation?: py.Expression; 14 - // defaultValue?: py.Expression; 15 - // name: string; 16 - // }>; 17 16 }; 18 17 19 18 const PYTHON_BUILTIN_TYPES: Record<string, string> = { ··· 25 24 string: 'str', 26 25 }; 27 26 28 - // eslint-disable-next-line @typescript-eslint/no-unused-vars 29 - function schemaToPythonType(schema: IR.SchemaObject, plugin: HeyApiSdkPlugin['Instance']): string { 27 + function schemaToPythonType( 28 + schema: IR.SchemaObject, 29 + plugin: HeyApiSdkPlugin['Instance'], 30 + ): ReturnType<typeof $.expr | typeof $.subscript> | Symbol { 30 31 if (schema.$ref) { 31 - return toCase(schema.$ref.split('/').pop()!, 'PascalCase'); 32 + return plugin.referenceSymbol({ 33 + category: 'schema', 34 + resourceId: schema.$ref, 35 + }); 32 36 } 33 37 34 38 if (schema.type === 'array') { 35 - const itemsSchema = schema.items as IR.SchemaObject | undefined; 39 + const itemsSchema = schema.items?.[0]; 36 40 const itemType = itemsSchema ? schemaToPythonType(itemsSchema, plugin) : 'Any'; 37 - return `list[${itemType}]`; 41 + return $('list').slice(itemType); 38 42 } 39 43 40 44 if (schema.type === 'object' || schema.additionalProperties) { 41 45 if (schema.additionalProperties && typeof schema.additionalProperties === 'object') { 42 - const valueType = schemaToPythonType(schema.additionalProperties as IR.SchemaObject, plugin); 43 - return `dict[str, ${valueType}]`; 46 + const valueType = schemaToPythonType(schema.additionalProperties, plugin); 47 + return $('dict').slice('str', valueType); 44 48 } 45 - return 'dict[str, Any]'; 49 + return $('dict').slice('str', plugin.external('typing.Any')); 46 50 } 47 51 48 52 if (schema.type === 'tuple') { 49 - const itemsSchema = schema.items as IR.SchemaObject | IR.SchemaObject[] | undefined; 53 + const itemsSchema = schema.items; 50 54 const itemTypes = itemsSchema 51 - ? Array.isArray(itemsSchema) 52 - ? itemsSchema.map((item) => schemaToPythonType(item, plugin)) 53 - : [schemaToPythonType(itemsSchema, plugin)] 55 + ? itemsSchema.map((item) => schemaToPythonType(item, plugin)) 54 56 : []; 55 - return `tuple[${itemTypes.join(', ')}]`; 57 + return $('tuple').slice(...itemTypes); 56 58 } 57 59 58 - const builtinType = schema.type ? PYTHON_BUILTIN_TYPES[schema.type] : 'Any'; 59 - return builtinType ?? 'Any'; 60 + const builtinType = schema.type ? PYTHON_BUILTIN_TYPES[schema.type] : undefined; 61 + return $(builtinType ?? plugin.external('typing.Any')); 60 62 } 61 63 62 64 export function operationParameters({ ··· 67 69 plugin: HeyApiSdkPlugin['Instance']; 68 70 }): OperationParameters { 69 71 const result: OperationParameters = { 72 + fields: [], 70 73 parameters: [], 71 74 }; 72 75 ··· 74 77 const signature = getSignatureParameters({ operation }); 75 78 if (!signature) return result; 76 79 77 - // result.bodyRef = signature.bodyRef; 78 - 79 - // for (const param of opParameters.parameters) { 80 - // if (param.name === '*') { 81 - // continue; 82 - // } 83 - // node.param(param.name, (p) => p.type(param.annotation).default(param.defaultValue)); 84 - // } 85 - 86 - // const pathParams: OperationParameters['parameters'] = []; 87 - // const requiredParams: OperationParameters['parameters'] = []; 88 - // const optionalParams: OperationParameters['parameters'] = []; 89 - 90 - // const paramNames = Object.keys(signature.parameters); 91 - 92 - // for (const paramName of paramNames) { 93 - // const param = signature.parameters[paramName]!; 94 - 95 - // if (param.in === 'path') { 96 - // const type = schemaToPythonType(param.schema, plugin); 97 - // pathParams.push({ 98 - // annotation: py.factory.createIdentifier(type), 99 - // name: param.name, 100 - // }); 101 - // continue; 102 - // } 103 - 104 - // if (param.in === 'body' && param.schema.$ref) { 105 - // const refName = toCase(param.schema.$ref.split('/').pop()!, 'PascalCase'); 106 - // if (param.isRequired) { 107 - // requiredParams.push({ 108 - // annotation: py.factory.createIdentifier(refName), 109 - // name: param.name, 110 - // }); 111 - // } else { 112 - // optionalParams.push({ 113 - // annotation: py.factory.createIdentifier(`${refName} | None`), 114 - // defaultValue: py.factory.createLiteral(null), 115 - // name: param.name, 116 - // }); 117 - // } 118 - // continue; 119 - // } 80 + result.bodyRef = signature.bodyRef; 81 + result.fields = signature.fields; 120 82 121 - // const type = schemaToPythonType(param.schema, plugin); 83 + const paramEntries = Object.entries(signature.parameters).sort(([, valueA], [, valueB]) => 84 + valueA.isRequired === valueB.isRequired ? 0 : valueA.isRequired ? -1 : 1, 85 + ); 122 86 123 - // if (param.isRequired) { 124 - // requiredParams.push({ 125 - // annotation: py.factory.createIdentifier(type), 126 - // name: param.name, 127 - // }); 128 - // } else { 129 - // let defaultValue: py.Expression = py.factory.createLiteral(null); 130 - // if (param.schema.default !== undefined) { 131 - // const defaultVal = param.schema.default; 132 - // if ( 133 - // typeof defaultVal === 'string' || 134 - // typeof defaultVal === 'number' || 135 - // typeof defaultVal === 'boolean' 136 - // ) { 137 - // defaultValue = py.factory.createLiteral(defaultVal); 138 - // } else { 139 - // defaultValue = py.factory.createLiteral(null); 140 - // } 141 - // } else if (type.startsWith('list') || type.startsWith('dict')) { 142 - // defaultValue = py.factory.createLiteral(null); 143 - // } 87 + for (const [paramName, param] of paramEntries) { 88 + const type = schemaToPythonType(param.schema, plugin); 144 89 145 - // optionalParams.push({ 146 - // annotation: py.factory.createIdentifier(`${type} | None`), 147 - // defaultValue, 148 - // name: param.name, 149 - // }); 150 - // } 151 - // } 152 - 153 - // if (pathParams.length > 0) { 154 - // result.parameters.push(...pathParams); 155 - // } 156 - 157 - // if (requiredParams.length > 0 || optionalParams.length > 0) { 158 - // result.parameters.push({ name: '*' }); 159 - // result.parameters.push(...requiredParams); 160 - // result.parameters.push(...optionalParams); 161 - // } 162 - 163 - // result.parameters.push({ 164 - // annotation: py.factory.createIdentifier('float | None'), 165 - // defaultValue: py.factory.createLiteral(null), 166 - // name: 'timeout', 167 - // }); 90 + if (param.isRequired) { 91 + result.parameters.push($.param(paramName).type(type)); 92 + } else { 93 + result.parameters.push( 94 + $.param(paramName) 95 + .type($(plugin.external('typing.Union')).slice(type, 'None')) 96 + .default('None'), 97 + ); 98 + } 99 + } 168 100 } 169 101 170 102 return result;
+29 -1
packages/openapi-python/src/plugins/@hey-api/sdk/shared/signature.ts
··· 13 13 14 14 type SignatureParameters = Record<string, SignatureParameter>; 15 15 16 + type Field = { 17 + in: Location | 'headers'; 18 + key: string; 19 + map?: string; 20 + }; 21 + 16 22 type Signature = { 17 23 bodyRef?: string; 24 + fields: Field[]; 18 25 parameters: SignatureParameters; 19 26 }; 20 27 ··· 70 77 } 71 78 72 79 const signatureParameters: SignatureParameters = {}; 80 + const fields: Field[] = []; 73 81 74 82 for (const location of locations) { 75 83 const parameters = operation.parameters?.[location]; ··· 88 96 signatureParameter.originalName = originalName; 89 97 } 90 98 signatureParameters[name] = signatureParameter; 99 + fields.push({ 100 + in: location === 'header' ? 'headers' : location, 101 + key: name, 102 + ...(name !== originalName ? { map: originalName } : {}), 103 + }); 91 104 } 92 105 } 93 106 } ··· 115 128 signatureParameter.originalName = originalName; 116 129 } 117 130 signatureParameters[name] = signatureParameter; 131 + fields.push({ 132 + in: location, 133 + key: name, 134 + ...(name !== originalName ? { map: originalName } : {}), 135 + }); 118 136 } 119 137 } else if (operation.body.schema.$ref) { 120 138 const value = refToName(operation.body.schema.$ref); ··· 131 149 signatureParameter.originalName = originalName; 132 150 } 133 151 signatureParameters[name] = signatureParameter; 152 + fields.push({ 153 + in: location, 154 + key: name, 155 + map: 'body', 156 + }); 134 157 } else { 135 158 signatureParameters.body = { 136 159 in: location, ··· 138 161 name: 'body', 139 162 schema: operation.body.schema, 140 163 }; 164 + fields.push({ 165 + in: location, 166 + key: 'body', 167 + map: 'body', 168 + }); 141 169 } 142 170 } 143 171 ··· 145 173 return; 146 174 } 147 175 148 - return { bodyRef, parameters: signatureParameters }; 176 + return { bodyRef, fields, parameters: signatureParameters }; 149 177 }
+42 -6
packages/openapi-python/src/plugins/@hey-api/sdk/v1/node.ts
··· 118 118 const { node, operation, plugin } = args; 119 119 const method = operation.method.toLowerCase(); 120 120 const opParameters = operationParameters({ operation, plugin }); 121 - return ( 122 - node 123 - .params(...opParameters.parameters) 124 - // TODO: extract operation statements into a separate function 125 - .do($('self').attr('client').attr(method).call($.literal(operation.path)).return()) as T 126 - ); 121 + 122 + if (plugin.config.paramsStructure === 'flat' && opParameters.fields.length > 0) { 123 + const paramNames = opParameters.parameters.map((parameter) => parameter.name.toString()); 124 + 125 + const fieldsList = $.list(); 126 + for (const field of opParameters.fields) { 127 + const fieldDict = $.dict(); 128 + fieldDict.entry($.literal('in'), $.literal(field.in)); 129 + fieldDict.entry($.literal('key'), $.literal(field.key)); 130 + if (field.map) { 131 + fieldDict.entry($.literal('map'), $.literal(field.map)); 132 + } 133 + fieldsList.element(fieldDict); 134 + } 135 + 136 + const kwargs: Array<ReturnType<typeof $.kwarg>> = []; 137 + for (const name of paramNames) { 138 + kwargs.push($.kwarg(name, name)); 139 + } 140 + 141 + return ( 142 + node 143 + .params(...opParameters.parameters) 144 + // TODO: extract operation statements into a separate function 145 + .do( 146 + $.var('params').assign( 147 + $(plugin.external('client.build_client_params')).call(fieldsList, ...kwargs), 148 + ), 149 + ) 150 + .do( 151 + $('self') 152 + .attr('client') 153 + .attr(method) 154 + .call($.literal(operation.path), $.kwarg('params', $('params') as never)) 155 + .return(), 156 + ) as T 157 + ); 158 + } 159 + 160 + return node 161 + .params(...opParameters.parameters) 162 + .do($('self').attr('client').attr(method).call($.literal(operation.path)).return()) as T; 127 163 } 128 164 129 165 export function toNode(
+27
packages/openapi-python/src/plugins/@hey-api/sdk/v1/plugin.ts
··· 11 11 export const handlerV1: HeyApiSdkPlugin['Handler'] = ({ plugin }) => { 12 12 const clientModule = clientFolderAbsolutePath(getTypedConfig(plugin)); 13 13 const client = getClientPlugin(getTypedConfig(plugin)); 14 + 15 + // client 16 + plugin.symbol('build_client_params', { 17 + external: clientModule, 18 + meta: { 19 + category: 'external', 20 + resource: 'client.build_client_params', 21 + tool: client.name, 22 + }, 23 + }); 14 24 plugin.symbol('Client', { 15 25 external: clientModule, 16 26 meta: { ··· 20 30 }, 21 31 }); 22 32 33 + // functools 23 34 plugin.symbol('cached_property', { 24 35 external: 'functools', 25 36 meta: { 26 37 category: 'external', 27 38 resource: 'functools.cached_property', 39 + }, 40 + }); 41 + 42 + // typing 43 + plugin.symbol('Any', { 44 + external: 'typing', 45 + meta: { 46 + category: 'external', 47 + resource: 'typing.Any', 48 + }, 49 + }); 50 + plugin.symbol('Union', { 51 + external: 'typing', 52 + meta: { 53 + category: 'external', 54 + resource: 'typing.Union', 28 55 }, 29 56 }); 30 57
-7
packages/openapi-python/src/plugins/pydantic/v2/plugin.ts
··· 21 21 resource: 'typing.Any', 22 22 }, 23 23 }); 24 - plugin.symbol('List', { 25 - external: 'typing', 26 - meta: { 27 - category: 'external', 28 - resource: 'typing.List', 29 - }, 30 - }); 31 24 plugin.symbol('Literal', { 32 25 external: 'typing', 33 26 meta: {
+5 -7
packages/openapi-python/src/plugins/pydantic/v2/toAst/array.ts
··· 9 9 10 10 function baseNode(ctx: ArrayResolverContext): PydanticType { 11 11 const { applyModifiers, childResults, plugin } = ctx; 12 - const list = plugin.external('typing.List'); 13 12 const any = plugin.external('typing.Any'); 14 13 15 14 if (childResults.length === 0) { 16 15 return { 17 - type: $(list).slice(any), 16 + type: $('list').slice(any), 18 17 }; 19 18 } 20 19 21 20 if (childResults.length === 1) { 22 21 const itemResult = applyModifiers(childResults[0]!); 23 22 return { 24 - type: $(list).slice(itemResult.type ?? any), 23 + type: $('list').slice(itemResult.type ?? any), 25 24 }; 26 25 } 27 26 ··· 29 28 const union = plugin.external('typing.Union'); 30 29 const itemTypes = childResults.map((r) => applyModifiers(r).type ?? any); 31 30 return { 32 - type: $(list).slice($(union).slice(...itemTypes)), 31 + type: $('list').slice($(union).slice(...itemTypes)), 33 32 }; 34 33 } 35 34 36 35 return { 37 - type: $(list).slice(any), 36 + type: $('list').slice(any), 38 37 }; 39 38 } 40 39 ··· 88 87 }): ArrayToTypeResult { 89 88 const { applyModifiers, plugin, schema, walk, walkerCtx } = ctx; 90 89 const any = plugin.external('typing.Any'); 91 - const list = plugin.external('typing.List'); 92 90 93 91 const childResults: Array<PydanticResult> = []; 94 92 ··· 120 118 const resolved = resolver?.(resolverCtx) ?? arrayResolver(resolverCtx); 121 119 122 120 if (!resolved.type) { 123 - resolved.type = $(list).slice(any); 121 + resolved.type = $('list').slice(any); 124 122 } 125 123 126 124 return {
+1 -1
packages/openapi-python/src/py-dsl/decl/param.ts
··· 6 6 export type ParamDefaultValue = NodeName | py.Expression | undefined; 7 7 export type ParamFn = (p: ParamPyDsl) => void; 8 8 export type ParamName = NodeName | ParamFn; 9 - export type ParamType = NodeName | py.Expression | undefined; 9 + export type ParamType = NodeName | PyDsl<py.Expression> | undefined; 10 10 11 11 export type ParamCtor = (name: ParamName, fn?: ParamFn) => ParamPyDsl; 12 12
+15 -9
packages/openapi-python/src/py-dsl/expr/kwarg.ts
··· 1 + import type { NodeName } from '@hey-api/codegen-core'; 2 + 1 3 import { py } from '../../ts-python'; 2 4 import type { MaybePyDsl } from '../base'; 3 5 import { PyDsl } from '../base'; ··· 7 9 export class KwargPyDsl extends PyDsl<py.KeywordArgument> { 8 10 readonly '~dsl' = 'KwargPyDsl'; 9 11 10 - constructor( 11 - private readonly argName: string, 12 - private readonly argValue: KwargValue, 13 - ) { 12 + protected _value: KwargValue; 13 + 14 + constructor(name: NodeName, value: KwargValue) { 14 15 super(); 16 + this.name.set(name); 17 + this._value = value; 15 18 } 16 19 17 20 override toAst() { 18 - return py.factory.createKeywordArgument(this.argName, this.$valueToNode(this.argValue)); 21 + const name = this.name.toString(); 22 + return py.factory.createKeywordArgument(name, this.$valueToNode(this._value)); 19 23 } 20 24 21 25 private $valueToNode(value: KwargValue) { 22 - if (value === null) { 23 - return py.factory.createIdentifier('None'); 24 - } 25 - if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') { 26 + if ( 27 + typeof value === 'string' || 28 + typeof value === 'number' || 29 + typeof value === 'boolean' || 30 + value === null 31 + ) { 26 32 return py.factory.createLiteral(value); 27 33 } 28 34 return this.$node(value);
+1 -2
packages/openapi-python/src/py-dsl/expr/subscript.ts
··· 1 1 import type { AnalysisContext, NodeName } from '@hey-api/codegen-core'; 2 2 3 3 import { py } from '../../ts-python'; 4 - import type { MaybePyDsl } from '../base'; 5 4 import { PyDsl } from '../base'; 6 5 import { LayoutMixin } from '../mixins/layout'; 7 6 import { f } from '../utils/factories'; 8 7 9 - export type SubscriptExpr = NodeName | MaybePyDsl<py.Expression>; 8 + export type SubscriptExpr = NodeName | PyDsl<py.Expression>; 10 9 export type SubscriptCtor = ( 11 10 value: SubscriptExpr, 12 11 ...slices: Array<SubscriptExpr>
-1
packages/openapi-python/src/py-dsl/mixins/expr.ts
··· 37 37 } 38 38 39 39 protected slice(...args: DropFirst<Parameters<typeof f.slice>>): ReturnType<typeof f.slice> { 40 - // @ts-expect-error - fix this type 41 40 return f.slice(this, ...args); 42 41 } 43 42 }
+2 -2
packages/openapi-python/src/py-dsl/mixins/value.ts
··· 1 1 import type { AnalysisContext, Node, NodeName } from '@hey-api/codegen-core'; 2 2 3 3 import type { py } from '../../ts-python'; 4 - import type { MaybePyDsl } from '../base'; 4 + import type { PyDsl } from '../base'; 5 5 import type { BaseCtor, MixinCtor } from './types'; 6 6 7 - export type ValueExpr = NodeName | MaybePyDsl<py.Expression>; 7 + export type ValueExpr = NodeName | PyDsl<py.Expression>; 8 8 9 9 export interface ValueMethods extends Node { 10 10 $value(): py.Expression | undefined;
+1 -2
packages/openapi-python/src/py-dsl/stmt/var.ts
··· 2 2 import { isSymbol } from '@hey-api/codegen-core'; 3 3 4 4 import { py } from '../../ts-python'; 5 - import type { MaybePyDsl } from '../base'; 6 5 import { PyDsl } from '../base'; 7 6 import { ValueMixin } from '../mixins/value'; 8 7 import { safeRuntimeName } from '../utils/name'; 9 8 10 9 const Mixed = ValueMixin(PyDsl<py.Assignment>); 11 10 12 - export type VarType = NodeName | MaybePyDsl<py.Expression>; 11 + export type VarType = NodeName | PyDsl<py.Expression>; 13 12 14 13 export class VarPyDsl extends Mixed { 15 14 readonly '~dsl' = 'VarPyDsl';