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.

test: add python snapshots

Lubos 377ed84f 2f155458

+2975 -348
+1
.vscode/settings.json
··· 21 21 "**/.mypy_cache": true, 22 22 "**/__snapshots__": true, 23 23 "**/coverage": true, 24 + "**/openapi-python-tests/**/.gen": true, 24 25 "**/openapi-ts-tests/**/generated": true, 25 26 "**/openapi-ts-tests/**/.gen": true, 26 27 "**/*.tsbuildinfo": true
+6 -6
dev/inputs.ts
··· 1 1 import path from 'node:path'; 2 2 3 - import { getSpecsPath } from '../packages/openapi-ts-tests/utils'; 3 + const specsPath = path.join(__dirname, '..', 'specs'); 4 4 5 5 export const inputs = { 6 - circular: path.resolve(getSpecsPath(), '3.0.x', 'circular.yaml'), 7 - full: path.resolve(getSpecsPath(), '3.1.x', 'full.yaml'), 6 + circular: path.resolve(specsPath, '3.0.x', 'circular.yaml'), 7 + full: path.resolve(specsPath, '3.1.x', 'full.yaml'), 8 8 local: 'http://localhost:8000/openapi.json', 9 - opencode: path.resolve(getSpecsPath(), '3.1.x', 'opencode.yaml'), 9 + opencode: path.resolve(specsPath, '3.1.x', 'opencode.yaml'), 10 10 petstore: 11 11 'https://raw.githubusercontent.com/swagger-api/swagger-petstore/master/src/main/resources/openapi.yaml', 12 12 redfish: 13 13 'https://raw.githubusercontent.com/DMTF/Redfish-Publications/refs/heads/main/openapi/openapi.yaml', 14 14 scalar: 'scalar:@scalar/access-service', 15 - transformers: path.resolve(getSpecsPath(), '3.1.x', 'transformers.json'), 16 - validators: path.resolve(getSpecsPath(), '3.1.x', 'validators.yaml'), 15 + transformers: path.resolve(specsPath, '3.1.x', 'transformers.json'), 16 + validators: path.resolve(specsPath, '3.1.x', 'validators.yaml'), 17 17 } as const; 18 18 19 19 export type InputKey = keyof typeof inputs;
+19
packages/openapi-python-tests/pydantic/v2/.gitignore
··· 1 + .DS_Store 2 + .idea 3 + .tsdown 4 + .tmp 5 + junit.xml 6 + logs 7 + node_modules 8 + npm-debug.log* 9 + temp 10 + yarn-debug.log* 11 + yarn-error.log* 12 + 13 + *.iml 14 + dist 15 + coverage 16 + .env 17 + 18 + # test files 19 + .gen/
+1612
packages/openapi-python-tests/pydantic/v2/__snapshots__/3.1.x/opencode/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, List, 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]
+13
packages/openapi-python-tests/pydantic/v2/package.json
··· 1 + { 2 + "name": "@test/openapi-python-pydantic-v2", 3 + "version": "0.0.0", 4 + "private": true, 5 + "type": "module", 6 + "devDependencies": { 7 + "@hey-api/openapi-python": "workspace:*", 8 + "typescript": "5.9.3" 9 + }, 10 + "engines": { 11 + "node": ">=20.19.0" 12 + } 13 + }
+44
packages/openapi-python-tests/pydantic/v2/test/opencode.test.ts
··· 1 + import fs from 'node:fs'; 2 + import path from 'node:path'; 3 + 4 + import { createClient } from '@hey-api/openapi-python'; 5 + 6 + import { getFilePaths } from '../../../utils'; 7 + import { createPydanticConfig, getSnapshotsPath, getTempSnapshotsPath } from './utils'; 8 + 9 + const version = '3.1.x'; 10 + 11 + const outputDir = path.join(getTempSnapshotsPath(), version); 12 + const snapshotsDir = path.join(getSnapshotsPath(), version); 13 + 14 + describe(`Pydantic: OpenAPI ${version}`, () => { 15 + const createConfig = createPydanticConfig({ 16 + openApiVersion: version, 17 + outputDir, 18 + }); 19 + 20 + const scenarios = [ 21 + { 22 + config: createConfig({ 23 + input: 'opencode.yaml', 24 + output: 'opencode', 25 + }), 26 + description: 'OpenCode spec', 27 + }, 28 + ]; 29 + 30 + it.each(scenarios)('$description', async ({ config }) => { 31 + await createClient(config); 32 + 33 + const filePaths = getFilePaths(config.output); 34 + 35 + await Promise.all( 36 + filePaths.map(async (filePath) => { 37 + const fileContent = fs.readFileSync(filePath, 'utf-8'); 38 + await expect(fileContent).toMatchFileSnapshot( 39 + path.join(snapshotsDir, filePath.slice(outputDir.length + 1)), 40 + ); 41 + }), 42 + ); 43 + }); 44 + });
+40
packages/openapi-python-tests/pydantic/v2/test/utils.ts
··· 1 + import path from 'node:path'; 2 + import { fileURLToPath } from 'node:url'; 3 + 4 + import { type UserConfig } from '@hey-api/openapi-python'; 5 + 6 + import { getSpecsPath } from '../../../utils'; 7 + 8 + const __filename = fileURLToPath(import.meta.url); 9 + const __dirname = path.dirname(__filename); 10 + 11 + export const createPydanticConfig = 12 + ({ openApiVersion, outputDir }: { openApiVersion: string; outputDir: string }) => 13 + (userConfig: UserConfig) => { 14 + const input = userConfig.input instanceof Array ? userConfig.input[0]! : userConfig.input; 15 + const inputPath = path.join( 16 + getSpecsPath(), 17 + openApiVersion, 18 + typeof input === 'string' ? input : (input.path as string), 19 + ); 20 + return { 21 + plugins: ['pydantic'], 22 + ...userConfig, 23 + input: 24 + typeof userConfig.input === 'string' 25 + ? inputPath 26 + : { 27 + ...userConfig.input, 28 + path: inputPath, 29 + }, 30 + logs: { 31 + level: 'silent', 32 + path: './logs', 33 + }, 34 + output: path.join(outputDir, typeof userConfig.output === 'string' ? userConfig.output : ''), 35 + } as const satisfies UserConfig; 36 + }; 37 + 38 + export const getSnapshotsPath = (): string => path.join(__dirname, '..', '__snapshots__'); 39 + 40 + export const getTempSnapshotsPath = (): string => path.join(__dirname, '..', '.gen', 'snapshots');
+6
packages/openapi-python-tests/pydantic/v2/tsconfig.json
··· 1 + { 2 + "extends": "../../tsconfig.base.json", 3 + "include": ["test/**/*"], 4 + "exclude": [".gen/**/*", "__snapshots__/**/*"], 5 + "references": [{ "path": "../../../openapi-python" }] 6 + }
+10
packages/openapi-python-tests/pydantic/v2/turbo.json
··· 1 + { 2 + "$schema": "../../../../node_modules/turbo/schema.json", 3 + "extends": ["//"], 4 + "tasks": { 5 + "build": { 6 + "dependsOn": [], 7 + "outputs": ["dist/**"] 8 + } 9 + } 10 + }
+7
packages/openapi-python-tests/pydantic/v2/vitest.setup.ts
··· 1 + import { fileURLToPath } from 'node:url'; 2 + 3 + import { beforeAll } from 'vitest'; 4 + 5 + beforeAll(() => { 6 + process.chdir(fileURLToPath(new URL('.', import.meta.url))); 7 + });
+19
packages/openapi-python-tests/sdks/.gitignore
··· 1 + .DS_Store 2 + .idea 3 + .tsdown 4 + .tmp 5 + junit.xml 6 + logs 7 + node_modules 8 + npm-debug.log* 9 + temp 10 + yarn-debug.log* 11 + yarn-error.log* 12 + 13 + *.iml 14 + dist 15 + coverage 16 + .env 17 + 18 + # test files 19 + .gen/
+5
packages/openapi-python-tests/sdks/__snapshots__/opencode/default/__init__.py
··· 1 + # This file is auto-generated by @hey-api/openapi-python 2 + 3 + from .sdk_gen import App, Auth, Auth_2, Command, Config, Control, Event, File, Find, Formatter, Global, Instance, Lsp, Mcp, Oauth, Part, Path, Permission, Project, Provider, Pty, Sdk, Session, Tool, Tui, Vcs 4 + 5 + __all__ = ["App", "Auth", "Auth_2", "Command", "Config", "Control", "Event", "File", "Find", "Formatter", "Global", "Instance", "Lsp", "Mcp", "Oauth", "Part", "Path", "Permission", "Project", "Provider", "Pty", "Sdk", "Session", "Tool", "Tui", "Vcs"]
+5
packages/openapi-python-tests/sdks/__snapshots__/opencode/default/client/__init__.py
··· 1 + # This file is auto-generated by @hey-api/openapi-python 2 + 3 + from .client_gen import Client, create_client 4 + 5 + __all__ = ["Client", "create_client"]
+64
packages/openapi-python-tests/sdks/__snapshots__/opencode/default/client/client_gen.py
··· 1 + # This file is auto-generated by @hey-api/openapi-python 2 + 3 + from typing import Optional 4 + import httpx 5 + 6 + 7 + class BaseClient: 8 + """Base HTTP client using httpx that SDK classes extend.""" 9 + 10 + def __init__(self, client: Optional[httpx.Client] = None, base_url: Optional[str] = None, **kwargs): 11 + if client is not None: 12 + self._client = client 13 + else: 14 + self._client = httpx.Client(base_url=base_url or "", **kwargs) 15 + 16 + @property 17 + def client(self) -> httpx.Client: 18 + """Get the httpx client instance.""" 19 + return self._client 20 + 21 + def request(self, method: str, url: str, **kwargs) -> httpx.Response: 22 + """Make an HTTP request.""" 23 + return self._client.request(method, url, **kwargs) 24 + 25 + def get(self, url: str, **kwargs) -> httpx.Response: 26 + """Make a GET request.""" 27 + return self._client.get(url, **kwargs) 28 + 29 + def post(self, url: str, **kwargs) -> httpx.Response: 30 + """Make a POST request.""" 31 + return self._client.post(url, **kwargs) 32 + 33 + def put(self, url: str, **kwargs) -> httpx.Response: 34 + """Make a PUT request.""" 35 + return self._client.put(url, **kwargs) 36 + 37 + def patch(self, url: str, **kwargs) -> httpx.Response: 38 + """Make a PATCH request.""" 39 + return self._client.patch(url, **kwargs) 40 + 41 + def delete(self, url: str, **kwargs) -> httpx.Response: 42 + """Make a DELETE request.""" 43 + return self._client.delete(url, **kwargs) 44 + 45 + def close(self): 46 + """Close the client.""" 47 + self._client.close() 48 + 49 + def __enter__(self): 50 + return self 51 + 52 + def __exit__(self, *args): 53 + self.close() 54 + 55 + 56 + class Client(BaseClient): 57 + """HTTP client using httpx (alias for BaseClient).""" 58 + 59 + pass 60 + 61 + 62 + def create_client(base_url: Optional[str] = None, **kwargs) -> Client: 63 + """Create a new HTTP client instance.""" 64 + return Client(base_url=base_url, **kwargs)
+908
packages/openapi-python-tests/sdks/__snapshots__/opencode/default/sdk_gen.py
··· 1 + # This file is auto-generated by @hey-api/openapi-python 2 + 3 + from functools import cached_property 4 + 5 + from .client import Client 6 + 7 + 8 + class Global(Client): 9 + def health(self): 10 + """ 11 + Get health 12 + 13 + Get health information about the OpenCode server. 14 + """ 15 + 16 + return self.client.get("/global/health") 17 + 18 + def event(self): 19 + """ 20 + Get global events 21 + 22 + Subscribe to global events from the OpenCode system using server-sent events. 23 + """ 24 + 25 + return self.client.get("/global/event") 26 + 27 + def dispose(self): 28 + """ 29 + Dispose instance 30 + 31 + Clean up and dispose all OpenCode instances, releasing all resources. 32 + """ 33 + 34 + return self.client.post("/global/dispose") 35 + 36 + 37 + class Project(Client): 38 + def list_(self): 39 + """ 40 + List all projects 41 + 42 + Get a list of projects that have been opened with OpenCode. 43 + """ 44 + 45 + return self.client.get("/project") 46 + 47 + def current(self): 48 + """ 49 + Get current project 50 + 51 + Retrieve the currently active project that OpenCode is working with. 52 + """ 53 + 54 + return self.client.get("/project/current") 55 + 56 + def update(self): 57 + """ 58 + Update project 59 + 60 + Update project properties such as name, icon and color. 61 + """ 62 + 63 + return self.client.patch("/project/{projectID}") 64 + 65 + 66 + class Pty(Client): 67 + def list_(self): 68 + """ 69 + List PTY sessions 70 + 71 + Get a list of all active pseudo-terminal (PTY) sessions managed by OpenCode. 72 + """ 73 + 74 + return self.client.get("/pty") 75 + 76 + def create(self): 77 + """ 78 + Create PTY session 79 + 80 + Create a new pseudo-terminal (PTY) session for running shell commands and processes. 81 + """ 82 + 83 + return self.client.post("/pty") 84 + 85 + def remove(self): 86 + """ 87 + Remove PTY session 88 + 89 + Remove and terminate a specific pseudo-terminal (PTY) session. 90 + """ 91 + 92 + return self.client.delete("/pty/{ptyID}") 93 + 94 + def get(self): 95 + """ 96 + Get PTY session 97 + 98 + Retrieve detailed information about a specific pseudo-terminal (PTY) session. 99 + """ 100 + 101 + return self.client.get("/pty/{ptyID}") 102 + 103 + def update(self): 104 + """ 105 + Update PTY session 106 + 107 + Update properties of an existing pseudo-terminal (PTY) session. 108 + """ 109 + 110 + return self.client.put("/pty/{ptyID}") 111 + 112 + def connect(self): 113 + """ 114 + Connect to PTY session 115 + 116 + Establish a WebSocket connection to interact with a pseudo-terminal (PTY) session in real-time. 117 + """ 118 + 119 + return self.client.get("/pty/{ptyID}/connect") 120 + 121 + 122 + class Config(Client): 123 + def get(self): 124 + """ 125 + Get configuration 126 + 127 + Retrieve the current OpenCode configuration settings and preferences. 128 + """ 129 + 130 + return self.client.get("/config") 131 + 132 + def update(self): 133 + """ 134 + Update configuration 135 + 136 + Update OpenCode configuration settings and preferences. 137 + """ 138 + 139 + return self.client.patch("/config") 140 + 141 + def providers(self): 142 + """ 143 + List config providers 144 + 145 + Get a list of all configured AI providers and their default models. 146 + """ 147 + 148 + return self.client.get("/config/providers") 149 + 150 + 151 + class Tool(Client): 152 + def ids(self): 153 + """ 154 + List tool IDs 155 + 156 + Get a list of all available tool IDs, including both built-in tools and dynamically registered tools. 157 + """ 158 + 159 + return self.client.get("/experimental/tool/ids") 160 + 161 + def list_(self): 162 + """ 163 + List tools 164 + 165 + Get a list of available tools with their JSON schema parameters for a specific provider and model combination. 166 + """ 167 + 168 + return self.client.get("/experimental/tool") 169 + 170 + 171 + class Instance(Client): 172 + def dispose(self): 173 + """ 174 + Dispose instance 175 + 176 + Clean up and dispose the current OpenCode instance, releasing all resources. 177 + """ 178 + 179 + return self.client.post("/instance/dispose") 180 + 181 + 182 + class Path(Client): 183 + def get(self): 184 + """ 185 + Get paths 186 + 187 + Retrieve the current working directory and related path information for the OpenCode instance. 188 + """ 189 + 190 + return self.client.get("/path") 191 + 192 + 193 + class Vcs(Client): 194 + def get(self): 195 + """ 196 + Get VCS info 197 + 198 + Retrieve version control system (VCS) information for the current project, such as git branch. 199 + """ 200 + 201 + return self.client.get("/vcs") 202 + 203 + 204 + class Session(Client): 205 + def list_(self): 206 + """ 207 + List sessions 208 + 209 + Get a list of all OpenCode sessions, sorted by most recently updated. 210 + """ 211 + 212 + return self.client.get("/session") 213 + 214 + def create(self): 215 + """ 216 + Create session 217 + 218 + Create a new OpenCode session for interacting with AI assistants and managing conversations. 219 + """ 220 + 221 + return self.client.post("/session") 222 + 223 + def status(self): 224 + """ 225 + Get session status 226 + 227 + Retrieve the current status of all sessions, including active, idle, and completed states. 228 + """ 229 + 230 + return self.client.get("/session/status") 231 + 232 + def delete(self): 233 + """ 234 + Delete session 235 + 236 + Delete a session and permanently remove all associated data, including messages and history. 237 + """ 238 + 239 + return self.client.delete("/session/{sessionID}") 240 + 241 + def get(self): 242 + """ 243 + Get session 244 + 245 + Retrieve detailed information about a specific OpenCode session. 246 + """ 247 + 248 + return self.client.get("/session/{sessionID}") 249 + 250 + def update(self): 251 + """ 252 + Update session 253 + 254 + Update properties of an existing session, such as title or other metadata. 255 + """ 256 + 257 + return self.client.patch("/session/{sessionID}") 258 + 259 + def children(self): 260 + """ 261 + Get session children 262 + 263 + Retrieve all child sessions that were forked from the specified parent session. 264 + """ 265 + 266 + return self.client.get("/session/{sessionID}/children") 267 + 268 + def todo(self): 269 + """ 270 + Get session todos 271 + 272 + Retrieve the todo list associated with a specific session, showing tasks and action items. 273 + """ 274 + 275 + return self.client.get("/session/{sessionID}/todo") 276 + 277 + def init(self): 278 + """ 279 + Initialize session 280 + 281 + Analyze the current application and create an AGENTS.md file with project-specific agent configurations. 282 + """ 283 + 284 + return self.client.post("/session/{sessionID}/init") 285 + 286 + def fork(self): 287 + """ 288 + Fork session 289 + 290 + Create a new session by forking an existing session at a specific message point. 291 + """ 292 + 293 + return self.client.post("/session/{sessionID}/fork") 294 + 295 + def abort(self): 296 + """ 297 + Abort session 298 + 299 + Abort an active session and stop any ongoing AI processing or command execution. 300 + """ 301 + 302 + return self.client.post("/session/{sessionID}/abort") 303 + 304 + def unshare(self): 305 + """ 306 + Unshare session 307 + 308 + Remove the shareable link for a session, making it private again. 309 + """ 310 + 311 + return self.client.delete("/session/{sessionID}/share") 312 + 313 + def share(self): 314 + """ 315 + Share session 316 + 317 + Create a shareable link for a session, allowing others to view the conversation. 318 + """ 319 + 320 + return self.client.post("/session/{sessionID}/share") 321 + 322 + def diff(self): 323 + """ 324 + Get session diff 325 + 326 + Get all file changes (diffs) made during this session. 327 + """ 328 + 329 + return self.client.get("/session/{sessionID}/diff") 330 + 331 + def summarize(self): 332 + """ 333 + Summarize session 334 + 335 + Generate a concise summary of the session using AI compaction to preserve key information. 336 + """ 337 + 338 + return self.client.post("/session/{sessionID}/summarize") 339 + 340 + def messages(self): 341 + """ 342 + Get session messages 343 + 344 + Retrieve all messages in a session, including user prompts and AI responses. 345 + """ 346 + 347 + return self.client.get("/session/{sessionID}/message") 348 + 349 + def prompt(self): 350 + """ 351 + Send message 352 + 353 + Create and send a new message to a session, streaming the AI response. 354 + """ 355 + 356 + return self.client.post("/session/{sessionID}/message") 357 + 358 + def message(self): 359 + """ 360 + Get message 361 + 362 + Retrieve a specific message from a session by its message ID. 363 + """ 364 + 365 + return self.client.get("/session/{sessionID}/message/{messageID}") 366 + 367 + def prompt_async(self): 368 + """ 369 + Send async message 370 + 371 + Create and send a new message to a session asynchronously, starting the session if needed and returning immediately. 372 + """ 373 + 374 + return self.client.post("/session/{sessionID}/prompt_async") 375 + 376 + def command(self): 377 + """ 378 + Send command 379 + 380 + Send a new command to a session for execution by the AI assistant. 381 + """ 382 + 383 + return self.client.post("/session/{sessionID}/command") 384 + 385 + def shell(self): 386 + """ 387 + Run shell command 388 + 389 + Execute a shell command within the session context and return the AI's response. 390 + """ 391 + 392 + return self.client.post("/session/{sessionID}/shell") 393 + 394 + def revert(self): 395 + """ 396 + Revert message 397 + 398 + Revert a specific message in a session, undoing its effects and restoring the previous state. 399 + """ 400 + 401 + return self.client.post("/session/{sessionID}/revert") 402 + 403 + def unrevert(self): 404 + """ 405 + Restore reverted messages 406 + 407 + Restore all previously reverted messages in a session. 408 + """ 409 + 410 + return self.client.post("/session/{sessionID}/unrevert") 411 + 412 + 413 + class Part(Client): 414 + def delete(self): 415 + """Delete a part from a message""" 416 + 417 + return self.client.delete("/session/{sessionID}/message/{messageID}/part/{partID}") 418 + 419 + def update(self): 420 + """Update a part in a message""" 421 + 422 + return self.client.patch("/session/{sessionID}/message/{messageID}/part/{partID}") 423 + 424 + 425 + class Permission(Client): 426 + def respond(self): 427 + """ 428 + Respond to permission 429 + 430 + Approve or deny a permission request from the AI assistant. 431 + 432 + Deprecated. 433 + """ 434 + 435 + return self.client.post("/session/{sessionID}/permissions/{permissionID}") 436 + 437 + def reply(self): 438 + """ 439 + Respond to permission request 440 + 441 + Approve or deny a permission request from the AI assistant. 442 + """ 443 + 444 + return self.client.post("/permission/{requestID}/reply") 445 + 446 + def list_(self): 447 + """ 448 + List pending permissions 449 + 450 + Get all pending permission requests across all sessions. 451 + """ 452 + 453 + return self.client.get("/permission") 454 + 455 + 456 + class Command(Client): 457 + def list_(self): 458 + """ 459 + List commands 460 + 461 + Get a list of all available commands in the OpenCode system. 462 + """ 463 + 464 + return self.client.get("/command") 465 + 466 + 467 + class Oauth(Client): 468 + def authorize(self): 469 + """ 470 + OAuth authorize 471 + 472 + Initiate OAuth authorization for a specific AI provider to get an authorization URL. 473 + """ 474 + 475 + return self.client.post("/provider/{providerID}/oauth/authorize") 476 + 477 + def callback(self): 478 + """ 479 + OAuth callback 480 + 481 + Handle the OAuth callback from a provider after user authorization. 482 + """ 483 + 484 + return self.client.post("/provider/{providerID}/oauth/callback") 485 + 486 + 487 + class Provider(Client): 488 + def list_(self): 489 + """ 490 + List providers 491 + 492 + Get a list of all available AI providers, including both available and connected ones. 493 + """ 494 + 495 + return self.client.get("/provider") 496 + 497 + def auth(self): 498 + """ 499 + Get provider auth methods 500 + 501 + Retrieve available authentication methods for all AI providers. 502 + """ 503 + 504 + return self.client.get("/provider/auth") 505 + 506 + @cached_property 507 + def oauth(self) -> Oauth: 508 + return Oauth(client=self.client) 509 + 510 + 511 + class Find(Client): 512 + def text(self): 513 + """ 514 + Find text 515 + 516 + Search for text patterns across files in the project using ripgrep. 517 + """ 518 + 519 + return self.client.get("/find") 520 + 521 + def files(self): 522 + """ 523 + Find files 524 + 525 + Search for files or directories by name or pattern in the project directory. 526 + """ 527 + 528 + return self.client.get("/find/file") 529 + 530 + def symbols(self): 531 + """ 532 + Find symbols 533 + 534 + Search for workspace symbols like functions, classes, and variables using LSP. 535 + """ 536 + 537 + return self.client.get("/find/symbol") 538 + 539 + 540 + class File(Client): 541 + def list_(self): 542 + """ 543 + List files 544 + 545 + List files and directories in a specified path. 546 + """ 547 + 548 + return self.client.get("/file") 549 + 550 + def read(self): 551 + """ 552 + Read file 553 + 554 + Read the content of a specified file. 555 + """ 556 + 557 + return self.client.get("/file/content") 558 + 559 + def status(self): 560 + """ 561 + Get file status 562 + 563 + Get the git status of all files in the project. 564 + """ 565 + 566 + return self.client.get("/file/status") 567 + 568 + 569 + class App(Client): 570 + def log(self): 571 + """ 572 + Write log 573 + 574 + Write a log entry to the server logs with specified level and metadata. 575 + """ 576 + 577 + return self.client.post("/log") 578 + 579 + def agents(self): 580 + """ 581 + List agents 582 + 583 + Get a list of all available AI agents in the OpenCode system. 584 + """ 585 + 586 + return self.client.get("/agent") 587 + 588 + 589 + class Auth(Client): 590 + def remove(self): 591 + """ 592 + Remove MCP OAuth 593 + 594 + Remove OAuth credentials for an MCP server 595 + """ 596 + 597 + return self.client.delete("/mcp/{name}/auth") 598 + 599 + def start(self): 600 + """ 601 + Start MCP OAuth 602 + 603 + Start OAuth authentication flow for a Model Context Protocol (MCP) server. 604 + """ 605 + 606 + return self.client.post("/mcp/{name}/auth") 607 + 608 + def callback(self): 609 + """ 610 + Complete MCP OAuth 611 + 612 + Complete OAuth authentication for a Model Context Protocol (MCP) server using the authorization code. 613 + """ 614 + 615 + return self.client.post("/mcp/{name}/auth/callback") 616 + 617 + def authenticate(self): 618 + """ 619 + Authenticate MCP OAuth 620 + 621 + Start OAuth flow and wait for callback (opens browser) 622 + """ 623 + 624 + return self.client.post("/mcp/{name}/auth/authenticate") 625 + 626 + 627 + class Mcp(Client): 628 + def status(self): 629 + """ 630 + Get MCP status 631 + 632 + Get the status of all Model Context Protocol (MCP) servers. 633 + """ 634 + 635 + return self.client.get("/mcp") 636 + 637 + def add(self): 638 + """ 639 + Add MCP server 640 + 641 + Dynamically add a new Model Context Protocol (MCP) server to the system. 642 + """ 643 + 644 + return self.client.post("/mcp") 645 + 646 + def connect(self): 647 + """Connect an MCP server""" 648 + 649 + return self.client.post("/mcp/{name}/connect") 650 + 651 + def disconnect(self): 652 + """Disconnect an MCP server""" 653 + 654 + return self.client.post("/mcp/{name}/disconnect") 655 + 656 + @cached_property 657 + def auth(self) -> Auth: 658 + return Auth(client=self.client) 659 + 660 + 661 + class Lsp(Client): 662 + def status(self): 663 + """ 664 + Get LSP status 665 + 666 + Get LSP server status 667 + """ 668 + 669 + return self.client.get("/lsp") 670 + 671 + 672 + class Formatter(Client): 673 + def status(self): 674 + """ 675 + Get formatter status 676 + 677 + Get formatter status 678 + """ 679 + 680 + return self.client.get("/formatter") 681 + 682 + 683 + class Control(Client): 684 + def next_(self): 685 + """ 686 + Get next TUI request 687 + 688 + Retrieve the next TUI (Terminal User Interface) request from the queue for processing. 689 + """ 690 + 691 + return self.client.get("/tui/control/next") 692 + 693 + def response(self): 694 + """ 695 + Submit TUI response 696 + 697 + Submit a response to the TUI request queue to complete a pending request. 698 + """ 699 + 700 + return self.client.post("/tui/control/response") 701 + 702 + 703 + class Tui(Client): 704 + def append_prompt(self): 705 + """ 706 + Append TUI prompt 707 + 708 + Append prompt to the TUI 709 + """ 710 + 711 + return self.client.post("/tui/append-prompt") 712 + 713 + def open_help(self): 714 + """ 715 + Open help dialog 716 + 717 + Open the help dialog in the TUI to display user assistance information. 718 + """ 719 + 720 + return self.client.post("/tui/open-help") 721 + 722 + def open_sessions(self): 723 + """ 724 + Open sessions dialog 725 + 726 + Open the session dialog 727 + """ 728 + 729 + return self.client.post("/tui/open-sessions") 730 + 731 + def open_themes(self): 732 + """ 733 + Open themes dialog 734 + 735 + Open the theme dialog 736 + """ 737 + 738 + return self.client.post("/tui/open-themes") 739 + 740 + def open_models(self): 741 + """ 742 + Open models dialog 743 + 744 + Open the model dialog 745 + """ 746 + 747 + return self.client.post("/tui/open-models") 748 + 749 + def submit_prompt(self): 750 + """ 751 + Submit TUI prompt 752 + 753 + Submit the prompt 754 + """ 755 + 756 + return self.client.post("/tui/submit-prompt") 757 + 758 + def clear_prompt(self): 759 + """ 760 + Clear TUI prompt 761 + 762 + Clear the prompt 763 + """ 764 + 765 + return self.client.post("/tui/clear-prompt") 766 + 767 + def execute_command(self): 768 + """ 769 + Execute TUI command 770 + 771 + Execute a TUI command (e.g. agent_cycle) 772 + """ 773 + 774 + return self.client.post("/tui/execute-command") 775 + 776 + def show_toast(self): 777 + """ 778 + Show TUI toast 779 + 780 + Show a toast notification in the TUI 781 + """ 782 + 783 + return self.client.post("/tui/show-toast") 784 + 785 + def publish(self): 786 + """ 787 + Publish TUI event 788 + 789 + Publish a TUI event 790 + """ 791 + 792 + return self.client.post("/tui/publish") 793 + 794 + @cached_property 795 + def control(self) -> Control: 796 + return Control(client=self.client) 797 + 798 + 799 + class Auth_2(Client): 800 + def set_(self): 801 + """ 802 + Set auth credentials 803 + 804 + Set authentication credentials 805 + """ 806 + 807 + return self.client.put("/auth/{providerID}") 808 + 809 + 810 + class Event(Client): 811 + def subscribe(self): 812 + """ 813 + Subscribe to events 814 + 815 + Get events 816 + """ 817 + 818 + return self.client.get("/event") 819 + 820 + 821 + class Sdk(Client): 822 + @cached_property 823 + def global_(self) -> Global: 824 + return Global(client=self.client) 825 + 826 + @cached_property 827 + def project(self) -> Project: 828 + return Project(client=self.client) 829 + 830 + @cached_property 831 + def pty(self) -> Pty: 832 + return Pty(client=self.client) 833 + 834 + @cached_property 835 + def config(self) -> Config: 836 + return Config(client=self.client) 837 + 838 + @cached_property 839 + def tool(self) -> Tool: 840 + return Tool(client=self.client) 841 + 842 + @cached_property 843 + def instance(self) -> Instance: 844 + return Instance(client=self.client) 845 + 846 + @cached_property 847 + def path(self) -> Path: 848 + return Path(client=self.client) 849 + 850 + @cached_property 851 + def vcs(self) -> Vcs: 852 + return Vcs(client=self.client) 853 + 854 + @cached_property 855 + def session(self) -> Session: 856 + return Session(client=self.client) 857 + 858 + @cached_property 859 + def part(self) -> Part: 860 + return Part(client=self.client) 861 + 862 + @cached_property 863 + def permission(self) -> Permission: 864 + return Permission(client=self.client) 865 + 866 + @cached_property 867 + def command(self) -> Command: 868 + return Command(client=self.client) 869 + 870 + @cached_property 871 + def provider(self) -> Provider: 872 + return Provider(client=self.client) 873 + 874 + @cached_property 875 + def find(self) -> Find: 876 + return Find(client=self.client) 877 + 878 + @cached_property 879 + def file(self) -> File: 880 + return File(client=self.client) 881 + 882 + @cached_property 883 + def app(self) -> App: 884 + return App(client=self.client) 885 + 886 + @cached_property 887 + def mcp(self) -> Mcp: 888 + return Mcp(client=self.client) 889 + 890 + @cached_property 891 + def lsp(self) -> Lsp: 892 + return Lsp(client=self.client) 893 + 894 + @cached_property 895 + def formatter(self) -> Formatter: 896 + return Formatter(client=self.client) 897 + 898 + @cached_property 899 + def tui(self) -> Tui: 900 + return Tui(client=self.client) 901 + 902 + @cached_property 903 + def auth(self) -> Auth_2: 904 + return Auth_2(client=self.client) 905 + 906 + @cached_property 907 + def event(self) -> Event: 908 + return Event(client=self.client)
+13
packages/openapi-python-tests/sdks/package.json
··· 1 + { 2 + "name": "@test/openapi-python-sdks", 3 + "version": "0.0.0", 4 + "private": true, 5 + "type": "module", 6 + "devDependencies": { 7 + "@hey-api/openapi-python": "workspace:*", 8 + "typescript": "5.9.3" 9 + }, 10 + "engines": { 11 + "node": ">=20.19.0" 12 + } 13 + }
+52
packages/openapi-python-tests/sdks/test/opencode.test.ts
··· 1 + import fs from 'node:fs'; 2 + import path from 'node:path'; 3 + 4 + import { createClient } from '@hey-api/openapi-python'; 5 + 6 + import { getFilePaths, getSpecsPath } from '../../utils'; 7 + import { createSdkConfig, getSnapshotsPath, getTempSnapshotsPath } from './utils'; 8 + 9 + const namespace = 'opencode'; 10 + 11 + const outputDir = path.join(getTempSnapshotsPath(), namespace); 12 + const snapshotsDir = path.join(getSnapshotsPath(), namespace); 13 + 14 + const specPath = path.join(getSpecsPath(), '3.1.x', 'opencode.yaml'); 15 + 16 + describe(`Python SDK: ${namespace}`, () => { 17 + const createConfig = createSdkConfig({ 18 + outputDir, 19 + }); 20 + 21 + const scenarios = [ 22 + { 23 + config: createConfig({ 24 + input: specPath, 25 + output: 'default', 26 + plugins: ['@hey-api/python-sdk'], 27 + }), 28 + description: 'default', 29 + }, 30 + ]; 31 + 32 + it.each(scenarios)( 33 + '$description', 34 + async ({ config }) => { 35 + await createClient(config); 36 + 37 + const filePaths = getFilePaths( 38 + typeof config.output === 'string' ? config.output : config.output.path, 39 + ); 40 + 41 + await Promise.all( 42 + filePaths.map(async (filePath) => { 43 + const fileContent = fs.readFileSync(filePath, 'utf-8'); 44 + await expect(fileContent).toMatchFileSnapshot( 45 + path.join(snapshotsDir, filePath.slice(outputDir.length + 1)), 46 + ); 47 + }), 48 + ); 49 + }, 50 + 15_000, 51 + ); 52 + });
+32
packages/openapi-python-tests/sdks/test/utils.ts
··· 1 + import path from 'node:path'; 2 + import { fileURLToPath } from 'node:url'; 3 + 4 + import { type UserConfig } from '@hey-api/openapi-python'; 5 + 6 + const __filename = fileURLToPath(import.meta.url); 7 + const __dirname = path.dirname(__filename); 8 + 9 + export const createSdkConfig = 10 + ({ outputDir }: { outputDir: string }) => 11 + (userConfig: UserConfig) => 12 + ({ 13 + ...userConfig, 14 + logs: { 15 + level: 'silent', 16 + path: './logs', 17 + }, 18 + output: 19 + typeof userConfig.output === 'string' 20 + ? path.join(outputDir, userConfig.output) 21 + : { 22 + ...userConfig.output, 23 + path: path.join( 24 + outputDir, 25 + userConfig.output instanceof Array ? '' : userConfig.output.path, 26 + ), 27 + }, 28 + }) as const satisfies UserConfig; 29 + 30 + export const getSnapshotsPath = (): string => path.join(__dirname, '..', '__snapshots__'); 31 + 32 + export const getTempSnapshotsPath = (): string => path.join(__dirname, '..', '.gen', 'snapshots');
+6
packages/openapi-python-tests/sdks/tsconfig.json
··· 1 + { 2 + "extends": "../tsconfig.base.json", 3 + "include": ["test/**/*"], 4 + "exclude": [".gen/**/*"], 5 + "references": [{ "path": "../../openapi-python" }] 6 + }
+10
packages/openapi-python-tests/sdks/turbo.json
··· 1 + { 2 + "$schema": "../../../node_modules/turbo/schema.json", 3 + "extends": ["//"], 4 + "tasks": { 5 + "build": { 6 + "dependsOn": [], 7 + "outputs": ["dist/**"] 8 + } 9 + } 10 + }
+7
packages/openapi-python-tests/sdks/vitest.setup.ts
··· 1 + import { fileURLToPath } from 'node:url'; 2 + 3 + import { beforeAll } from 'vitest'; 4 + 5 + beforeAll(() => { 6 + process.chdir(fileURLToPath(new URL('.', import.meta.url))); 7 + });
+14
packages/openapi-python-tests/tsconfig.base.json
··· 1 + { 2 + "extends": "../../tsconfig.base.json", 3 + "compilerOptions": { 4 + "declaration": false, 5 + "declarationMap": false, 6 + "noEmit": true, 7 + "noImplicitOverride": true, 8 + "noImplicitReturns": true, 9 + "noUnusedLocals": true, 10 + "noUnusedParameters": true, 11 + "types": ["vitest/globals"], 12 + "useUnknownInCatchVariables": false 13 + } 14 + }
+22
packages/openapi-python-tests/utils.ts
··· 1 + import fs from 'node:fs'; 2 + import path from 'node:path'; 3 + 4 + export const getFilePaths = (dirPath: string): Array<string> => { 5 + let filePaths: Array<string> = []; 6 + const files = fs.readdirSync(dirPath); 7 + 8 + for (const file of files) { 9 + const filePath = path.join(dirPath, file); 10 + const stat = fs.statSync(filePath); 11 + 12 + if (stat.isDirectory()) { 13 + filePaths = filePaths.concat(getFilePaths(filePath)); 14 + } else { 15 + filePaths.push(filePath); 16 + } 17 + } 18 + 19 + return filePaths; 20 + }; 21 + 22 + export const getSpecsPath = (): string => path.join(__dirname, '..', '..', 'specs');
+44 -342
pnpm-lock.yaml
··· 1266 1266 version: 1.8.0 1267 1267 nuxt: 1268 1268 specifier: '>=3.0.0' 1269 - version: 3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.2.1)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(less@4.4.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@3.29.5)(sass@1.97.1)(terser@5.44.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3)) 1269 + version: 3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.2.1)(db0@0.3.2)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@3.29.5)(sass@1.97.1)(terser@5.44.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3)) 1270 1270 vue: 1271 1271 specifier: '>=3.5.13' 1272 1272 version: 3.5.13(typescript@5.9.3) ··· 1321 1321 specifier: 2.8.2 1322 1322 version: 2.8.2 1323 1323 1324 + packages/openapi-python-tests/pydantic/v2: 1325 + devDependencies: 1326 + '@hey-api/openapi-python': 1327 + specifier: workspace:* 1328 + version: link:../../../openapi-python 1329 + typescript: 1330 + specifier: 5.9.3 1331 + version: 5.9.3 1332 + 1333 + packages/openapi-python-tests/sdks: 1334 + devDependencies: 1335 + '@hey-api/openapi-python': 1336 + specifier: workspace:* 1337 + version: link:../../openapi-python 1338 + typescript: 1339 + specifier: 5.9.3 1340 + version: 5.9.3 1341 + 1324 1342 packages/openapi-ts: 1325 1343 dependencies: 1326 1344 '@hey-api/codegen-core': ··· 1377 1395 version: 1.14.3 1378 1396 nuxt: 1379 1397 specifier: 3.14.1592 1380 - version: 3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.2.1)(db0@0.3.2)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.56.0)(sass@1.97.1)(terser@5.44.1)(typescript@5.9.3)(vite@5.4.19(@types/node@25.2.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1))(vue-tsc@3.2.4(typescript@5.9.3)) 1398 + version: 3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.2.1)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.9.2)(less@4.4.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.56.0)(sass@1.97.1)(terser@5.44.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3)) 1381 1399 ofetch: 1382 1400 specifier: 1.5.1 1383 1401 version: 1.5.1 ··· 1491 1509 version: 3.3.2 1492 1510 nuxt: 1493 1511 specifier: 3.14.1592 1494 - version: 3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.2.1)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.9.2)(less@4.4.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.56.0)(sass@1.97.1)(terser@5.44.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3)) 1512 + version: 3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.2.1)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.9.2)(less@4.4.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.56.0)(sass@1.97.1)(terser@5.44.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3)) 1495 1513 ofetch: 1496 1514 specifier: 1.5.1 1497 1515 version: 1.5.1 ··· 15553 15571 dependencies: 15554 15572 '@ampproject/remapping': 2.3.0 15555 15573 '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) 15556 - '@angular-devkit/build-webpack': 0.2101.2(chokidar@5.0.0)(webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.104.1(esbuild@0.27.2)))(webpack@5.104.1(esbuild@0.27.2)) 15574 + '@angular-devkit/build-webpack': 0.2101.2(chokidar@5.0.0)(webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.104.1))(webpack@5.104.1(esbuild@0.27.2)) 15557 15575 '@angular-devkit/core': 21.1.2(chokidar@5.0.0) 15558 15576 '@angular/build': 21.1.2(a73756e6d925d6a2ce3b9f3b3e1fe266) 15559 15577 '@angular/compiler-cli': 21.1.2(@angular/compiler@21.1.2)(typescript@5.9.3) ··· 15603 15621 tslib: 2.8.1 15604 15622 typescript: 5.9.3 15605 15623 webpack: 5.104.1(esbuild@0.27.2) 15606 - webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.104.1(esbuild@0.27.2)) 15607 - webpack-dev-server: 5.2.2(tslib@2.8.1)(webpack@5.104.1(esbuild@0.27.2)) 15624 + webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.104.1) 15625 + webpack-dev-server: 5.2.2(tslib@2.8.1)(webpack@5.104.1) 15608 15626 webpack-merge: 6.0.1 15609 15627 webpack-subresource-integrity: 5.1.0(webpack@5.104.1(esbuild@0.27.2)) 15610 15628 optionalDependencies: ··· 15642 15660 dependencies: 15643 15661 '@ampproject/remapping': 2.3.0 15644 15662 '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) 15645 - '@angular-devkit/build-webpack': 0.2101.2(chokidar@5.0.0)(webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.104.1(esbuild@0.27.2)))(webpack@5.104.1(esbuild@0.27.2)) 15663 + '@angular-devkit/build-webpack': 0.2101.2(chokidar@5.0.0)(webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.104.1))(webpack@5.104.1(esbuild@0.27.2)) 15646 15664 '@angular-devkit/core': 21.1.2(chokidar@5.0.0) 15647 15665 '@angular/build': 21.1.2(13c6cf4e4b76000cae827571b33755bd) 15648 15666 '@angular/compiler-cli': 21.1.2(@angular/compiler@21.1.2)(typescript@5.9.3) ··· 15692 15710 tslib: 2.8.1 15693 15711 typescript: 5.9.3 15694 15712 webpack: 5.104.1(esbuild@0.27.2) 15695 - webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.104.1(esbuild@0.27.2)) 15696 - webpack-dev-server: 5.2.2(tslib@2.8.1)(webpack@5.104.1(esbuild@0.27.2)) 15713 + webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.104.1) 15714 + webpack-dev-server: 5.2.2(tslib@2.8.1)(webpack@5.104.1) 15697 15715 webpack-merge: 6.0.1 15698 15716 webpack-subresource-integrity: 5.1.0(webpack@5.104.1(esbuild@0.27.2)) 15699 15717 optionalDependencies: ··· 15727 15745 - webpack-cli 15728 15746 - yaml 15729 15747 15730 - '@angular-devkit/build-webpack@0.2101.2(chokidar@5.0.0)(webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.104.1(esbuild@0.27.2)))(webpack@5.104.1(esbuild@0.27.2))': 15748 + '@angular-devkit/build-webpack@0.2101.2(chokidar@5.0.0)(webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.104.1))(webpack@5.104.1(esbuild@0.27.2))': 15731 15749 dependencies: 15732 15750 '@angular-devkit/architect': 0.2101.2(chokidar@5.0.0) 15733 15751 rxjs: 7.8.2 15734 15752 webpack: 5.104.1(esbuild@0.27.2) 15735 - webpack-dev-server: 5.2.2(tslib@2.8.1)(webpack@5.104.1(esbuild@0.27.2)) 15753 + webpack-dev-server: 5.2.2(tslib@2.8.1)(webpack@5.104.1) 15736 15754 transitivePeerDependencies: 15737 15755 - chokidar 15738 15756 ··· 19012 19030 19013 19031 '@nuxt/devalue@2.0.2': {} 19014 19032 19015 - '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(vite@5.4.19(@types/node@25.2.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1))': 19016 - dependencies: 19017 - '@nuxt/kit': 3.21.0(magicast@0.3.5) 19018 - '@nuxt/schema': 3.16.2 19019 - execa: 7.2.0 19020 - vite: 5.4.19(@types/node@25.2.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1) 19021 - transitivePeerDependencies: 19022 - - magicast 19023 - 19024 - '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': 19025 - dependencies: 19026 - '@nuxt/kit': 3.21.0(magicast@0.3.5) 19027 - '@nuxt/schema': 3.16.2 19028 - execa: 7.2.0 19029 - vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) 19030 - transitivePeerDependencies: 19031 - - magicast 19032 - 19033 19033 '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': 19034 19034 dependencies: 19035 19035 '@nuxt/kit': 3.21.0(magicast@0.3.5) ··· 19126 19126 - utf-8-validate 19127 19127 - vue 19128 19128 19129 - '@nuxt/devtools@1.7.0(rollup@4.56.0)(vite@5.4.19(@types/node@25.2.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1))(vue@3.5.25(typescript@5.9.3))': 19130 - dependencies: 19131 - '@antfu/utils': 0.7.10 19132 - '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(vite@5.4.19(@types/node@25.2.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)) 19133 - '@nuxt/devtools-wizard': 1.7.0 19134 - '@nuxt/kit': 3.21.0(magicast@0.3.5) 19135 - '@vue/devtools-core': 7.6.8(vite@5.4.19(@types/node@25.2.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1))(vue@3.5.25(typescript@5.9.3)) 19136 - '@vue/devtools-kit': 7.6.8 19137 - birpc: 0.2.19 19138 - consola: 3.4.2 19139 - cronstrue: 2.59.0 19140 - destr: 2.0.5 19141 - error-stack-parser-es: 0.1.5 19142 - execa: 7.2.0 19143 - fast-npm-meta: 0.2.2 19144 - flatted: 3.3.3 19145 - get-port-please: 3.2.0 19146 - hookable: 5.5.3 19147 - image-meta: 0.2.1 19148 - is-installed-globally: 1.0.0 19149 - launch-editor: 2.11.1 19150 - local-pkg: 0.5.1 19151 - magicast: 0.3.5 19152 - nypm: 0.4.1 19153 - ohash: 1.1.6 19154 - pathe: 1.1.2 19155 - perfect-debounce: 1.0.0 19156 - pkg-types: 1.3.1 19157 - rc9: 2.1.2 19158 - scule: 1.3.0 19159 - semver: 7.7.3 19160 - simple-git: 3.28.0 19161 - sirv: 3.0.2 19162 - tinyglobby: 0.2.15 19163 - unimport: 3.14.6(rollup@4.56.0) 19164 - vite: 5.4.19(@types/node@25.2.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1) 19165 - vite-plugin-inspect: 0.8.9(@nuxt/kit@3.21.0(magicast@0.3.5))(rollup@4.56.0)(vite@5.4.19(@types/node@25.2.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)) 19166 - vite-plugin-vue-inspector: 5.3.2(vite@5.4.19(@types/node@25.2.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)) 19167 - which: 3.0.1 19168 - ws: 8.18.3 19169 - transitivePeerDependencies: 19170 - - bufferutil 19171 - - rollup 19172 - - supports-color 19173 - - utf-8-validate 19174 - - vue 19175 - 19176 - '@nuxt/devtools@1.7.0(rollup@4.56.0)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': 19177 - dependencies: 19178 - '@antfu/utils': 0.7.10 19179 - '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) 19180 - '@nuxt/devtools-wizard': 1.7.0 19181 - '@nuxt/kit': 3.21.0(magicast@0.3.5) 19182 - '@vue/devtools-core': 7.6.8(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) 19183 - '@vue/devtools-kit': 7.6.8 19184 - birpc: 0.2.19 19185 - consola: 3.4.2 19186 - cronstrue: 2.59.0 19187 - destr: 2.0.5 19188 - error-stack-parser-es: 0.1.5 19189 - execa: 7.2.0 19190 - fast-npm-meta: 0.2.2 19191 - flatted: 3.3.3 19192 - get-port-please: 3.2.0 19193 - hookable: 5.5.3 19194 - image-meta: 0.2.1 19195 - is-installed-globally: 1.0.0 19196 - launch-editor: 2.11.1 19197 - local-pkg: 0.5.1 19198 - magicast: 0.3.5 19199 - nypm: 0.4.1 19200 - ohash: 1.1.6 19201 - pathe: 1.1.2 19202 - perfect-debounce: 1.0.0 19203 - pkg-types: 1.3.1 19204 - rc9: 2.1.2 19205 - scule: 1.3.0 19206 - semver: 7.7.3 19207 - simple-git: 3.28.0 19208 - sirv: 3.0.2 19209 - tinyglobby: 0.2.15 19210 - unimport: 3.14.6(rollup@4.56.0) 19211 - vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) 19212 - vite-plugin-inspect: 0.8.9(@nuxt/kit@3.21.0(magicast@0.3.5))(rollup@4.56.0)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) 19213 - vite-plugin-vue-inspector: 5.3.2(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) 19214 - which: 3.0.1 19215 - ws: 8.18.3 19216 - transitivePeerDependencies: 19217 - - bufferutil 19218 - - rollup 19219 - - supports-color 19220 - - utf-8-validate 19221 - - vue 19222 - 19223 19129 '@nuxt/devtools@1.7.0(rollup@4.56.0)(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': 19224 19130 dependencies: 19225 19131 '@antfu/utils': 0.7.10 ··· 22634 22540 '@vue/devtools-api@8.0.5': 22635 22541 dependencies: 22636 22542 '@vue/devtools-kit': 8.0.5 22637 - 22638 - '@vue/devtools-core@7.6.8(vite@5.4.19(@types/node@25.2.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1))(vue@3.5.25(typescript@5.9.3))': 22639 - dependencies: 22640 - '@vue/devtools-kit': 7.7.7 22641 - '@vue/devtools-shared': 7.7.7 22642 - mitt: 3.0.1 22643 - nanoid: 5.1.5 22644 - pathe: 1.1.2 22645 - vite-hot-client: 0.2.4(vite@5.4.19(@types/node@25.2.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)) 22646 - vue: 3.5.25(typescript@5.9.3) 22647 - transitivePeerDependencies: 22648 - - vite 22649 - 22650 - '@vue/devtools-core@7.6.8(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': 22651 - dependencies: 22652 - '@vue/devtools-kit': 7.7.7 22653 - '@vue/devtools-shared': 7.7.7 22654 - mitt: 3.0.1 22655 - nanoid: 5.1.5 22656 - pathe: 1.1.2 22657 - vite-hot-client: 0.2.4(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) 22658 - vue: 3.5.25(typescript@5.9.3) 22659 - transitivePeerDependencies: 22660 - - vite 22661 22543 22662 22544 '@vue/devtools-core@7.6.8(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': 22663 22545 dependencies: ··· 27941 27823 27942 27824 nuxi@3.28.0: {} 27943 27825 27944 - nuxt@3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.2.1)(db0@0.3.2)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.56.0)(sass@1.97.1)(terser@5.44.1)(typescript@5.9.3)(vite@5.4.19(@types/node@25.2.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1))(vue-tsc@3.2.4(typescript@5.9.3)): 27826 + nuxt@3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.2.1)(db0@0.3.2)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@3.29.5)(sass@1.97.1)(terser@5.44.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3)): 27945 27827 dependencies: 27946 27828 '@nuxt/devalue': 2.0.2 27947 - '@nuxt/devtools': 1.7.0(rollup@4.56.0)(vite@5.4.19(@types/node@25.2.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1))(vue@3.5.25(typescript@5.9.3)) 27948 - '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.56.0) 27949 - '@nuxt/schema': 3.14.1592(magicast@0.3.5)(rollup@4.56.0) 27829 + '@nuxt/devtools': 1.7.0(rollup@3.29.5)(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) 27830 + '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@3.29.5) 27831 + '@nuxt/schema': 3.14.1592(magicast@0.3.5)(rollup@3.29.5) 27950 27832 '@nuxt/telemetry': 2.6.6(magicast@0.3.5) 27951 - '@nuxt/vite-builder': 3.14.1592(@types/node@25.2.1)(eslint@9.39.1(jiti@2.6.1))(less@4.4.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.56.0)(sass@1.97.1)(terser@5.44.1)(typescript@5.9.3)(vue-tsc@3.2.4(typescript@5.9.3))(vue@3.5.25(typescript@5.9.3)) 27833 + '@nuxt/vite-builder': 3.14.1592(@types/node@25.2.1)(eslint@9.39.2(jiti@2.6.1))(less@4.4.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@3.29.5)(sass@1.97.1)(terser@5.44.1)(typescript@5.9.3)(vue-tsc@3.2.4(typescript@5.9.3))(vue@3.5.25(typescript@5.9.3)) 27952 27834 '@unhead/dom': 1.11.20 27953 27835 '@unhead/shared': 1.11.20 27954 27836 '@unhead/ssr': 1.11.20 ··· 27971 27853 h3: 1.15.4 27972 27854 hookable: 5.5.3 27973 27855 ignore: 6.0.2 27974 - impound: 0.2.2(rollup@4.56.0) 27856 + impound: 0.2.2(rollup@3.29.5) 27975 27857 jiti: 2.6.1 27976 27858 klona: 2.0.6 27977 27859 knitwork: 1.3.0 ··· 27998 27880 unctx: 2.4.1 27999 27881 unenv: 1.10.0 28000 27882 unhead: 1.11.20 28001 - unimport: 3.14.6(rollup@4.56.0) 27883 + unimport: 3.14.6(rollup@3.29.5) 28002 27884 unplugin: 1.16.1 28003 - unplugin-vue-router: 0.10.9(rollup@4.56.0)(vue-router@4.5.0(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3)) 27885 + unplugin-vue-router: 0.10.9(rollup@3.29.5)(vue-router@4.5.0(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3)) 28004 27886 unstorage: 1.17.0(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.7.0) 28005 27887 untyped: 1.5.2 28006 27888 vue: 3.5.25(typescript@5.9.3) 28007 27889 vue-bundle-renderer: 2.1.2 28008 27890 vue-devtools-stub: 0.1.0 28009 - vue-router: 4.5.0(vue@3.5.25(typescript@5.9.3)) 27891 + vue-router: 4.5.0(vue@3.5.13(typescript@5.9.3)) 28010 27892 optionalDependencies: 28011 27893 '@parcel/watcher': 2.5.1 28012 27894 '@types/node': 25.2.1 ··· 28062 27944 - vue-tsc 28063 27945 - xml2js 28064 27946 28065 - nuxt@3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.2.1)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.9.2)(less@4.4.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.56.0)(sass@1.97.1)(terser@5.44.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3)): 27947 + nuxt@3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.2.1)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.9.2)(less@4.4.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.56.0)(sass@1.97.1)(terser@5.44.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3)): 28066 27948 dependencies: 28067 27949 '@nuxt/devalue': 2.0.2 28068 - '@nuxt/devtools': 1.7.0(rollup@4.56.0)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) 27950 + '@nuxt/devtools': 1.7.0(rollup@4.56.0)(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) 28069 27951 '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.56.0) 28070 27952 '@nuxt/schema': 3.14.1592(magicast@0.3.5)(rollup@4.56.0) 28071 27953 '@nuxt/telemetry': 2.6.6(magicast@0.3.5) ··· 28122 28004 unimport: 3.14.6(rollup@4.56.0) 28123 28005 unplugin: 1.16.1 28124 28006 unplugin-vue-router: 0.10.9(rollup@4.56.0)(vue-router@4.5.0(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3)) 28125 - unstorage: 1.17.0(@netlify/blobs@9.1.2)(db0@0.3.4)(ioredis@5.9.2) 28126 - untyped: 1.5.2 28127 - vue: 3.5.25(typescript@5.9.3) 28128 - vue-bundle-renderer: 2.1.2 28129 - vue-devtools-stub: 0.1.0 28130 - vue-router: 4.5.0(vue@3.5.25(typescript@5.9.3)) 28131 - optionalDependencies: 28132 - '@parcel/watcher': 2.5.1 28133 - '@types/node': 25.2.1 28134 - transitivePeerDependencies: 28135 - - '@azure/app-configuration' 28136 - - '@azure/cosmos' 28137 - - '@azure/data-tables' 28138 - - '@azure/identity' 28139 - - '@azure/keyvault-secrets' 28140 - - '@azure/storage-blob' 28141 - - '@biomejs/biome' 28142 - - '@capacitor/preferences' 28143 - - '@deno/kv' 28144 - - '@electric-sql/pglite' 28145 - - '@libsql/client' 28146 - - '@netlify/blobs' 28147 - - '@planetscale/database' 28148 - - '@upstash/redis' 28149 - - '@vercel/blob' 28150 - - '@vercel/functions' 28151 - - '@vercel/kv' 28152 - - aws4fetch 28153 - - better-sqlite3 28154 - - bufferutil 28155 - - db0 28156 - - drizzle-orm 28157 - - encoding 28158 - - eslint 28159 - - idb-keyval 28160 - - ioredis 28161 - - less 28162 - - lightningcss 28163 - - magicast 28164 - - meow 28165 - - mysql2 28166 - - optionator 28167 - - rolldown 28168 - - rollup 28169 - - sass 28170 - - sass-embedded 28171 - - sqlite3 28172 - - stylelint 28173 - - stylus 28174 - - sugarss 28175 - - supports-color 28176 - - terser 28177 - - typescript 28178 - - uploadthing 28179 - - utf-8-validate 28180 - - vite 28181 - - vls 28182 - - vti 28183 - - vue-tsc 28184 - - xml2js 28185 - 28186 - nuxt@3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@25.2.1)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(ioredis@5.9.2)(less@4.4.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@3.29.5)(sass@1.97.1)(terser@5.44.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.2.4(typescript@5.9.3)): 28187 - dependencies: 28188 - '@nuxt/devalue': 2.0.2 28189 - '@nuxt/devtools': 1.7.0(rollup@3.29.5)(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) 28190 - '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@3.29.5) 28191 - '@nuxt/schema': 3.14.1592(magicast@0.3.5)(rollup@3.29.5) 28192 - '@nuxt/telemetry': 2.6.6(magicast@0.3.5) 28193 - '@nuxt/vite-builder': 3.14.1592(@types/node@25.2.1)(eslint@9.39.2(jiti@2.6.1))(less@4.4.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@3.29.5)(sass@1.97.1)(terser@5.44.1)(typescript@5.9.3)(vue-tsc@3.2.4(typescript@5.9.3))(vue@3.5.25(typescript@5.9.3)) 28194 - '@unhead/dom': 1.11.20 28195 - '@unhead/shared': 1.11.20 28196 - '@unhead/ssr': 1.11.20 28197 - '@unhead/vue': 1.11.20(vue@3.5.25(typescript@5.9.3)) 28198 - '@vue/shared': 3.5.25 28199 - acorn: 8.14.0 28200 - c12: 2.0.1(magicast@0.3.5) 28201 - chokidar: 4.0.3 28202 - compatx: 0.1.8 28203 - consola: 3.4.2 28204 - cookie-es: 1.2.2 28205 - defu: 6.1.4 28206 - destr: 2.0.5 28207 - devalue: 5.3.2 28208 - errx: 0.1.0 28209 - esbuild: 0.24.2 28210 - escape-string-regexp: 5.0.0 28211 - estree-walker: 3.0.3 28212 - globby: 14.1.0 28213 - h3: 1.15.4 28214 - hookable: 5.5.3 28215 - ignore: 6.0.2 28216 - impound: 0.2.2(rollup@3.29.5) 28217 - jiti: 2.6.1 28218 - klona: 2.0.6 28219 - knitwork: 1.3.0 28220 - magic-string: 0.30.21 28221 - mlly: 1.8.0 28222 - nanotar: 0.1.1 28223 - nitropack: 2.12.4(@netlify/blobs@9.1.2)(encoding@0.1.13)(rolldown@1.0.0-beta.57) 28224 - nuxi: 3.28.0 28225 - nypm: 0.3.12 28226 - ofetch: 1.5.1 28227 - ohash: 1.1.6 28228 - pathe: 1.1.2 28229 - perfect-debounce: 1.0.0 28230 - pkg-types: 1.3.1 28231 - radix3: 1.1.2 28232 - scule: 1.3.0 28233 - semver: 7.7.3 28234 - std-env: 3.10.0 28235 - strip-literal: 2.1.1 28236 - tinyglobby: 0.2.10 28237 - ufo: 1.6.1 28238 - ultrahtml: 1.6.0 28239 - uncrypto: 0.1.3 28240 - unctx: 2.4.1 28241 - unenv: 1.10.0 28242 - unhead: 1.11.20 28243 - unimport: 3.14.6(rollup@3.29.5) 28244 - unplugin: 1.16.1 28245 - unplugin-vue-router: 0.10.9(rollup@3.29.5)(vue-router@4.5.0(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3)) 28246 28007 unstorage: 1.17.0(@netlify/blobs@9.1.2)(db0@0.3.4)(ioredis@5.9.2) 28247 28008 untyped: 1.5.2 28248 28009 vue: 3.5.25(typescript@5.9.3) ··· 31614 31375 unplugin: 2.0.0-beta.1 31615 31376 yaml: 2.8.2 31616 31377 optionalDependencies: 31617 - vue-router: 4.5.0(vue@3.5.25(typescript@5.9.3)) 31378 + vue-router: 4.5.0(vue@3.5.13(typescript@5.9.3)) 31618 31379 transitivePeerDependencies: 31619 31380 - rollup 31620 31381 - vue ··· 31920 31681 vite: 7.3.1(@types/node@25.2.1)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) 31921 31682 vite-hot-client: 2.1.0(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) 31922 31683 31923 - vite-hot-client@0.2.4(vite@5.4.19(@types/node@25.2.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)): 31924 - dependencies: 31925 - vite: 5.4.19(@types/node@25.2.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1) 31926 - 31927 - vite-hot-client@0.2.4(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): 31928 - dependencies: 31929 - vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) 31930 - 31931 31684 vite-hot-client@0.2.4(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): 31932 31685 dependencies: 31933 31686 vite: 7.3.1(@types/node@25.2.1)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) ··· 32059 31812 - rollup 32060 31813 - supports-color 32061 31814 32062 - vite-plugin-inspect@0.8.9(@nuxt/kit@3.21.0(magicast@0.3.5))(rollup@4.56.0)(vite@5.4.19(@types/node@25.2.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)): 32063 - dependencies: 32064 - '@antfu/utils': 0.7.10 32065 - '@rollup/pluginutils': 5.2.0(rollup@4.56.0) 32066 - debug: 4.4.3 32067 - error-stack-parser-es: 0.1.5 32068 - fs-extra: 11.3.1 32069 - open: 10.2.0 32070 - perfect-debounce: 1.0.0 32071 - picocolors: 1.1.1 32072 - sirv: 3.0.2 32073 - vite: 5.4.19(@types/node@25.2.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1) 32074 - optionalDependencies: 32075 - '@nuxt/kit': 3.21.0(magicast@0.3.5) 32076 - transitivePeerDependencies: 32077 - - rollup 32078 - - supports-color 32079 - 32080 - vite-plugin-inspect@0.8.9(@nuxt/kit@3.21.0(magicast@0.3.5))(rollup@4.56.0)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): 32081 - dependencies: 32082 - '@antfu/utils': 0.7.10 32083 - '@rollup/pluginutils': 5.2.0(rollup@4.56.0) 32084 - debug: 4.4.3 32085 - error-stack-parser-es: 0.1.5 32086 - fs-extra: 11.3.1 32087 - open: 10.2.0 32088 - perfect-debounce: 1.0.0 32089 - picocolors: 1.1.1 32090 - sirv: 3.0.2 32091 - vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) 32092 - optionalDependencies: 32093 - '@nuxt/kit': 3.21.0(magicast@0.3.5) 32094 - transitivePeerDependencies: 32095 - - rollup 32096 - - supports-color 32097 - 32098 31815 vite-plugin-inspect@0.8.9(@nuxt/kit@3.21.0(magicast@0.3.5))(rollup@4.56.0)(vite@7.3.1(@types/node@25.2.1)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): 32099 31816 dependencies: 32100 31817 '@antfu/utils': 0.7.10 ··· 32159 31876 - '@nuxt/kit' 32160 31877 - supports-color 32161 31878 - vue 32162 - 32163 - vite-plugin-vue-inspector@5.3.2(vite@5.4.19(@types/node@25.2.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)): 32164 - dependencies: 32165 - '@babel/core': 7.28.3 32166 - '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.3) 32167 - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.3) 32168 - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.3) 32169 - '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.3) 32170 - '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.3) 32171 - '@vue/compiler-dom': 3.5.25 32172 - kolorist: 1.8.0 32173 - magic-string: 0.30.21 32174 - vite: 5.4.19(@types/node@25.2.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1) 32175 - transitivePeerDependencies: 32176 - - supports-color 32177 31879 32178 31880 vite-plugin-vue-inspector@5.3.2(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): 32179 31881 dependencies: ··· 32635 32337 32636 32338 webidl-conversions@8.0.1: {} 32637 32339 32638 - webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.104.1(esbuild@0.27.2)): 32340 + webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.104.1): 32639 32341 dependencies: 32640 32342 colorette: 2.0.20 32641 32343 memfs: 4.56.10(tslib@2.8.1) ··· 32648 32350 transitivePeerDependencies: 32649 32351 - tslib 32650 32352 32651 - webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.104.1(esbuild@0.27.2)): 32353 + webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.104.1): 32652 32354 dependencies: 32653 32355 '@types/bonjour': 3.5.13 32654 32356 '@types/connect-history-api-fallback': 1.5.4 ··· 32676 32378 serve-index: 1.9.1 32677 32379 sockjs: 0.3.24 32678 32380 spdy: 4.0.2 32679 - webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.104.1(esbuild@0.27.2)) 32381 + webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.104.1) 32680 32382 ws: 8.18.3 32681 32383 optionalDependencies: 32682 32384 webpack: 5.104.1(esbuild@0.27.2)
+16
vitest.config.ts
··· 84 84 { 85 85 extends: true, 86 86 test: { 87 + name: '@test/openapi-python-sdks', 88 + root: 'packages/openapi-python-tests/sdks', 89 + setupFiles: ['./vitest.setup.ts'], 90 + }, 91 + }, 92 + { 93 + extends: true, 94 + test: { 95 + name: '@test/openapi-python-pydantic-v2', 96 + root: 'packages/openapi-python-tests/pydantic/v2', 97 + setupFiles: ['./vitest.setup.ts'], 98 + }, 99 + }, 100 + { 101 + extends: true, 102 + test: { 87 103 name: '@hey-api/custom-client', 88 104 root: 'packages/custom-client', 89 105 },