pipecatcloud 1.0.0__tar.gz → 1.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/CHANGELOG.md +16 -0
  2. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/CLAUDE.md +1 -1
  3. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/PKG-INFO +4 -4
  4. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/README.md +2 -2
  5. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/pyproject.toml +1 -1
  6. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/_utils/console_utils.py +1 -1
  7. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/commands/deploy.py +11 -9
  8. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/commands/secrets.py +1 -1
  9. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud.egg-info/PKG-INFO +4 -4
  10. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud.egg-info/SOURCES.txt +3 -0
  11. pipecatcloud-1.0.1/src/pipecatcloud.egg-info/scm_file_list.json +70 -0
  12. pipecatcloud-1.0.1/src/pipecatcloud.egg-info/scm_version.json +8 -0
  13. pipecatcloud-1.0.1/tests/test_deploy_image_pull_secret.py +114 -0
  14. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/uv.lock +137 -3
  15. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/.claude/settings.json +0 -0
  16. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/.github/workflows/format.yml +0 -0
  17. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/.github/workflows/publish-pypi.yml +0 -0
  18. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/.github/workflows/publish-test.yml +0 -0
  19. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/.github/workflows/python-compatibility.yml +0 -0
  20. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/.github/workflows/tests.yml +0 -0
  21. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/.gitignore +0 -0
  22. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/.pre-commit-config.yaml +0 -0
  23. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/LICENSE +0 -0
  24. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/pipecat-cloud.png +0 -0
  25. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/pytest.ini +0 -0
  26. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/scripts/fix-ruff.sh +0 -0
  27. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/setup.cfg +0 -0
  28. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/__init__.py +0 -0
  29. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/__version__.py +0 -0
  30. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/_utils/__init__.py +0 -0
  31. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/_utils/async_utils.py +0 -0
  32. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/_utils/auth_utils.py +0 -0
  33. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/_utils/build_utils.py +0 -0
  34. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/_utils/deploy_utils.py +0 -0
  35. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/_utils/regions.py +0 -0
  36. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/agent.py +0 -0
  37. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/api.py +0 -0
  38. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/__init__.py +0 -0
  39. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/api.py +0 -0
  40. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/commands/__init__.py +0 -0
  41. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/commands/agent.py +0 -0
  42. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/commands/auth.py +0 -0
  43. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/commands/build.py +0 -0
  44. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/commands/docker.py +0 -0
  45. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/commands/organizations.py +0 -0
  46. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/commands/regions.py +0 -0
  47. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/commands/spend_limit.py +0 -0
  48. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/config.py +0 -0
  49. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/cli/entry_point.py +0 -0
  50. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/config.py +0 -0
  51. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/constants.py +0 -0
  52. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/exception.py +0 -0
  53. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/py.typed +0 -0
  54. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/session.py +0 -0
  55. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud/smallwebrtc/session_manager.py +0 -0
  56. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud.egg-info/dependency_links.txt +0 -0
  57. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud.egg-info/entry_points.txt +0 -0
  58. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud.egg-info/requires.txt +0 -0
  59. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/src/pipecatcloud.egg-info/top_level.txt +0 -0
  60. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/tests/__init__.py +0 -0
  61. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/tests/conftest.py +0 -0
  62. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/tests/test_agent_args.py +0 -0
  63. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/tests/test_agent_sessions.py +0 -0
  64. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/tests/test_agent_stop.py +0 -0
  65. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/tests/test_api_client.py +0 -0
  66. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/tests/test_auth.py +0 -0
  67. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/tests/test_build_utils.py +0 -0
  68. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/tests/test_config_file.py +0 -0
  69. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/tests/test_deploy_poll.py +0 -0
  70. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/tests/test_deployment_status.py +0 -0
  71. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/tests/test_docker_commands.py +0 -0
  72. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/tests/test_krisp_viva.py +0 -0
  73. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/tests/test_max_session_duration.py +0 -0
  74. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/tests/test_pat_auth.py +0 -0
  75. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/tests/test_regions.py +0 -0
  76. {pipecatcloud-1.0.0 → pipecatcloud-1.0.1}/tests/test_spend_limit.py +0 -0
@@ -5,6 +5,22 @@ All notable changes to **Pipecat Cloud** will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.0.1] - 2026-07-13
9
+
10
+ ### Fixed
11
+
12
+ - `pipecat cloud deploy` now verifies the image pull secret passed via
13
+ `--credentials` by looking it up in the secrets list, matching on both name
14
+ and type. Previously the check misread an API error response as "secret
15
+ exists", and a regular secret set with the same name also passed. A deploy
16
+ referencing a missing image pull secret now aborts with a clear error
17
+ instead of proceeding.
18
+
19
+ - Documentation links in CLI output now point to `docs.pipecat.ai` instead of
20
+ the retired `docs.pipecat.daily.co` domain. API error panels link directly
21
+ to the matching entry in the error codes reference, and the deploy and
22
+ image pull secret prompts link to the image pull secrets guide.
23
+
8
24
  ## [1.0.0] - 2026-06-19
9
25
 
10
26
  ### Added
@@ -8,7 +8,7 @@ Guidance for Claude Code working in this repo.
8
8
 
9
9
  - Package root: `src/pipecatcloud/`
10
10
  - CLI: registered as a Pipecat CLI extension via the `pipecat_cli.extensions:cloud` entry point (surfaced as `pipecat cloud`). There is no standalone entry point — no `[project.scripts]` and no `__main__`; the CLI runs only through the Pipecat CLI.
11
- - Public docs: https://docs.pipecat.daily.co
11
+ - Public docs: https://docs.pipecat.ai/pipecat-cloud
12
12
 
13
13
  ## Toolchain
14
14
 
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pipecatcloud
3
- Version: 1.0.0
3
+ Version: 1.0.1
4
4
  Summary: Cloud hosting for Pipecat AI applications
5
5
  License: BSD 2-Clause License
6
- Project-URL: Website, https://docs.pipecat.daily.co/
6
+ Project-URL: Website, https://docs.pipecat.ai/pipecat-cloud
7
7
  Keywords: pipecat,pipecat-ai,voice,ai,llm
8
8
  Requires-Python: >=3.11
9
9
  Description-Content-Type: text/markdown
@@ -25,7 +25,7 @@ Dynamic: license-file
25
25
  <img alt="pipecat cloud" width="500px" height="auto" src="https://raw.githubusercontent.com/daily-co/pipecat-cloud/main/pipecat-cloud.png">
26
26
  </div></h1>
27
27
 
28
- [![Docs](https://img.shields.io/badge/documentation-blue)](https://docs.pipecat.daily.co)
28
+ [![Docs](https://img.shields.io/badge/documentation-blue)](https://docs.pipecat.ai/pipecat-cloud)
29
29
  [![PyPI](https://img.shields.io/pypi/v/pipecatcloud)](https://pypi.org/project/pipecatcloud)
30
30
 
31
31
  # Pipecat Cloud
@@ -41,7 +41,7 @@ Python module and CLI for interacting with [Pipecat Cloud](https://pipecat.daily
41
41
 
42
42
  ### Documentation
43
43
 
44
- Documentation for Pipecat Cloud is available [here](https://docs.pipecat.daily.co).
44
+ Documentation for Pipecat Cloud is available [here](https://docs.pipecat.ai/pipecat-cloud).
45
45
 
46
46
  ### Installation
47
47
 
@@ -2,7 +2,7 @@
2
2
  <img alt="pipecat cloud" width="500px" height="auto" src="https://raw.githubusercontent.com/daily-co/pipecat-cloud/main/pipecat-cloud.png">
3
3
  </div></h1>
4
4
 
5
- [![Docs](https://img.shields.io/badge/documentation-blue)](https://docs.pipecat.daily.co)
5
+ [![Docs](https://img.shields.io/badge/documentation-blue)](https://docs.pipecat.ai/pipecat-cloud)
6
6
  [![PyPI](https://img.shields.io/pypi/v/pipecatcloud)](https://pypi.org/project/pipecatcloud)
7
7
 
8
8
  # Pipecat Cloud
@@ -18,7 +18,7 @@ Python module and CLI for interacting with [Pipecat Cloud](https://pipecat.daily
18
18
 
19
19
  ### Documentation
20
20
 
21
- Documentation for Pipecat Cloud is available [here](https://docs.pipecat.daily.co).
21
+ Documentation for Pipecat Cloud is available [here](https://docs.pipecat.ai/pipecat-cloud).
22
22
 
23
23
  ### Installation
24
24
 
@@ -77,7 +77,7 @@ select = [
77
77
  "**/__init__.py" = ["D104"]
78
78
 
79
79
  [project.urls]
80
- Website = "https://docs.pipecat.daily.co/"
80
+ Website = "https://docs.pipecat.ai/pipecat-cloud"
81
81
 
82
82
  [tool.setuptools_scm]
83
83
  local_scheme = "no-local-version"
@@ -116,7 +116,7 @@ class PipecatConsole(Console):
116
116
  Panel(
117
117
  f"[red]{title}[/red]\n\n[dim]Error message:[/dim]\n{error_message}",
118
118
  title=f"[bold red]{PANEL_TITLE_ERROR}{f' - {code}' if code else ''}[/bold red]",
119
- subtitle=f"[dim]Docs: https://docs.pipecat.daily.co/agents/error-codes#{code}[/dim]"
119
+ subtitle=f"[dim]Docs: https://docs.pipecat.ai/pipecat-cloud/fundamentals/error-codes#{str(code).lower()}[/dim]"
120
120
  if not hide_subtitle and code
121
121
  else None,
122
122
  title_align="left",
@@ -332,22 +332,24 @@ async def _deploy(params: DeployConfigParams, org, force: bool = False):
332
332
  f"[dim]Verifying image pull secret {params.image_credentials} exists...[/dim]"
333
333
  )
334
334
  )
335
- creds_exist, error = await API.bubble_error().secrets_list(
336
- secret_set=params.image_credentials, org=org, live=live
337
- )
335
+ sets, error = await API.secrets_list(org=org, live=live)
338
336
 
339
337
  if error:
340
- if error.get("code") == "400":
341
- creds_exist = True
342
- else:
343
- API.print_error()
344
- return typer.Exit()
338
+ return typer.Exit()
339
+
340
+ # Image pull secrets are globally unique by name (region is validated
341
+ # server-side at deploy), so match on name + type without region filter.
342
+ creds_exist = any(
343
+ s.get("name") == params.image_credentials and s.get("type") == "imagePullSecret"
344
+ for s in (sets or [])
345
+ )
345
346
 
346
347
  if not creds_exist:
347
348
  live.stop()
348
349
  console.error(
349
350
  f"Image pull secret with name [bold]'{params.image_credentials}'[/bold] not found in namespace [bold]'{org}'[/bold]"
350
351
  )
352
+ return typer.Exit()
351
353
 
352
354
  live.update(
353
355
  console.status(
@@ -775,7 +777,7 @@ def create_deploy_command(app: typer.Typer):
775
777
  console.error(
776
778
  "Deployments require an image pull secret [bold](--credentials)[/bold] to securely pull images from private repositories."
777
779
  "\nPlease provide an image pull secret name or use [bold][--no-credentials][/bold] to deploy without one.",
778
- subtitle="Learn more:https://docs.pipecat.daily.co/agents/secrets#image-pull-secrets",
780
+ subtitle="Learn more: https://docs.pipecat.ai/pipecat-cloud/fundamentals/secrets#image-pull-secrets",
779
781
  title_extra="Attempt to deploy without repository credentials",
780
782
  )
781
783
  return typer.Exit()
@@ -567,7 +567,7 @@ async def image_pull_secret(
567
567
  if not credentials:
568
568
  console.print(
569
569
  "[cyan]For more information about image pull secrets, see: "
570
- "https://docs.pipecat.daily.co/agents/secrets#image-pull-secrets[/cyan]\n"
570
+ "https://docs.pipecat.ai/pipecat-cloud/fundamentals/secrets#image-pull-secrets[/cyan]\n"
571
571
  )
572
572
  username = await questionary.text(f"Username for image repository '{host}'").ask_async()
573
573
  password = await questionary.password(
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pipecatcloud
3
- Version: 1.0.0
3
+ Version: 1.0.1
4
4
  Summary: Cloud hosting for Pipecat AI applications
5
5
  License: BSD 2-Clause License
6
- Project-URL: Website, https://docs.pipecat.daily.co/
6
+ Project-URL: Website, https://docs.pipecat.ai/pipecat-cloud
7
7
  Keywords: pipecat,pipecat-ai,voice,ai,llm
8
8
  Requires-Python: >=3.11
9
9
  Description-Content-Type: text/markdown
@@ -25,7 +25,7 @@ Dynamic: license-file
25
25
  <img alt="pipecat cloud" width="500px" height="auto" src="https://raw.githubusercontent.com/daily-co/pipecat-cloud/main/pipecat-cloud.png">
26
26
  </div></h1>
27
27
 
28
- [![Docs](https://img.shields.io/badge/documentation-blue)](https://docs.pipecat.daily.co)
28
+ [![Docs](https://img.shields.io/badge/documentation-blue)](https://docs.pipecat.ai/pipecat-cloud)
29
29
  [![PyPI](https://img.shields.io/pypi/v/pipecatcloud)](https://pypi.org/project/pipecatcloud)
30
30
 
31
31
  # Pipecat Cloud
@@ -41,7 +41,7 @@ Python module and CLI for interacting with [Pipecat Cloud](https://pipecat.daily
41
41
 
42
42
  ### Documentation
43
43
 
44
- Documentation for Pipecat Cloud is available [here](https://docs.pipecat.daily.co).
44
+ Documentation for Pipecat Cloud is available [here](https://docs.pipecat.ai/pipecat-cloud).
45
45
 
46
46
  ### Installation
47
47
 
@@ -29,6 +29,8 @@ src/pipecatcloud.egg-info/SOURCES.txt
29
29
  src/pipecatcloud.egg-info/dependency_links.txt
30
30
  src/pipecatcloud.egg-info/entry_points.txt
31
31
  src/pipecatcloud.egg-info/requires.txt
32
+ src/pipecatcloud.egg-info/scm_file_list.json
33
+ src/pipecatcloud.egg-info/scm_version.json
32
34
  src/pipecatcloud.egg-info/top_level.txt
33
35
  src/pipecatcloud/_utils/__init__.py
34
36
  src/pipecatcloud/_utils/async_utils.py
@@ -61,6 +63,7 @@ tests/test_api_client.py
61
63
  tests/test_auth.py
62
64
  tests/test_build_utils.py
63
65
  tests/test_config_file.py
66
+ tests/test_deploy_image_pull_secret.py
64
67
  tests/test_deploy_poll.py
65
68
  tests/test_deployment_status.py
66
69
  tests/test_docker_commands.py
@@ -0,0 +1,70 @@
1
+ {
2
+ "files": [
3
+ "pipecat-cloud.png",
4
+ ".pre-commit-config.yaml",
5
+ "README.md",
6
+ "uv.lock",
7
+ "LICENSE",
8
+ "pyproject.toml",
9
+ "CHANGELOG.md",
10
+ "CLAUDE.md",
11
+ ".gitignore",
12
+ "pytest.ini",
13
+ "scripts/fix-ruff.sh",
14
+ "src/pipecatcloud/agent.py",
15
+ "src/pipecatcloud/py.typed",
16
+ "src/pipecatcloud/__init__.py",
17
+ "src/pipecatcloud/session.py",
18
+ "src/pipecatcloud/config.py",
19
+ "src/pipecatcloud/exception.py",
20
+ "src/pipecatcloud/api.py",
21
+ "src/pipecatcloud/constants.py",
22
+ "src/pipecatcloud/__version__.py",
23
+ "src/pipecatcloud/smallwebrtc/session_manager.py",
24
+ "src/pipecatcloud/_utils/__init__.py",
25
+ "src/pipecatcloud/_utils/build_utils.py",
26
+ "src/pipecatcloud/_utils/console_utils.py",
27
+ "src/pipecatcloud/_utils/deploy_utils.py",
28
+ "src/pipecatcloud/_utils/regions.py",
29
+ "src/pipecatcloud/_utils/auth_utils.py",
30
+ "src/pipecatcloud/_utils/async_utils.py",
31
+ "src/pipecatcloud/cli/__init__.py",
32
+ "src/pipecatcloud/cli/config.py",
33
+ "src/pipecatcloud/cli/entry_point.py",
34
+ "src/pipecatcloud/cli/api.py",
35
+ "src/pipecatcloud/cli/commands/agent.py",
36
+ "src/pipecatcloud/cli/commands/__init__.py",
37
+ "src/pipecatcloud/cli/commands/organizations.py",
38
+ "src/pipecatcloud/cli/commands/build.py",
39
+ "src/pipecatcloud/cli/commands/secrets.py",
40
+ "src/pipecatcloud/cli/commands/auth.py",
41
+ "src/pipecatcloud/cli/commands/docker.py",
42
+ "src/pipecatcloud/cli/commands/regions.py",
43
+ "src/pipecatcloud/cli/commands/spend_limit.py",
44
+ "src/pipecatcloud/cli/commands/deploy.py",
45
+ ".claude/settings.json",
46
+ "tests/test_agent_stop.py",
47
+ "tests/test_deploy_poll.py",
48
+ "tests/__init__.py",
49
+ "tests/test_docker_commands.py",
50
+ "tests/test_api_client.py",
51
+ "tests/test_config_file.py",
52
+ "tests/test_deployment_status.py",
53
+ "tests/test_spend_limit.py",
54
+ "tests/test_auth.py",
55
+ "tests/test_agent_args.py",
56
+ "tests/test_agent_sessions.py",
57
+ "tests/test_max_session_duration.py",
58
+ "tests/test_regions.py",
59
+ "tests/conftest.py",
60
+ "tests/test_krisp_viva.py",
61
+ "tests/test_build_utils.py",
62
+ "tests/test_deploy_image_pull_secret.py",
63
+ "tests/test_pat_auth.py",
64
+ ".github/workflows/publish-test.yml",
65
+ ".github/workflows/python-compatibility.yml",
66
+ ".github/workflows/format.yml",
67
+ ".github/workflows/tests.yml",
68
+ ".github/workflows/publish-pypi.yml"
69
+ ]
70
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "1.0.1",
3
+ "distance": 0,
4
+ "node": "gfdb472350139c1c543ea32a5fa26683a3fa5ed9b",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-07-13"
8
+ }
@@ -0,0 +1,114 @@
1
+ """
2
+ Regression tests for the image pull secret existence check in `pcc deploy`.
3
+
4
+ PCC-195: the deploy command used to verify an image pull secret by calling the
5
+ per-set secrets GET endpoint and treating its HTTP 400 as "exists". That hack
6
+ also passed a regular (non-image-pull) secret that happened to share the name,
7
+ and the "not found" branch never actually aborted the deploy. The check now
8
+ lists secret sets and matches on name + type == "imagePullSecret", aborting when
9
+ no match is found.
10
+ """
11
+
12
+ import sys
13
+ from pathlib import Path
14
+ from unittest.mock import AsyncMock, patch
15
+
16
+ import pytest
17
+ import typer
18
+
19
+ # Import from source, not installed package
20
+ sys.path.insert(0, str(Path(__file__).parent.parent / "src"))
21
+
22
+ from pipecatcloud._utils.deploy_utils import DeployConfigParams
23
+ from pipecatcloud.cli.commands.deploy import _deploy
24
+
25
+
26
+ def _make_params():
27
+ return DeployConfigParams(
28
+ agent_name="test-agent",
29
+ image="test:latest",
30
+ image_credentials="mycreds",
31
+ )
32
+
33
+
34
+ @pytest.fixture
35
+ def deploy_mocks():
36
+ """Patch the external collaborators of the CLI `_deploy` flow.
37
+
38
+ `console` and `Live` are stubbed so nothing renders; `API.agent` reports no
39
+ existing deployment (so no confirmation prompt), and `API.deploy` returns an
40
+ error to halt the flow immediately after the image pull secret guard.
41
+ """
42
+ with (
43
+ patch("pipecatcloud.cli.commands.deploy.API") as mock_api,
44
+ patch("pipecatcloud.cli.commands.deploy.Live"),
45
+ patch("pipecatcloud.cli.commands.deploy.console"),
46
+ ):
47
+ mock_api.agent = AsyncMock(return_value=(None, None))
48
+ mock_api.deploy = AsyncMock(return_value=(None, {"code": "stop"}))
49
+ yield mock_api
50
+
51
+
52
+ @pytest.mark.asyncio
53
+ async def test_matching_image_pull_secret_passes_guard(deploy_mocks):
54
+ """A set with matching name and type 'imagePullSecret' lets the deploy proceed."""
55
+ # Arrange
56
+ deploy_mocks.secrets_list = AsyncMock(
57
+ return_value=(
58
+ [{"name": "mycreds", "type": "imagePullSecret", "region": "us-west-2"}],
59
+ None,
60
+ )
61
+ )
62
+
63
+ # Act
64
+ await _deploy(_make_params(), "test-org", force=True)
65
+
66
+ # Assert: guard passed, so deployment was attempted
67
+ deploy_mocks.deploy.assert_awaited_once()
68
+
69
+
70
+ @pytest.mark.asyncio
71
+ async def test_same_name_wrong_type_is_rejected(deploy_mocks):
72
+ """A regular secret sharing the name must NOT satisfy the image pull check (PCC-195)."""
73
+ # Arrange
74
+ deploy_mocks.secrets_list = AsyncMock(
75
+ return_value=(
76
+ [{"name": "mycreds", "type": "secret", "region": "us-west-2"}],
77
+ None,
78
+ )
79
+ )
80
+
81
+ # Act
82
+ result = await _deploy(_make_params(), "test-org", force=True)
83
+
84
+ # Assert: aborted before attempting deployment
85
+ assert isinstance(result, typer.Exit)
86
+ deploy_mocks.deploy.assert_not_awaited()
87
+
88
+
89
+ @pytest.mark.asyncio
90
+ async def test_missing_secret_is_rejected(deploy_mocks):
91
+ """No matching set aborts the deploy before calling API.deploy."""
92
+ # Arrange
93
+ deploy_mocks.secrets_list = AsyncMock(return_value=([], None))
94
+
95
+ # Act
96
+ result = await _deploy(_make_params(), "test-org", force=True)
97
+
98
+ # Assert
99
+ assert isinstance(result, typer.Exit)
100
+ deploy_mocks.deploy.assert_not_awaited()
101
+
102
+
103
+ @pytest.mark.asyncio
104
+ async def test_secrets_list_error_aborts(deploy_mocks):
105
+ """An error while listing secrets aborts the deploy."""
106
+ # Arrange
107
+ deploy_mocks.secrets_list = AsyncMock(return_value=(None, {"code": "500"}))
108
+
109
+ # Act
110
+ result = await _deploy(_make_params(), "test-org", force=True)
111
+
112
+ # Assert
113
+ assert isinstance(result, typer.Exit)
114
+ deploy_mocks.deploy.assert_not_awaited()
@@ -322,6 +322,12 @@ wheels = [
322
322
  { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" },
323
323
  ]
324
324
 
325
+ [[package]]
326
+ name = "docopt"
327
+ version = "0.6.2"
328
+ source = { registry = "https://pypi.org/simple" }
329
+ sdist = { url = "https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491", size = 25901, upload-time = "2014-06-16T11:18:57.406Z" }
330
+
325
331
  [[package]]
326
332
  name = "docstring-parser"
327
333
  version = "0.17.0"
@@ -952,6 +958,18 @@ wheels = [
952
958
  { url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload-time = "2025-12-20T14:08:52.782Z" },
953
959
  ]
954
960
 
961
+ [[package]]
962
+ name = "num2words"
963
+ version = "0.5.14"
964
+ source = { registry = "https://pypi.org/simple" }
965
+ dependencies = [
966
+ { name = "docopt" },
967
+ ]
968
+ sdist = { url = "https://files.pythonhosted.org/packages/f6/58/ad645bd38b4b648eb2fc2ba1b909398e54eb0cbb6a7dbd2b4953e38c9621/num2words-0.5.14.tar.gz", hash = "sha256:b066ec18e56b6616a3b38086b5747daafbaa8868b226a36127e0451c0cf379c6", size = 218213, upload-time = "2024-12-17T20:17:10.191Z" }
969
+ wheels = [
970
+ { url = "https://files.pythonhosted.org/packages/d6/5b/545e9267a1cc080c8a1be2746113a063e34bcdd0f5173fd665a5c13cb234/num2words-0.5.14-py3-none-any.whl", hash = "sha256:1c8e5b00142fc2966fd8d685001e36c4a9911e070d1b120e1beb721fa1edb33d", size = 163525, upload-time = "2024-12-17T20:17:06.074Z" },
971
+ ]
972
+
955
973
  [[package]]
956
974
  name = "numba"
957
975
  version = "0.65.1"
@@ -1218,7 +1236,7 @@ wheels = [
1218
1236
 
1219
1237
  [[package]]
1220
1238
  name = "pipecat-ai"
1221
- version = "1.3.0"
1239
+ version = "1.5.0"
1222
1240
  source = { registry = "https://pypi.org/simple" }
1223
1241
  dependencies = [
1224
1242
  { name = "aiofiles" },
@@ -1228,6 +1246,7 @@ dependencies = [
1228
1246
  { name = "loguru" },
1229
1247
  { name = "markdown" },
1230
1248
  { name = "nltk" },
1249
+ { name = "num2words" },
1231
1250
  { name = "numba" },
1232
1251
  { name = "numpy" },
1233
1252
  { name = "onnxruntime" },
@@ -1236,13 +1255,17 @@ dependencies = [
1236
1255
  { name = "protobuf" },
1237
1256
  { name = "pydantic" },
1238
1257
  { name = "pyloudnorm" },
1258
+ { name = "pyyaml" },
1259
+ { name = "pyyaml-include" },
1239
1260
  { name = "resampy" },
1240
1261
  { name = "soxr" },
1262
+ { name = "typing-extensions" },
1241
1263
  { name = "wait-for2", marker = "python_full_version < '3.12'" },
1264
+ { name = "websockets" },
1242
1265
  ]
1243
- sdist = { url = "https://files.pythonhosted.org/packages/92/cc/8352e30c47ee4fd075b9a0f3d91183294582578f07289180a30fc8228409/pipecat_ai-1.3.0.tar.gz", hash = "sha256:abeb9d95b1df2f35b855334cda1899fc603124d5448967c82ba08a94c604318f", size = 11260868, upload-time = "2026-05-29T01:03:00.532Z" }
1266
+ sdist = { url = "https://files.pythonhosted.org/packages/e3/59/7b46ccbeb7c8f68083d0bc1ef39583e78938c6e65af1ff6f707051ea0948/pipecat_ai-1.5.0.tar.gz", hash = "sha256:df9bd5c3176076d425ffba3d510e0122d055b97c9ba8ad35a4390073eb421e18", size = 11624719, upload-time = "2026-07-04T17:11:50.441Z" }
1244
1267
  wheels = [
1245
- { url = "https://files.pythonhosted.org/packages/b6/73/fff17b48cd254ad1c358d612ce92fcc342838e0fc43cc235aca3c70527fb/pipecat_ai-1.3.0-py3-none-any.whl", hash = "sha256:59d4950a61a0a201cf551354d8cdec038c1bdf457df080cd41d29d7ff53e0b2e", size = 10905336, upload-time = "2026-05-29T01:02:57.764Z" },
1268
+ { url = "https://files.pythonhosted.org/packages/41/05/c7daebbf0fc59fd6106e34e52a255727443c1db49d046f7ed0bd9dcb6e4e/pipecat_ai-1.5.0-py3-none-any.whl", hash = "sha256:6089ac7ec418b310975c9c16dd472c16f99838810aae707d669b4f6f5981cf8a", size = 11264890, upload-time = "2026-07-04T17:11:47.677Z" },
1246
1269
  ]
1247
1270
 
1248
1271
  [[package]]
@@ -1717,6 +1740,18 @@ wheels = [
1717
1740
  { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" },
1718
1741
  ]
1719
1742
 
1743
+ [[package]]
1744
+ name = "pyyaml-include"
1745
+ version = "1.4.1"
1746
+ source = { registry = "https://pypi.org/simple" }
1747
+ dependencies = [
1748
+ { name = "pyyaml" },
1749
+ ]
1750
+ sdist = { url = "https://files.pythonhosted.org/packages/7f/be/2d07ad85e3d593d69640876a8686eae2c533db8cb7bf298d25c421b4d2d5/pyyaml-include-1.4.1.tar.gz", hash = "sha256:1a96e33a99a3e56235f5221273832464025f02ff3d8539309a3bf00dec624471", size = 20592, upload-time = "2024-03-25T14:56:43.748Z" }
1751
+ wheels = [
1752
+ { url = "https://files.pythonhosted.org/packages/d5/ca/6a2cc3a73170d10b5af1f1613baa2ed1f8f46f62dd0bfab2bffd2c2fe260/pyyaml_include-1.4.1-py3-none-any.whl", hash = "sha256:323c7f3a19c82fbc4d73abbaab7ef4f793e146a13383866831631b26ccc7fb00", size = 19079, upload-time = "2024-03-25T14:56:41.274Z" },
1753
+ ]
1754
+
1720
1755
  [[package]]
1721
1756
  name = "questionary"
1722
1757
  version = "2.1.1"
@@ -2161,6 +2196,105 @@ wheels = [
2161
2196
  { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" },
2162
2197
  ]
2163
2198
 
2199
+ [[package]]
2200
+ name = "websockets"
2201
+ version = "16.1"
2202
+ source = { registry = "https://pypi.org/simple" }
2203
+ sdist = { url = "https://files.pythonhosted.org/packages/8c/02/b9a097e1e16fee4e2fd1ec8c39f6a9c5d6257bae8fa12640caf869f54436/websockets-16.1.tar.gz", hash = "sha256:299468cbe42e2b9981134c7c51d99387d8a7bf562b00183b3eec53f882846dad", size = 182530, upload-time = "2026-07-10T06:32:57.734Z" }
2204
+ wheels = [
2205
+ { url = "https://files.pythonhosted.org/packages/9e/13/d47429afcc2c28616c32640009c84ea3f95660dab805766345b9682468e0/websockets-16.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a9b1d7a63cba8e6b9b77e499a81eab29d31100298d090ad4507d1048c0b9cae0", size = 179770, upload-time = "2026-07-10T06:30:46.308Z" },
2206
+ { url = "https://files.pythonhosted.org/packages/6f/c7/2f0a722039a1e0107be73ed672ba604449b4956e48733e8e6b8a005aea42/websockets-16.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bedbc5efeb96621aa2921d2d92608246691399418cac22acba427eb11877ea1f", size = 177455, upload-time = "2026-07-10T06:30:47.601Z" },
2207
+ { url = "https://files.pythonhosted.org/packages/43/6a/c26b0ae449e93d256ce5cdd50d5fe97b575a63e8dcd311a1faa972fd6bc6/websockets-16.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fd847ab82133015afe65d778e7966ab42dba16bd7ad2e5b8a7918db6539f3f94", size = 177731, upload-time = "2026-07-10T06:30:49.102Z" },
2208
+ { url = "https://files.pythonhosted.org/packages/cc/3f/381550b344a02f0d2f84cda25e79b54575291bc7022128a41163fe8ba5b0/websockets-16.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e2fb33ccb16ee40a95cc676d7b0ff451a9a2632f11a0dbc2e666326892b2e1de", size = 187066, upload-time = "2026-07-10T06:30:50.505Z" },
2209
+ { url = "https://files.pythonhosted.org/packages/4a/87/5ab1ec2086910f23cfb9ec0c1c29fbcc24a9d190b5198b1557c00ce4a47e/websockets-16.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f15b6d9ea9c2eaf6ccab964a082b09bfa6634a495bb0c2e9e7ee6943f58976", size = 188301, upload-time = "2026-07-10T06:30:51.835Z" },
2210
+ { url = "https://files.pythonhosted.org/packages/75/4b/bbbb8e6fac4cfc53d7aaa69a3d531bf10799354b0021f4b58914aced8c1a/websockets-16.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:638cf57c48b4ad8ac1ff1e453f4f97db2426b690ddc111e6da96b27b4a340bc3", size = 191594, upload-time = "2026-07-10T06:30:53.229Z" },
2211
+ { url = "https://files.pythonhosted.org/packages/5c/da/6c0c349443d6e999f481e3d9a0e57e7ac2956d75d6391bec24b92af3fe13/websockets-16.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2c1c85f61bc9d5eac57ce705d848dc2d2ce3680638300bf4e1da7d749e2cf4ce", size = 188862, upload-time = "2026-07-10T06:30:54.744Z" },
2212
+ { url = "https://files.pythonhosted.org/packages/d7/ea/a368d37c010425a5451f42052fe804e754e23333e8448aef5d55c8a8d64f/websockets-16.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:eeab6d27f51c7e579023c971f5e6dff200deadf01faf6831beaecd32052dfaef", size = 187633, upload-time = "2026-07-10T06:30:56.055Z" },
2213
+ { url = "https://files.pythonhosted.org/packages/0d/4e/2ecd59add10d0855ec03dbdedfcdacdbd1aaabcd44b7dcbeda27538662e9/websockets-16.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2ed64e5a97b0b97a0b66e18bfe281317a75fbbd5afe692f939ea8d14a4292f2c", size = 185089, upload-time = "2026-07-10T06:30:57.444Z" },
2214
+ { url = "https://files.pythonhosted.org/packages/6f/eb/c6c3dcd7a01097bb0d42f4e9ef21a2c2a491d36b77cd0870ab59f9e8e77f/websockets-16.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9b3b021d0ed4bc16eea9775f62c9fa71acdacba0fc790b38581754dedf29ca60", size = 187790, upload-time = "2026-07-10T06:30:58.731Z" },
2215
+ { url = "https://files.pythonhosted.org/packages/9b/3e/775d36885d5e48ab8020aaf377de0ff5fbeb8bc2682a7e46419e4a14521c/websockets-16.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6eb604a4167f0a0d53c2243dfc667a29f0b43c3436057184e070bb82a1000fa2", size = 186381, upload-time = "2026-07-10T06:31:00.355Z" },
2216
+ { url = "https://files.pythonhosted.org/packages/ad/90/6305c00812a92e47d0582604c02bd759db0118bbafc13f707d712dbcf898/websockets-16.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9a3f125e44c3e34d61d111652e608e0f5b85ce08c225c8d56ad0eb822fa40030", size = 188193, upload-time = "2026-07-10T06:31:01.677Z" },
2217
+ { url = "https://files.pythonhosted.org/packages/f6/32/96bf8302c81d961585b4d34a2ddd3f229782f9b8c57bc78bbf98f1b1a4ac/websockets-16.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:8fdf0b00d0d1f30d1f06a92cab46fe542eec3eb302a7aee7163f142d0780f216", size = 185771, upload-time = "2026-07-10T06:31:03.062Z" },
2218
+ { url = "https://files.pythonhosted.org/packages/e8/1f/e8fe44b1d2dc417d740d9959d28fd2a846f268e7df38a686c04ac7dfe947/websockets-16.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:67b56828712f5fa7852de4c0265c28827311a657a4d275b7312ed0d1a918bee4", size = 186803, upload-time = "2026-07-10T06:31:04.34Z" },
2219
+ { url = "https://files.pythonhosted.org/packages/a5/29/b07d3a4e1eb2ab03e94e7f53f0c7a628e85fde6ad86011f7afd08f27b985/websockets-16.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:39c7e7730be33b8f0cd6f0aa8e8c82f9cdd1813f159765e073b2ece65f4824b5", size = 187041, upload-time = "2026-07-10T06:31:05.567Z" },
2220
+ { url = "https://files.pythonhosted.org/packages/a6/fd/e0abb8acc435642ac4a671490f6cf781c882f3fe682cdced9080ea455ab5/websockets-16.1-cp311-cp311-win32.whl", hash = "sha256:c54fe94fb2f11e11b48920c5f971e298cec73ac35db56efe57a49db63dfc95d4", size = 180158, upload-time = "2026-07-10T06:31:06.929Z" },
2221
+ { url = "https://files.pythonhosted.org/packages/81/06/85574d9458d3b913090087b817df0cc47b68e9a01dd0ab6ac04b77f49b0a/websockets-16.1-cp311-cp311-win_amd64.whl", hash = "sha256:f9f4fb9ae8b802e55609685db98382d48fd3feb1397804e1e774968dea0f28c7", size = 180456, upload-time = "2026-07-10T06:31:08.247Z" },
2222
+ { url = "https://files.pythonhosted.org/packages/a1/52/748c014f07f4e0e170c8932de7e647a1511d5ab3049cd978797136aee577/websockets-16.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b6aa3f7ad345cf3862c21f4fbf2ef5e14d911348476c2845e137c091fe3a3f0b", size = 179798, upload-time = "2026-07-10T06:31:09.664Z" },
2223
+ { url = "https://files.pythonhosted.org/packages/8b/5e/2a2e64d977d084e49d37c187c26c056daaff41965be7300cd5dbde6f8b07/websockets-16.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b43fcfb521ac2f34ba80b7b8ea16303e4ad82dd8af667bf40839ad3a5d37b164", size = 177478, upload-time = "2026-07-10T06:31:11.072Z" },
2224
+ { url = "https://files.pythonhosted.org/packages/aa/12/5b85b4e75d697e548a94962ce5c036b05dd21cb9545759d555c5586422fc/websockets-16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2bd3e12cd9afbe2baedae0b1eeade8ba64329b60fe2f9abdc966bd10fd2c2ef5", size = 177746, upload-time = "2026-07-10T06:31:12.386Z" },
2225
+ { url = "https://files.pythonhosted.org/packages/9d/62/79b1c8f0cee0da648b4899e1c5b0dbd3aa59846985136a54854db6827ab4/websockets-16.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:35f41979c8623df9bd30d949d82010a8fda5c56ff12cd8508a5b7272b6d4b53a", size = 187345, upload-time = "2026-07-10T06:31:13.754Z" },
2226
+ { url = "https://files.pythonhosted.org/packages/25/34/b7c5c52c2f24280e1c017acb7ad491a566750a5cceca7f3cf999373bba21/websockets-16.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a24d1f35aef07d794a16c853c688e74956c50239bec37b4f2de080056046419b", size = 188581, upload-time = "2026-07-10T06:31:15.075Z" },
2227
+ { url = "https://files.pythonhosted.org/packages/bc/37/604193bebcbeffe96fdf795960b83a15d600880c64dc17ec9c31c5b3427d/websockets-16.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0c64c024ddf7a35331b21fcddb562a039c275d2c82e8c2d12939e7da23997270", size = 191362, upload-time = "2026-07-10T06:31:16.395Z" },
2228
+ { url = "https://files.pythonhosted.org/packages/a5/b4/5ee27575b367d7110d4d13945e2a9de067ec84dc71e54b87f01e38550d9a/websockets-16.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c3e99757f5baafe20fc598e202ea6f5b0b265186ad38d0a17bd8beca16296955", size = 189216, upload-time = "2026-07-10T06:31:17.776Z" },
2229
+ { url = "https://files.pythonhosted.org/packages/7e/22/3e2dcc78d85fc5d9d814895ce6d07d0dfacc0f6aaa1d151f2b8c8d772299/websockets-16.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:353f3bc6e058ac1ccab4b3588e8598837a8c04cfc8351233e6d523be675d844c", size = 187971, upload-time = "2026-07-10T06:31:19.152Z" },
2230
+ { url = "https://files.pythonhosted.org/packages/9e/2f/cd271717b93d5ee19626cb5e38a85baab745c86e33db7c31a3ac729b31b8/websockets-16.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0352f5b38b40e857b6428d468fa21dbb4dd4a567d933c26d9831b4efe1b92f43", size = 185381, upload-time = "2026-07-10T06:31:20.665Z" },
2231
+ { url = "https://files.pythonhosted.org/packages/78/91/6ad6f2f1426317b5001bd490534208c7360636b35bac1dec2e0c22bfc40e/websockets-16.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:70bd789afab579602968c39f21cb925466505f3edff22f0ae852bca54978a4f9", size = 188015, upload-time = "2026-07-10T06:31:22.024Z" },
2232
+ { url = "https://files.pythonhosted.org/packages/c7/6d/533733132ab4c07540efd4a8f0b9a435d3a5059b2f26cc476ace1abf7f45/websockets-16.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d0fb4b46f121eccd539353baebd1083a8767a9a351109453d1d1caecd1ba40c2", size = 186619, upload-time = "2026-07-10T06:31:23.376Z" },
2233
+ { url = "https://files.pythonhosted.org/packages/08/73/16c059f3d73b3331eba10793704afa4faa9939234fb08ef7dca35794e8f0/websockets-16.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c14b6634af01541e4efe2954fd8f263386f7aa6d37c01e55dd8109fd17661452", size = 188497, upload-time = "2026-07-10T06:31:25.024Z" },
2234
+ { url = "https://files.pythonhosted.org/packages/4d/89/9a8fae7dd2acdcfb1a8844c29fe42b518a04b64fce38a0923b6290e452f1/websockets-16.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:a58532c49a851bcb481e58c1be23b315c17fe2fbbed509d75aeea12f543d2c15", size = 186051, upload-time = "2026-07-10T06:31:26.291Z" },
2235
+ { url = "https://files.pythonhosted.org/packages/f6/40/b240c7dd6a0e0c59c1f68377cc3015263521080c327c15f5e753c1f6d378/websockets-16.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4e969170c3b08e1d8dabd990fef1fa702c4233aeaabec33f871806e444f6a0e4", size = 187029, upload-time = "2026-07-10T06:31:27.605Z" },
2236
+ { url = "https://files.pythonhosted.org/packages/50/35/524e3fac40e47d6fdcf6c4b2c95ef1bc8a97e01593c90eff86621df7b716/websockets-16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ff9b000064b88787ba9f7a3cb2af2b68a658ca5aad76458a46469e7124b678a0", size = 187308, upload-time = "2026-07-10T06:31:28.927Z" },
2237
+ { url = "https://files.pythonhosted.org/packages/00/13/56840cf62c8859af6ba22b9529da937332468c80f32b598753e8a66d3990/websockets-16.1-cp312-cp312-win32.whl", hash = "sha256:b9f5d83f80f4d7c4bba6d97f3755ac05850c784dce0fd2ab371c4e41172f53ff", size = 180161, upload-time = "2026-07-10T06:31:30.316Z" },
2238
+ { url = "https://files.pythonhosted.org/packages/d6/ff/87eb9eb44cb62424a8d729834f2b0515a47e2669fabec29820268f4d50a1/websockets-16.1-cp312-cp312-win_amd64.whl", hash = "sha256:6852c9f653966c16109d3b6f31181fd734f7914927e3f0fa1117af7a18c9aa21", size = 180462, upload-time = "2026-07-10T06:31:31.708Z" },
2239
+ { url = "https://files.pythonhosted.org/packages/d9/63/df158b155420b566f025e75613424ad9649a24bcb0e9f259321ab3d58bea/websockets-16.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b0232ed141cec3df2af5a3959a071c51f40036336b0d37e17faf9ef52fc73e47", size = 179791, upload-time = "2026-07-10T06:31:33.108Z" },
2240
+ { url = "https://files.pythonhosted.org/packages/74/cf/00fe9414dfeafa6fe54eae9f5716c8c8e9ac59d192be3b893c096d395846/websockets-16.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a71b73d143991714144e159f767b698f03c4a70b8a65ae1733b650cff488045b", size = 177472, upload-time = "2026-07-10T06:31:34.522Z" },
2241
+ { url = "https://files.pythonhosted.org/packages/8b/76/b10633424d40681b4e892ffd08ca5226322b2426e62d4ab71eae484c3a32/websockets-16.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:187323204c3b2fc465e8fc2609e60437c521790cb9c1acb49c4c452a33e57f37", size = 177737, upload-time = "2026-07-10T06:31:35.964Z" },
2242
+ { url = "https://files.pythonhosted.org/packages/dc/61/d3bb03b2229bb1afd72008742d586cf1ea240dce64dd48c71c8c7fd3294c/websockets-16.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9dba74233c8c3ce368850818c98354dad2570f57231b3fd3bd00d7aa57628881", size = 187403, upload-time = "2026-07-10T06:31:37.496Z" },
2243
+ { url = "https://files.pythonhosted.org/packages/26/16/cc2e80478f688fc3c39c67dc1fac6a0783858058914ebc2489917462cb42/websockets-16.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:63339bc8c63c86a463177775cb7c677691f5bcfac7b3b2f01b286d42acd41600", size = 188639, upload-time = "2026-07-10T06:31:38.86Z" },
2244
+ { url = "https://files.pythonhosted.org/packages/15/d6/ad87b2507e57de1cbf897a56c963f2925962ed5e85fbe06aaa83ced27acd/websockets-16.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:23e545ea8ae4263e37cdfd4e22a217f519e48e432728bc461185bbf585f38a83", size = 190078, upload-time = "2026-07-10T06:31:40.218Z" },
2245
+ { url = "https://files.pythonhosted.org/packages/9e/1a/5b37b3fd335d5811f29fc829f2646a3e6d1463a4bf09c3100708684c766e/websockets-16.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2237081454846fb40403a80ba86d82e2038b9c45865ab96af0abe7d002a91045", size = 189267, upload-time = "2026-07-10T06:31:41.523Z" },
2246
+ { url = "https://files.pythonhosted.org/packages/42/98/06afc33e9450d4230f94c664db78875d90f5f6a5fb77f0bc6ec15ae74e1c/websockets-16.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5f5218de1ed047385ca53744caba9435d65f75d008364970a3fae95a05812cf9", size = 188022, upload-time = "2026-07-10T06:31:42.838Z" },
2247
+ { url = "https://files.pythonhosted.org/packages/8c/bf/42fef5d5887c18cf2d148b02debf56cecb9cfbffc68027cde9b12c8f432c/websockets-16.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:75c98e3920039d0edff03b74478ada504b7ce3a1bc406db2cabfca84320f7baf", size = 185435, upload-time = "2026-07-10T06:31:44.219Z" },
2248
+ { url = "https://files.pythonhosted.org/packages/a0/9b/8021c133add5fe40ed40312553a6cd1408c069d7efe3444ad483d4973ed3/websockets-16.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1facd189d8190af30487a55b4c3688484dd50801628a3b5b2ccd26db08e67057", size = 188080, upload-time = "2026-07-10T06:31:45.986Z" },
2249
+ { url = "https://files.pythonhosted.org/packages/69/54/1e37384f395eaa127383aab15c1c45e200890a7d7b99db5c312233d193e0/websockets-16.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:cc0c6a6eef613c7da32d4fb068f82ef834b58134f6a16b54e6c1e5bf9529ab3d", size = 186678, upload-time = "2026-07-10T06:31:47.449Z" },
2250
+ { url = "https://files.pythonhosted.org/packages/68/79/1caeacab5bc2081e4519288d248bc8bd2de30652e6eaa94be6be09a1fe5b/websockets-16.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ad9411eded8988b879be6038206698bf7106c85a78f642c004485bcb95be17eb", size = 188554, upload-time = "2026-07-10T06:31:48.886Z" },
2251
+ { url = "https://files.pythonhosted.org/packages/ee/83/b3dca5fad71487b726e31cb0acf56f226792c1cc34e6ab18cbf146bd2d74/websockets-16.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:cd68f0914f3b64694895bc5e9b14e8b447e41d7bf5ffaf989bb8dcb5e2dfdce7", size = 186109, upload-time = "2026-07-10T06:31:50.508Z" },
2252
+ { url = "https://files.pythonhosted.org/packages/5b/0b/8f246c3712f07f207b52ea5fb47f3b2b66fafec7303162644c74aed51c6a/websockets-16.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fef2debfe7f7ebdda12176f26166f95b7af17af05ba06150fcf889032e0213e9", size = 187061, upload-time = "2026-07-10T06:31:51.861Z" },
2253
+ { url = "https://files.pythonhosted.org/packages/47/eb/27d6c92a01696b6495386af4fc941d7d0a13f2eab2bf9c336111d7321491/websockets-16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a3cd6c9b798218798f4bb7b2e71c38f0e744bb94ca537b13376f88019d46384d", size = 187347, upload-time = "2026-07-10T06:31:53.246Z" },
2254
+ { url = "https://files.pythonhosted.org/packages/6b/d5/eeee439921f55d5eaeabcea18d0f7ce32cdc39cb8fc1e185431a094c5c7b/websockets-16.1-cp313-cp313-win32.whl", hash = "sha256:84c170c6869633536921e4474b1cce7254c0c9b0053ef5725f966cee47e718e4", size = 180149, upload-time = "2026-07-10T06:31:55.058Z" },
2255
+ { url = "https://files.pythonhosted.org/packages/a3/03/971e98d4a4864cf263f9e94c5b2b7c9a9b7682d77bfbba4e732c55ee85a9/websockets-16.1-cp313-cp313-win_amd64.whl", hash = "sha256:bef52d327d70fa75dad93ee61ea2cb1d1489aca9f35c188833563f5a3b4df0a5", size = 180458, upload-time = "2026-07-10T06:31:56.767Z" },
2256
+ { url = "https://files.pythonhosted.org/packages/8d/e6/da1dc11507f8118145a81c751fe0c77e5e1c11b8554496addb39389e2dc2/websockets-16.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:f881fca0a45dd6789939bd6637cd98169b92f1c3fdc78262f2cb9ec2cb1f324e", size = 179833, upload-time = "2026-07-10T06:31:58.19Z" },
2257
+ { url = "https://files.pythonhosted.org/packages/6e/ac/c0d46f62e31e232487b2c123bc3cfd9a4e45684ca7dc0c37f0987f29baae/websockets-16.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:30c379d5b207d3a7f0ba4c2e4602a895b0bcc63fb5f5371a4ae7fbddb03b672b", size = 177524, upload-time = "2026-07-10T06:31:59.563Z" },
2258
+ { url = "https://files.pythonhosted.org/packages/4a/33/abd966074b34a51e4f134e0aaed80f5a4a0a35163ea5ac58a1bc5a076d23/websockets-16.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:98ab58a4faa72b46da0127ccc1931dcbfc0985b0778892300a092185910c4cbe", size = 177743, upload-time = "2026-07-10T06:32:00.959Z" },
2259
+ { url = "https://files.pythonhosted.org/packages/ea/30/646e47b8a8dff04e227bdab512e6dde60663a647eeac7bbd6edddd92bbc5/websockets-16.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8e9c4e369fc181b2d41a99e01477215cecdc8546a39f7d41a59cc0a7065a0b09", size = 187474, upload-time = "2026-07-10T06:32:02.54Z" },
2260
+ { url = "https://files.pythonhosted.org/packages/d2/72/890ab9d77494af93ea65268230bfbc0a90ba789401ed7a44356a44785644/websockets-16.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0704df094b2d5fa7f6f410925a594c2a5c9a09167731a76292e5410934208209", size = 188717, upload-time = "2026-07-10T06:32:04.156Z" },
2261
+ { url = "https://files.pythonhosted.org/packages/d5/aa/baedbbaa6bf9ed6029617ed5e8976535bd805f483ca9b3484e7ad9ee08bf/websockets-16.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b22b1f4950f6ab7126623329c3b47b3b90a14c05db517f2db2a026ad6c928352", size = 190090, upload-time = "2026-07-10T06:32:05.822Z" },
2262
+ { url = "https://files.pythonhosted.org/packages/52/4f/d813ec94e18002571ef4959d87a630eff6e01b72a51bcb0832b75ae8c51a/websockets-16.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1ae4a686a662964a6671069f84f7f908cc3475e782227726b0c622c715962105", size = 189320, upload-time = "2026-07-10T06:32:07.223Z" },
2263
+ { url = "https://files.pythonhosted.org/packages/b8/3c/8ec52a6662f3df64090fba28cd521d405d54759268d8e820477037e8c80d/websockets-16.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:856bdd638f8277f86465057bfdd4da097c73058fb0f9d2bd5baea29e2bf2d367", size = 188068, upload-time = "2026-07-10T06:32:08.586Z" },
2264
+ { url = "https://files.pythonhosted.org/packages/96/7f/f0ae6042b14f86fa5f996c6563ea4cf107adc036ccbedc9d4f418d0095f9/websockets-16.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9003a1fde1c21a322a3ca3fa0c4bda8c639da81dbc925162766086643b05ba87", size = 185493, upload-time = "2026-07-10T06:32:09.968Z" },
2265
+ { url = "https://files.pythonhosted.org/packages/89/ad/5ffc53af9939c49fd653d147fa5b8f78ced1f6bce6c49a7446860945b0ce/websockets-16.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:39e947b1f5fdab045174306e3916785bf3ed537648acc1549827c08c33b10953", size = 188141, upload-time = "2026-07-10T06:32:11.434Z" },
2266
+ { url = "https://files.pythonhosted.org/packages/67/62/729206c0ee577a4db8eae6dd06e0eef725a1287c6df11b2ef831d003df31/websockets-16.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:5dd0e666b5931c0509cf65714686a1c5126771e663a79ac5d40da4f58b1f9502", size = 186653, upload-time = "2026-07-10T06:32:12.845Z" },
2267
+ { url = "https://files.pythonhosted.org/packages/1b/86/e8806a99ec4589914f255e6b658853fe537bf359c05e6ba5762ad9c27917/websockets-16.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:a0285df7925657ad65a65fb8dc330808bce082827538fd50ef45fa12d1fc5bca", size = 188614, upload-time = "2026-07-10T06:32:14.236Z" },
2268
+ { url = "https://files.pythonhosted.org/packages/89/38/ac554e2fc6ff0b8deeff9798b92e7abd8f99e2bd9731532e7033de208220/websockets-16.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:82d1c2cab3c133e9d059b3a5420bed9376bd30e21c185c63dda4ddadf6ddda47", size = 186165, upload-time = "2026-07-10T06:32:15.626Z" },
2269
+ { url = "https://files.pythonhosted.org/packages/6c/c5/4ef4d8e53342f94f3c49e1ae089b32c1e8b3878e15e0022c7708c647f351/websockets-16.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:c39907f1eaf11f6277def65aa02d68f30576b693d0c1ca332aafa3caa723ac6d", size = 187119, upload-time = "2026-07-10T06:32:17.114Z" },
2270
+ { url = "https://files.pythonhosted.org/packages/3a/33/4788b1dd417bd97eeb2698af3b9df6775ac656f96e9987da0419a067602f/websockets-16.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:45c5ea55446171949eb99fd34b771ceddd511ca21958d40d0197ced33159e5ee", size = 187411, upload-time = "2026-07-10T06:32:18.629Z" },
2271
+ { url = "https://files.pythonhosted.org/packages/30/38/00d37aad6dc3244ce349e2864815362e50b3cfc00cac28d216db20efe40f/websockets-16.1-cp314-cp314-win32.whl", hash = "sha256:b8ef8b1c8d6bd029a475ac432e730fba2dfd456715d26c473e2a82291024b99c", size = 179822, upload-time = "2026-07-10T06:32:20.233Z" },
2272
+ { url = "https://files.pythonhosted.org/packages/9d/37/2a8cb0eaddee5eaebda47a90a3ba0898d1ce3d866b02a4857fea17d82e5b/websockets-16.1-cp314-cp314-win_amd64.whl", hash = "sha256:7358ff21632b5d062707f73e859c824f1c3807e73d8ca25e71caca7c4cdcf145", size = 180167, upload-time = "2026-07-10T06:32:21.749Z" },
2273
+ { url = "https://files.pythonhosted.org/packages/07/5a/262ad5fcaef4198997b165060f09a63f861e76939b1786ab546ccc3f8120/websockets-16.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d0f38f4c3e9b359e257c339c2cc1967ccaeedb102e57c1c986bdce4bf4f32268", size = 180166, upload-time = "2026-07-10T06:32:23.278Z" },
2274
+ { url = "https://files.pythonhosted.org/packages/1a/c7/36377db690f4292826e4501a6dec2801dc55fd1cf0405923b04937e478df/websockets-16.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:3c3d2cbd1602593bad49bd86fa3fbb25407d87a3b4bf8857c0ac5ac4914e1901", size = 177697, upload-time = "2026-07-10T06:32:25.164Z" },
2275
+ { url = "https://files.pythonhosted.org/packages/fa/c7/07171abce1e39799a76f473608580fe98bd43a1230f5146159622c02bccf/websockets-16.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:36069b74671e7e667f48a7484249f84c45a825a134c8b1bdc01875d0daa10d79", size = 177902, upload-time = "2026-07-10T06:32:26.564Z" },
2276
+ { url = "https://files.pythonhosted.org/packages/14/17/c831f48e250bc4749f57c00dcce73337c41cd32f6d59a64567b84e782601/websockets-16.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:587f83c2ce8a5d628e166384d77fa7f0ac69b9007d515ab442123e6615aa8da3", size = 187766, upload-time = "2026-07-10T06:32:27.981Z" },
2277
+ { url = "https://files.pythonhosted.org/packages/2c/2e/4dfe63e245b0ecfaf470cf082d25c6ce35808159135fd88c82653a6b11ab/websockets-16.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a6db7972d52bc1b66cefe2246902e256cbaebc9ba8a45eac09343d7eb6671b2", size = 188939, upload-time = "2026-07-10T06:32:29.365Z" },
2278
+ { url = "https://files.pythonhosted.org/packages/ba/e5/5faf65aebd9562f6b4bc473d24ce38cc56f84eb5f5bee66ed9b86733f93c/websockets-16.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e7d6014888a0632e1ed7a4095248bb3095232999447f2d83bfb1900987dd9ed9", size = 191081, upload-time = "2026-07-10T06:32:30.868Z" },
2279
+ { url = "https://files.pythonhosted.org/packages/49/cd/2634f2f2c0556c1aae6501ed6840019cc569dd6fdbcac6494378daea4dc0/websockets-16.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9cb074d150e4ad2a77aa8a332c2be85f3f64f2681519d2570c1225c12c9821ff", size = 189513, upload-time = "2026-07-10T06:32:32.399Z" },
2280
+ { url = "https://files.pythonhosted.org/packages/59/bb/2c700b51196104f09715b326b1f092ed25326bdf79a03e00a4842e503743/websockets-16.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d19c9067e1fe9490f974bffbc0e443b80a7674c5efb4980c429cc00771f07c5a", size = 188240, upload-time = "2026-07-10T06:32:33.897Z" },
2281
+ { url = "https://files.pythonhosted.org/packages/f1/20/86283636e499a1a357fa9441f690ba34f255e731f2fea174132b3b762b57/websockets-16.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d440ff0c6c7469ad59c0a412c383c235935b43635e89425e3f6a0c36de90c31b", size = 185955, upload-time = "2026-07-10T06:32:35.279Z" },
2282
+ { url = "https://files.pythonhosted.org/packages/91/23/d7fb734b0095d43bc7f1c9f68afd50adb4176e7e513403e8c70ad7daa4fa/websockets-16.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8613129a2533f08de24505e69a3e403cedaadae49abdb043c4d170ca71b7e4bd", size = 188491, upload-time = "2026-07-10T06:32:36.673Z" },
2283
+ { url = "https://files.pythonhosted.org/packages/6a/5e/168a192689db468405ecf3b8e4a2c18811936b0724d017ad7e6d252734f0/websockets-16.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:a5bf9c23f197b4ec88290fd5463f33db67362a1bb10f85fc2e8e7627f0ddab97", size = 186983, upload-time = "2026-07-10T06:32:38.207Z" },
2284
+ { url = "https://files.pythonhosted.org/packages/7e/9b/66795fa91ebe49019ebe4fa910282172252e37046b80e08fc52e0c365150/websockets-16.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:520b0fd0395f075febb283c76755af724ab9fd19dffa4f3bfd18cb4e622790a3", size = 188890, upload-time = "2026-07-10T06:32:39.545Z" },
2285
+ { url = "https://files.pythonhosted.org/packages/5a/32/126bbc844be5afb3613fd43211dac10a9645f4cf39741d04acaa2ec7030c/websockets-16.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:7143aa09a67e1c013be44e81a88dfe90fc6244198ab86c7edd064152cf619805", size = 186583, upload-time = "2026-07-10T06:32:41.038Z" },
2286
+ { url = "https://files.pythonhosted.org/packages/22/b9/0b5db9cbcf6e4970db4496893244a8d92e07f71a8ef27cf34b08aa02fef1/websockets-16.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:7acb811fad08e611755800d1560e395c67e11a6bd563598ea6abb319afb86938", size = 187353, upload-time = "2026-07-10T06:32:42.501Z" },
2287
+ { url = "https://files.pythonhosted.org/packages/99/2e/254b2131a10d831b76e2c18dfe7add9729c6292c674a8085bf8de01ad151/websockets-16.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c5cf88e3faa2f7931bc6baeee7599c97656a3f6ac7f831f4fccba233e141783a", size = 187784, upload-time = "2026-07-10T06:32:43.929Z" },
2288
+ { url = "https://files.pythonhosted.org/packages/21/dc/e7288aa8e3ac5a88a0924619984d663c1abf2a87d0ea98290c66fdaee0ec/websockets-16.1-cp314-cp314t-win32.whl", hash = "sha256:589f8842521c8307684ce0b40ce4ad70c5e0aa46484c6f1225a94ef4b8970341", size = 179947, upload-time = "2026-07-10T06:32:45.495Z" },
2289
+ { url = "https://files.pythonhosted.org/packages/d3/de/37edf1260ff0fbbd2f82433489c4cfbe799ac2ff21355331609879329fe6/websockets-16.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c0e0857c30bbbc2bb5c30687508f0b7ec19aa026cd9f2ff8424d0fee42dcc07", size = 180291, upload-time = "2026-07-10T06:32:47.119Z" },
2290
+ { url = "https://files.pythonhosted.org/packages/4d/f4/84ef884775bbe77c46cce79bc7d705ea3bc6574cc00acf81af89754c077d/websockets-16.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7289d899c79e763e6221c8dcb8959361cb43274418538d7c7ad16a43b01d12f9", size = 177387, upload-time = "2026-07-10T06:32:48.574Z" },
2291
+ { url = "https://files.pythonhosted.org/packages/d3/d9/6831ec6f65e1eeac770375f4f4b604f23df9bafaa1b47004bc5f9488d513/websockets-16.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e22e9e3719f5131bd62da4db63c8da63eb8c91cc99e16c1cbd122f130e1ae07a", size = 177663, upload-time = "2026-07-10T06:32:50.043Z" },
2292
+ { url = "https://files.pythonhosted.org/packages/9d/d4/21d4922fa7fe855813a8b38f181a0ecf02a586e16c1f095fd05471f78cc2/websockets-16.1-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:83bdabafef431247e6b11a9aab8a0893fd8e82e1ed95b32e0373625b03ffce4a", size = 178501, upload-time = "2026-07-10T06:32:51.439Z" },
2293
+ { url = "https://files.pythonhosted.org/packages/91/87/7a0320df854dacd09507ca972cb04a4dc5aae279583cc5b80ad5f5819533/websockets-16.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b8d13ceabc5c60995f201b5211d76876e17e68706ebf5d3bc666b32eefff1a6", size = 179397, upload-time = "2026-07-10T06:32:52.892Z" },
2294
+ { url = "https://files.pythonhosted.org/packages/31/6a/0da1eb8c8da2ace7b578c8523d32618af85e62a9ebad56051d4a14a38a1c/websockets-16.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:81495f9c0085361c582efbc3207fb877174cfe03370f17d9cd70624404aa526f", size = 180546, upload-time = "2026-07-10T06:32:54.619Z" },
2295
+ { url = "https://files.pythonhosted.org/packages/66/58/bd83247f39ddc26ffc2c24eb05087a3b749e00cb4509fc6d19daa23c8495/websockets-16.1-py3-none-any.whl", hash = "sha256:c5149dfe490ec7e5ee5dbf624c642fb725f93a5575c7f00ab594ca9eddb8dd81", size = 174031, upload-time = "2026-07-10T06:32:56.079Z" },
2296
+ ]
2297
+
2164
2298
  [[package]]
2165
2299
  name = "win32-setctime"
2166
2300
  version = "1.2.0"
File without changes
File without changes
File without changes
File without changes