blanchon commited on
Commit
b83a268
·
1 Parent(s): 116a27a
.dockerignore CHANGED
@@ -5,16 +5,13 @@
5
  **/yarn-error.log*
6
  **/.pnpm-debug.log*
7
 
8
-
9
  **/.bun
10
 
11
-
12
  **/dist/
13
  **/build/
14
  **/.next/
15
  **/.svelte-kit/
16
 
17
-
18
  **/.env
19
  **/.env.local
20
  **/.env.development.local
@@ -30,8 +27,6 @@
30
  **/downloads/
31
  **/eggs/
32
  **/.eggs/
33
- **/lib/
34
- **/lib64/
35
  **/parts/
36
  **/sdist/
37
  **/var/
@@ -95,4 +90,7 @@
95
  **/docs/
96
 
97
  **/.github/
98
- **/.gitlab-ci.yml
 
 
 
 
5
  **/yarn-error.log*
6
  **/.pnpm-debug.log*
7
 
 
8
  **/.bun
9
 
 
10
  **/dist/
11
  **/build/
12
  **/.next/
13
  **/.svelte-kit/
14
 
 
15
  **/.env
16
  **/.env.local
17
  **/.env.development.local
 
27
  **/downloads/
28
  **/eggs/
29
  **/.eggs/
 
 
30
  **/parts/
31
  **/sdist/
32
  **/var/
 
90
  **/docs/
91
 
92
  **/.github/
93
+ **/.gitlab-ci.yml
94
+
95
+ # Force include demo source lib (contains UI components & settings)
96
+ !demo/src/lib/**
Dockerfile CHANGED
@@ -5,12 +5,15 @@ FROM oven/bun:1-alpine AS frontend-builder
5
  ARG PUBLIC_TRANSPORT_SERVER_URL=https://blanchon-robothub-transportserver.hf.space/api
6
  ENV PUBLIC_TRANSPORT_SERVER_URL=${PUBLIC_TRANSPORT_SERVER_URL}
7
 
 
 
 
8
  WORKDIR /app
9
 
10
  # Install git for dependencies that might need it
11
  RUN apk add --no-cache git
12
 
13
- # Copy package files for better caching
14
  COPY client/js/package.json client/js/tsconfig.json* ./client/js/
15
  COPY demo/package.json demo/tsconfig.json* demo/svelte.config.js* ./demo/
16
 
@@ -45,8 +48,7 @@ ENV PYTHONUNBUFFERED=1 \
45
  PYTHONDONTWRITEBYTECODE=1 \
46
  UV_SYSTEM_PYTHON=1 \
47
  UV_COMPILE_BYTECODE=1 \
48
- UV_CACHE_DIR=/tmp/uv-cache \
49
- PORT=8000
50
 
51
  # Install system dependencies needed for video processing
52
  RUN apt-get update && apt-get install -y \
 
5
  ARG PUBLIC_TRANSPORT_SERVER_URL=https://blanchon-robothub-transportserver.hf.space/api
6
  ENV PUBLIC_TRANSPORT_SERVER_URL=${PUBLIC_TRANSPORT_SERVER_URL}
7
 
8
+ ARG PORT=8000
9
+ ENV PORT=${PORT}
10
+
11
  WORKDIR /app
12
 
13
  # Install git for dependencies that might need it
14
  RUN apk add --no-cache git
15
 
16
+ # Copy client and demo package files for better caching
17
  COPY client/js/package.json client/js/tsconfig.json* ./client/js/
18
  COPY demo/package.json demo/tsconfig.json* demo/svelte.config.js* ./demo/
19
 
 
48
  PYTHONDONTWRITEBYTECODE=1 \
49
  UV_SYSTEM_PYTHON=1 \
50
  UV_COMPILE_BYTECODE=1 \
51
+ UV_CACHE_DIR=/tmp/uv-cache
 
52
 
53
  # Install system dependencies needed for video processing
54
  RUN apt-get update && apt-get install -y \
client/js/dist/index.js CHANGED
@@ -232,7 +232,7 @@ class RoboticsClientCore extends import__.default {
232
  onErrorCallback = null;
233
  onConnectedCallback = null;
234
  onDisconnectedCallback = null;
235
- constructor(baseUrl = "http://localhost:8000", options = {}) {
236
  super();
237
  this.baseUrl = baseUrl.replace(/\/$/, "");
238
  this.apiBase = `${this.baseUrl}/robotics`;
@@ -427,7 +427,7 @@ class RoboticsClientCore extends import__.default {
427
  }
428
  // src/robotics/producer.ts
429
  class RoboticsProducer extends RoboticsClientCore {
430
- constructor(baseUrl = "http://localhost:8000", options = {}) {
431
  super(baseUrl, options);
432
  }
433
  async connect(workspaceId, roomId, participantId) {
@@ -479,7 +479,7 @@ class RoboticsProducer extends RoboticsClientCore {
479
  console.warn(`Unknown message type for producer: ${message.type}`);
480
  }
481
  }
482
- static async createAndConnect(baseUrl = "http://localhost:8000", workspaceId, roomId, participantId) {
483
  const producer = new RoboticsProducer(baseUrl);
484
  const roomData = await producer.createRoom(workspaceId, roomId);
485
  const connected = await producer.connect(roomData.workspaceId, roomData.roomId, participantId);
@@ -496,7 +496,7 @@ class RoboticsProducer extends RoboticsClientCore {
496
  class RoboticsConsumer extends RoboticsClientCore {
497
  onStateSyncCallback = null;
498
  onJointUpdateCallback = null;
499
- constructor(baseUrl = "http://localhost:8000", options = {}) {
500
  super(baseUrl, options);
501
  }
502
  async connect(workspaceId, roomId, participantId) {
@@ -547,7 +547,7 @@ class RoboticsConsumer extends RoboticsClientCore {
547
  }
548
  this.emit("jointUpdate", message.data);
549
  }
550
- static async createAndConnect(workspaceId, roomId, baseUrl = "http://localhost:8000", participantId) {
551
  const consumer = new RoboticsConsumer(baseUrl);
552
  const connected = await consumer.connect(workspaceId, roomId, participantId);
553
  if (!connected) {
@@ -557,7 +557,7 @@ class RoboticsConsumer extends RoboticsClientCore {
557
  }
558
  }
559
  // src/robotics/factory.ts
560
- function createClient(role, baseUrl = "http://localhost:8000", options = {}) {
561
  if (role === "producer") {
562
  return new RoboticsProducer(baseUrl, options);
563
  }
@@ -566,7 +566,7 @@ function createClient(role, baseUrl = "http://localhost:8000", options = {}) {
566
  }
567
  throw new Error(`Invalid role: ${role}. Must be 'producer' or 'consumer'`);
568
  }
569
- async function createProducerClient(baseUrl = "http://localhost:8000", workspaceId, roomId, participantId, options = {}) {
570
  const producer = new RoboticsProducer(baseUrl, options);
571
  const roomData = await producer.createRoom(workspaceId, roomId);
572
  const connected = await producer.connect(roomData.workspaceId, roomData.roomId, participantId);
@@ -575,7 +575,7 @@ async function createProducerClient(baseUrl = "http://localhost:8000", workspace
575
  }
576
  return producer;
577
  }
578
- async function createConsumerClient(workspaceId, roomId, baseUrl = "http://localhost:8000", participantId, options = {}) {
579
  const consumer = new RoboticsConsumer(baseUrl, options);
580
  const connected = await consumer.connect(workspaceId, roomId, participantId);
581
  if (!connected) {
@@ -612,7 +612,7 @@ class VideoClientCore extends import__.default {
612
  onErrorCallback = null;
613
  onConnectedCallback = null;
614
  onDisconnectedCallback = null;
615
- constructor(baseUrl = "http://localhost:8000", options = {}) {
616
  super();
617
  this.baseUrl = baseUrl.replace(/\/$/, "");
618
  this.apiBase = `${this.baseUrl}/video`;
@@ -983,7 +983,7 @@ class VideoClientCore extends import__.default {
983
  // src/video/producer.ts
984
  class VideoProducer extends VideoClientCore {
985
  consumerConnections = new Map;
986
- constructor(baseUrl = "http://localhost:8000", options = {}) {
987
  super(baseUrl, options);
988
  }
989
  async connect(workspaceId, roomId, participantId) {
@@ -1275,7 +1275,7 @@ class VideoProducer extends VideoClientCore {
1275
  this.websocket.send(JSON.stringify(message));
1276
  this.emit("streamStopped");
1277
  }
1278
- static async createAndConnect(baseUrl = "http://localhost:8000", workspaceId, roomId, participantId) {
1279
  const producer = new VideoProducer(baseUrl);
1280
  const roomData = await producer.createRoom(workspaceId, roomId);
1281
  const connected = await producer.connect(roomData.workspaceId, roomData.roomId, participantId);
@@ -1299,7 +1299,7 @@ class VideoConsumer extends VideoClientCore {
1299
  onStreamStatsCallback = null;
1300
  iceCandidateQueue = [];
1301
  hasRemoteDescription = false;
1302
- constructor(baseUrl = "http://localhost:8000", options = {}) {
1303
  super(baseUrl, options);
1304
  }
1305
  async connect(workspaceId, roomId, participantId) {
@@ -1563,7 +1563,7 @@ class VideoConsumer extends VideoClientCore {
1563
  }
1564
  this.emit("streamStats", message.stats);
1565
  }
1566
- static async createAndConnect(workspaceId, roomId, baseUrl = "http://localhost:8000", participantId) {
1567
  const consumer = new VideoConsumer(baseUrl);
1568
  const connected = await consumer.connect(workspaceId, roomId, participantId);
1569
  if (!connected) {
@@ -1585,7 +1585,7 @@ class VideoConsumer extends VideoClientCore {
1585
  }
1586
  }
1587
  // src/video/factory.ts
1588
- function createClient2(role, baseUrl = "http://localhost:8000", options = {}) {
1589
  if (role === "producer") {
1590
  return new VideoProducer(baseUrl, options);
1591
  }
@@ -1594,7 +1594,7 @@ function createClient2(role, baseUrl = "http://localhost:8000", options = {}) {
1594
  }
1595
  throw new Error(`Invalid role: ${role}. Must be 'producer' or 'consumer'`);
1596
  }
1597
- async function createProducerClient2(baseUrl = "http://localhost:8000", workspaceId, roomId, participantId, options = {}) {
1598
  const producer = new VideoProducer(baseUrl, options);
1599
  const roomData = await producer.createRoom(workspaceId, roomId);
1600
  const connected = await producer.connect(roomData.workspaceId, roomData.roomId, participantId);
@@ -1603,7 +1603,7 @@ async function createProducerClient2(baseUrl = "http://localhost:8000", workspac
1603
  }
1604
  return producer;
1605
  }
1606
- async function createConsumerClient2(workspaceId, roomId, baseUrl = "http://localhost:8000", participantId, options = {}) {
1607
  const consumer = new VideoConsumer(baseUrl, options);
1608
  const connected = await consumer.connect(workspaceId, roomId, participantId);
1609
  if (!connected) {
@@ -1619,5 +1619,5 @@ export {
1619
  VERSION
1620
  };
1621
 
1622
- //# debugId=DEA97CEBB2EADB0264756E2164756E21
1623
  //# sourceMappingURL=index.js.map
 
232
  onErrorCallback = null;
233
  onConnectedCallback = null;
234
  onDisconnectedCallback = null;
235
+ constructor(baseUrl, options = {}) {
236
  super();
237
  this.baseUrl = baseUrl.replace(/\/$/, "");
238
  this.apiBase = `${this.baseUrl}/robotics`;
 
427
  }
428
  // src/robotics/producer.ts
429
  class RoboticsProducer extends RoboticsClientCore {
430
+ constructor(baseUrl, options = {}) {
431
  super(baseUrl, options);
432
  }
433
  async connect(workspaceId, roomId, participantId) {
 
479
  console.warn(`Unknown message type for producer: ${message.type}`);
480
  }
481
  }
482
+ static async createAndConnect(baseUrl, workspaceId, roomId, participantId) {
483
  const producer = new RoboticsProducer(baseUrl);
484
  const roomData = await producer.createRoom(workspaceId, roomId);
485
  const connected = await producer.connect(roomData.workspaceId, roomData.roomId, participantId);
 
496
  class RoboticsConsumer extends RoboticsClientCore {
497
  onStateSyncCallback = null;
498
  onJointUpdateCallback = null;
499
+ constructor(baseUrl, options = {}) {
500
  super(baseUrl, options);
501
  }
502
  async connect(workspaceId, roomId, participantId) {
 
547
  }
548
  this.emit("jointUpdate", message.data);
549
  }
550
+ static async createAndConnect(workspaceId, roomId, baseUrl, participantId) {
551
  const consumer = new RoboticsConsumer(baseUrl);
552
  const connected = await consumer.connect(workspaceId, roomId, participantId);
553
  if (!connected) {
 
557
  }
558
  }
559
  // src/robotics/factory.ts
560
+ function createClient(role, baseUrl, options = {}) {
561
  if (role === "producer") {
562
  return new RoboticsProducer(baseUrl, options);
563
  }
 
566
  }
567
  throw new Error(`Invalid role: ${role}. Must be 'producer' or 'consumer'`);
568
  }
569
+ async function createProducerClient(baseUrl, workspaceId, roomId, participantId, options = {}) {
570
  const producer = new RoboticsProducer(baseUrl, options);
571
  const roomData = await producer.createRoom(workspaceId, roomId);
572
  const connected = await producer.connect(roomData.workspaceId, roomData.roomId, participantId);
 
575
  }
576
  return producer;
577
  }
578
+ async function createConsumerClient(workspaceId, roomId, baseUrl, participantId, options = {}) {
579
  const consumer = new RoboticsConsumer(baseUrl, options);
580
  const connected = await consumer.connect(workspaceId, roomId, participantId);
581
  if (!connected) {
 
612
  onErrorCallback = null;
613
  onConnectedCallback = null;
614
  onDisconnectedCallback = null;
615
+ constructor(baseUrl, options = {}) {
616
  super();
617
  this.baseUrl = baseUrl.replace(/\/$/, "");
618
  this.apiBase = `${this.baseUrl}/video`;
 
983
  // src/video/producer.ts
984
  class VideoProducer extends VideoClientCore {
985
  consumerConnections = new Map;
986
+ constructor(baseUrl, options = {}) {
987
  super(baseUrl, options);
988
  }
989
  async connect(workspaceId, roomId, participantId) {
 
1275
  this.websocket.send(JSON.stringify(message));
1276
  this.emit("streamStopped");
1277
  }
1278
+ static async createAndConnect(baseUrl, workspaceId, roomId, participantId) {
1279
  const producer = new VideoProducer(baseUrl);
1280
  const roomData = await producer.createRoom(workspaceId, roomId);
1281
  const connected = await producer.connect(roomData.workspaceId, roomData.roomId, participantId);
 
1299
  onStreamStatsCallback = null;
1300
  iceCandidateQueue = [];
1301
  hasRemoteDescription = false;
1302
+ constructor(baseUrl, options = {}) {
1303
  super(baseUrl, options);
1304
  }
1305
  async connect(workspaceId, roomId, participantId) {
 
1563
  }
1564
  this.emit("streamStats", message.stats);
1565
  }
1566
+ static async createAndConnect(workspaceId, roomId, baseUrl, participantId) {
1567
  const consumer = new VideoConsumer(baseUrl);
1568
  const connected = await consumer.connect(workspaceId, roomId, participantId);
1569
  if (!connected) {
 
1585
  }
1586
  }
1587
  // src/video/factory.ts
1588
+ function createClient2(role, baseUrl, options = {}) {
1589
  if (role === "producer") {
1590
  return new VideoProducer(baseUrl, options);
1591
  }
 
1594
  }
1595
  throw new Error(`Invalid role: ${role}. Must be 'producer' or 'consumer'`);
1596
  }
1597
+ async function createProducerClient2(baseUrl, workspaceId, roomId, participantId, options = {}) {
1598
  const producer = new VideoProducer(baseUrl, options);
1599
  const roomData = await producer.createRoom(workspaceId, roomId);
1600
  const connected = await producer.connect(roomData.workspaceId, roomData.roomId, participantId);
 
1603
  }
1604
  return producer;
1605
  }
1606
+ async function createConsumerClient2(workspaceId, roomId, baseUrl, participantId, options = {}) {
1607
  const consumer = new VideoConsumer(baseUrl, options);
1608
  const connected = await consumer.connect(workspaceId, roomId, participantId);
1609
  if (!connected) {
 
1619
  VERSION
1620
  };
1621
 
1622
+ //# debugId=836AB17011247B3F64756E2164756E21
1623
  //# sourceMappingURL=index.js.map
client/js/dist/index.js.map CHANGED
The diff for this file is too large to render. See raw diff
 
client/js/dist/robotics/consumer.d.ts CHANGED
@@ -6,7 +6,7 @@ import type { WebSocketMessage, ClientOptions, JointUpdateCallback, StateSyncCal
6
  export declare class RoboticsConsumer extends RoboticsClientCore {
7
  private onStateSyncCallback;
8
  private onJointUpdateCallback;
9
- constructor(baseUrl?: string, options?: ClientOptions);
10
  connect(workspaceId: string, roomId: string, participantId?: string): Promise<boolean>;
11
  getStateSyncAsync(): Promise<Record<string, number>>;
12
  onStateSync(callback: StateSyncCallback): void;
@@ -17,5 +17,5 @@ export declare class RoboticsConsumer extends RoboticsClientCore {
17
  /**
18
  * Create a consumer and automatically connect to a room
19
  */
20
- static createAndConnect(workspaceId: string, roomId: string, baseUrl?: string, participantId?: string): Promise<RoboticsConsumer>;
21
  }
 
6
  export declare class RoboticsConsumer extends RoboticsClientCore {
7
  private onStateSyncCallback;
8
  private onJointUpdateCallback;
9
+ constructor(baseUrl: string, options?: ClientOptions);
10
  connect(workspaceId: string, roomId: string, participantId?: string): Promise<boolean>;
11
  getStateSyncAsync(): Promise<Record<string, number>>;
12
  onStateSync(callback: StateSyncCallback): void;
 
17
  /**
18
  * Create a consumer and automatically connect to a room
19
  */
20
+ static createAndConnect(workspaceId: string, roomId: string, baseUrl: string, participantId?: string): Promise<RoboticsConsumer>;
21
  }
client/js/dist/robotics/core.d.ts CHANGED
@@ -17,7 +17,7 @@ export declare class RoboticsClientCore extends EventEmitter {
17
  protected onErrorCallback: ErrorCallback | null;
18
  protected onConnectedCallback: ConnectedCallback | null;
19
  protected onDisconnectedCallback: DisconnectedCallback | null;
20
- constructor(baseUrl?: string, options?: ClientOptions);
21
  listRooms(workspaceId: string): Promise<RoomInfo[]>;
22
  createRoom(workspaceId?: string, roomId?: string): Promise<{
23
  workspaceId: string;
 
17
  protected onErrorCallback: ErrorCallback | null;
18
  protected onConnectedCallback: ConnectedCallback | null;
19
  protected onDisconnectedCallback: DisconnectedCallback | null;
20
+ constructor(baseUrl: string, options?: ClientOptions);
21
  listRooms(workspaceId: string): Promise<RoomInfo[]>;
22
  createRoom(workspaceId?: string, roomId?: string): Promise<{
23
  workspaceId: string;
client/js/dist/robotics/factory.d.ts CHANGED
@@ -7,12 +7,12 @@ import type { ParticipantRole, ClientOptions } from './types.js';
7
  /**
8
  * Factory function to create the appropriate client based on role
9
  */
10
- export declare function createClient(role: ParticipantRole, baseUrl?: string, options?: ClientOptions): RoboticsProducer | RoboticsConsumer;
11
  /**
12
  * Create and connect a producer client
13
  */
14
- export declare function createProducerClient(baseUrl?: string, workspaceId?: string, roomId?: string, participantId?: string, options?: ClientOptions): Promise<RoboticsProducer>;
15
  /**
16
  * Create and connect a consumer client
17
  */
18
- export declare function createConsumerClient(workspaceId: string, roomId: string, baseUrl?: string, participantId?: string, options?: ClientOptions): Promise<RoboticsConsumer>;
 
7
  /**
8
  * Factory function to create the appropriate client based on role
9
  */
10
+ export declare function createClient(role: ParticipantRole, baseUrl: string, options?: ClientOptions): RoboticsProducer | RoboticsConsumer;
11
  /**
12
  * Create and connect a producer client
13
  */
14
+ export declare function createProducerClient(baseUrl: string, workspaceId?: string, roomId?: string, participantId?: string, options?: ClientOptions): Promise<RoboticsProducer>;
15
  /**
16
  * Create and connect a consumer client
17
  */
18
+ export declare function createConsumerClient(workspaceId: string, roomId: string, baseUrl: string, participantId?: string, options?: ClientOptions): Promise<RoboticsConsumer>;
client/js/dist/robotics/producer.d.ts CHANGED
@@ -4,7 +4,7 @@
4
  import { RoboticsClientCore } from './core.js';
5
  import type { JointData, WebSocketMessage, ClientOptions } from './types.js';
6
  export declare class RoboticsProducer extends RoboticsClientCore {
7
- constructor(baseUrl?: string, options?: ClientOptions);
8
  connect(workspaceId: string, roomId: string, participantId?: string): Promise<boolean>;
9
  sendJointUpdate(joints: JointData[]): Promise<void>;
10
  sendStateSync(state: Record<string, number>): Promise<void>;
@@ -13,7 +13,7 @@ export declare class RoboticsProducer extends RoboticsClientCore {
13
  /**
14
  * Create a room and automatically connect as producer
15
  */
16
- static createAndConnect(baseUrl?: string, workspaceId?: string, roomId?: string, participantId?: string): Promise<RoboticsProducer>;
17
  /**
18
  * Get the current room ID (useful when auto-created)
19
  */
 
4
  import { RoboticsClientCore } from './core.js';
5
  import type { JointData, WebSocketMessage, ClientOptions } from './types.js';
6
  export declare class RoboticsProducer extends RoboticsClientCore {
7
+ constructor(baseUrl: string, options?: ClientOptions);
8
  connect(workspaceId: string, roomId: string, participantId?: string): Promise<boolean>;
9
  sendJointUpdate(joints: JointData[]): Promise<void>;
10
  sendStateSync(state: Record<string, number>): Promise<void>;
 
13
  /**
14
  * Create a room and automatically connect as producer
15
  */
16
+ static createAndConnect(baseUrl: string, workspaceId?: string, roomId?: string, participantId?: string): Promise<RoboticsProducer>;
17
  /**
18
  * Get the current room ID (useful when auto-created)
19
  */
client/js/dist/video/consumer.d.ts CHANGED
@@ -13,7 +13,7 @@ export declare class VideoConsumer extends VideoClientCore {
13
  private onStreamStatsCallback;
14
  private iceCandidateQueue;
15
  private hasRemoteDescription;
16
- constructor(baseUrl?: string, options?: ClientOptions);
17
  connect(workspaceId: string, roomId: string, participantId?: string): Promise<boolean>;
18
  startReceiving(): Promise<void>;
19
  stopReceiving(): Promise<void>;
@@ -40,7 +40,7 @@ export declare class VideoConsumer extends VideoClientCore {
40
  /**
41
  * Create a consumer and automatically connect to a room
42
  */
43
- static createAndConnect(workspaceId: string, roomId: string, baseUrl?: string, participantId?: string): Promise<VideoConsumer>;
44
  /**
45
  * Get the video element for displaying the remote stream
46
  */
 
13
  private onStreamStatsCallback;
14
  private iceCandidateQueue;
15
  private hasRemoteDescription;
16
+ constructor(baseUrl: string, options?: ClientOptions);
17
  connect(workspaceId: string, roomId: string, participantId?: string): Promise<boolean>;
18
  startReceiving(): Promise<void>;
19
  stopReceiving(): Promise<void>;
 
40
  /**
41
  * Create a consumer and automatically connect to a room
42
  */
43
+ static createAndConnect(workspaceId: string, roomId: string, baseUrl: string, participantId?: string): Promise<VideoConsumer>;
44
  /**
45
  * Get the video element for displaying the remote stream
46
  */
client/js/dist/video/core.d.ts CHANGED
@@ -21,7 +21,7 @@ export declare class VideoClientCore extends EventEmitter {
21
  protected onErrorCallback: ErrorCallback | null;
22
  protected onConnectedCallback: ConnectedCallback | null;
23
  protected onDisconnectedCallback: DisconnectedCallback | null;
24
- constructor(baseUrl?: string, options?: ClientOptions);
25
  listRooms(workspaceId: string): Promise<RoomInfo[]>;
26
  createRoom(workspaceId?: string, roomId?: string, config?: VideoConfig, recoveryConfig?: RecoveryConfig): Promise<{
27
  workspaceId: string;
 
21
  protected onErrorCallback: ErrorCallback | null;
22
  protected onConnectedCallback: ConnectedCallback | null;
23
  protected onDisconnectedCallback: DisconnectedCallback | null;
24
+ constructor(baseUrl: string, options?: ClientOptions);
25
  listRooms(workspaceId: string): Promise<RoomInfo[]>;
26
  createRoom(workspaceId?: string, roomId?: string, config?: VideoConfig, recoveryConfig?: RecoveryConfig): Promise<{
27
  workspaceId: string;
client/js/dist/video/factory.d.ts CHANGED
@@ -7,12 +7,12 @@ import type { ParticipantRole, ClientOptions } from './types.js';
7
  /**
8
  * Factory function to create the appropriate client based on role
9
  */
10
- export declare function createClient(role: ParticipantRole, baseUrl?: string, options?: ClientOptions): VideoProducer | VideoConsumer;
11
  /**
12
  * Create and connect a producer client
13
  */
14
- export declare function createProducerClient(baseUrl?: string, workspaceId?: string, roomId?: string, participantId?: string, options?: ClientOptions): Promise<VideoProducer>;
15
  /**
16
  * Create and connect a consumer client
17
  */
18
- export declare function createConsumerClient(workspaceId: string, roomId: string, baseUrl?: string, participantId?: string, options?: ClientOptions): Promise<VideoConsumer>;
 
7
  /**
8
  * Factory function to create the appropriate client based on role
9
  */
10
+ export declare function createClient(role: ParticipantRole, baseUrl: string, options?: ClientOptions): VideoProducer | VideoConsumer;
11
  /**
12
  * Create and connect a producer client
13
  */
14
+ export declare function createProducerClient(baseUrl: string, workspaceId?: string, roomId?: string, participantId?: string, options?: ClientOptions): Promise<VideoProducer>;
15
  /**
16
  * Create and connect a consumer client
17
  */
18
+ export declare function createConsumerClient(workspaceId: string, roomId: string, baseUrl: string, participantId?: string, options?: ClientOptions): Promise<VideoConsumer>;
client/js/dist/video/producer.d.ts CHANGED
@@ -5,7 +5,7 @@ import { VideoClientCore } from './core.js';
5
  import type { WebSocketMessage, ClientOptions, VideoConfig } from './types.js';
6
  export declare class VideoProducer extends VideoClientCore {
7
  private consumerConnections;
8
- constructor(baseUrl?: string, options?: ClientOptions);
9
  connect(workspaceId: string, roomId: string, participantId?: string): Promise<boolean>;
10
  private connectToExistingConsumers;
11
  private createPeerConnectionForConsumer;
@@ -28,7 +28,7 @@ export declare class VideoProducer extends VideoClientCore {
28
  /**
29
  * Create a room and automatically connect as producer
30
  */
31
- static createAndConnect(baseUrl?: string, workspaceId?: string, roomId?: string, participantId?: string): Promise<VideoProducer>;
32
  /**
33
  * Get the current room ID (useful when auto-created)
34
  */
 
5
  import type { WebSocketMessage, ClientOptions, VideoConfig } from './types.js';
6
  export declare class VideoProducer extends VideoClientCore {
7
  private consumerConnections;
8
+ constructor(baseUrl: string, options?: ClientOptions);
9
  connect(workspaceId: string, roomId: string, participantId?: string): Promise<boolean>;
10
  private connectToExistingConsumers;
11
  private createPeerConnectionForConsumer;
 
28
  /**
29
  * Create a room and automatically connect as producer
30
  */
31
+ static createAndConnect(baseUrl: string, workspaceId?: string, roomId?: string, participantId?: string): Promise<VideoProducer>;
32
  /**
33
  * Get the current room ID (useful when auto-created)
34
  */
client/js/dist/video/types.d.ts CHANGED
@@ -1,6 +1,5 @@
1
  /**
2
  * Type definitions for RobotHub TransportServer Video Client
3
- * ✅ Fully synchronized with server-side models.py
4
  */
5
  export type ParticipantRole = 'producer' | 'consumer';
6
  export type MessageType = 'frame_update' | 'video_config_update' | 'stream_started' | 'stream_stopped' | 'recovery_triggered' | 'heartbeat' | 'heartbeat_ack' | 'emergency_stop' | 'joined' | 'error' | 'participant_joined' | 'participant_left' | 'webrtc_offer' | 'webrtc_answer' | 'webrtc_ice' | 'status_update' | 'stream_stats';
 
1
  /**
2
  * Type definitions for RobotHub TransportServer Video Client
 
3
  */
4
  export type ParticipantRole = 'producer' | 'consumer';
5
  export type MessageType = 'frame_update' | 'video_config_update' | 'stream_started' | 'stream_stopped' | 'recovery_triggered' | 'heartbeat' | 'heartbeat_ack' | 'emergency_stop' | 'joined' | 'error' | 'participant_joined' | 'participant_left' | 'webrtc_offer' | 'webrtc_answer' | 'webrtc_ice' | 'status_update' | 'stream_stats';
demo/bun.lock CHANGED
@@ -25,7 +25,7 @@
25
  "tailwindcss": "^4.0.0",
26
  "typescript": "^5.0.0",
27
  "typescript-eslint": "^8.20.0",
28
- "vite": "^6.2.6",
29
  },
30
  },
31
  },
 
25
  "tailwindcss": "^4.0.0",
26
  "typescript": "^5.0.0",
27
  "typescript-eslint": "^8.20.0",
28
+ "vite": "6.3.5",
29
  },
30
  },
31
  },
demo/package.json CHANGED
@@ -32,7 +32,7 @@
32
  "tailwindcss": "^4.0.0",
33
  "typescript": "^5.0.0",
34
  "typescript-eslint": "^8.20.0",
35
- "vite": "^6.2.6"
36
  },
37
  "dependencies": {
38
  "@robothub/transport-server-client": "file:../client/js"
 
32
  "tailwindcss": "^4.0.0",
33
  "typescript": "^5.0.0",
34
  "typescript-eslint": "^8.20.0",
35
+ "vite": "7.0.0"
36
  },
37
  "dependencies": {
38
  "@robothub/transport-server-client": "file:../client/js"
demo/src/lib/settings.svelte.ts CHANGED
@@ -1,9 +1,9 @@
1
- import { PUBLIC_TRANSPORT_SERVER_URL } from '$env/static/public';
2
 
3
  interface Settings {
4
  transportServerUrl: string;
5
  }
6
 
7
  export const settings: Settings = $state({
8
- transportServerUrl: PUBLIC_TRANSPORT_SERVER_URL ?? 'http://localhost:8000'
9
  });
 
1
+ import { env } from '$env/dynamic/public';
2
 
3
  interface Settings {
4
  transportServerUrl: string;
5
  }
6
 
7
  export const settings: Settings = $state({
8
+ transportServerUrl: env.PUBLIC_TRANSPORT_SERVER_URL ?? 'http://localhost:8000'
9
  });
demo/src/routes/[workspaceId]/+page.svelte CHANGED
@@ -2,7 +2,7 @@
2
  import { onMount } from 'svelte';
3
  import { robotics, video } from '@robothub/transport-server-client';
4
  import type { robotics as roboticsTypes, video as videoTypes } from '@robothub/transport-server-client';
5
- import { settings } from '$lib/settings.svelte.js';
6
 
7
 
8
  // Get data from load function
 
2
  import { onMount } from 'svelte';
3
  import { robotics, video } from '@robothub/transport-server-client';
4
  import type { robotics as roboticsTypes, video as videoTypes } from '@robothub/transport-server-client';
5
+ import { settings } from '$lib/settings.svelte';
6
 
7
 
8
  // Get data from load function
demo/src/routes/[workspaceId]/robotics/+page.svelte CHANGED
@@ -2,7 +2,7 @@
2
  import { onMount } from 'svelte';
3
  import { robotics } from '@robothub/transport-server-client';
4
  import type { robotics as roboticsTypes } from '@robothub/transport-server-client';
5
- import { settings } from '$lib/settings.svelte.js';
6
 
7
 
8
  // Get data from load function
 
2
  import { onMount } from 'svelte';
3
  import { robotics } from '@robothub/transport-server-client';
4
  import type { robotics as roboticsTypes } from '@robothub/transport-server-client';
5
+ import { settings } from '$lib/settings.svelte';
6
 
7
 
8
  // Get data from load function
demo/src/routes/[workspaceId]/robotics/consumer/+page.svelte CHANGED
@@ -2,7 +2,7 @@
2
  import { onMount } from 'svelte';
3
  import { robotics } from '@robothub/transport-server-client';
4
  import type { robotics as roboticsTypes } from '@robothub/transport-server-client';
5
- import { settings } from '$lib/settings.svelte.js';
6
 
7
 
8
  // Get data from load function
 
2
  import { onMount } from 'svelte';
3
  import { robotics } from '@robothub/transport-server-client';
4
  import type { robotics as roboticsTypes } from '@robothub/transport-server-client';
5
+ import { settings } from '$lib/settings.svelte';
6
 
7
 
8
  // Get data from load function
demo/src/routes/[workspaceId]/robotics/producer/+page.svelte CHANGED
@@ -1,7 +1,7 @@
1
  <script lang="ts">
2
  import { onMount } from 'svelte';
3
  import { robotics } from '@robothub/transport-server-client';
4
- import { settings } from '$lib/settings.svelte.js';
5
 
6
 
7
  // Get data from load function
@@ -439,9 +439,9 @@
439
  {@const limits = jointLimits[jointName as JointName]}
440
  <div class="rounded border bg-gray-50 p-4">
441
  <div class="mb-2 flex items-center justify-between">
442
- <label class="font-mono text-sm font-medium capitalize text-gray-700">
443
  {jointName.replace(/([A-Z])/g, ' $1').replace(/^./, (str) => str.toUpperCase())}
444
- </label>
445
  <span class="font-mono text-sm font-bold text-blue-600">
446
  {value.toFixed(1)}°
447
  </span>
@@ -515,54 +515,3 @@
515
  </div>
516
  {/if}
517
  </div>
518
-
519
- <style>
520
- .robot-slider {
521
- -webkit-appearance: none;
522
- appearance: none;
523
- height: 8px;
524
- border-radius: 4px;
525
- background: #e5e7eb;
526
- outline: none;
527
- transition: background 0.3s ease;
528
- }
529
-
530
- .robot-slider:hover {
531
- background: #d1d5db;
532
- }
533
-
534
- .robot-slider::-webkit-slider-thumb {
535
- -webkit-appearance: none;
536
- appearance: none;
537
- width: 24px;
538
- height: 24px;
539
- border-radius: 50%;
540
- background: #3b82f6;
541
- cursor: pointer;
542
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
543
- transition: all 0.2s ease;
544
- }
545
-
546
- .robot-slider::-webkit-slider-thumb:hover {
547
- background: #2563eb;
548
- transform: scale(1.1);
549
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
550
- }
551
-
552
- .robot-slider::-moz-range-thumb {
553
- width: 24px;
554
- height: 24px;
555
- border-radius: 50%;
556
- background: #3b82f6;
557
- cursor: pointer;
558
- border: none;
559
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
560
- transition: all 0.2s ease;
561
- }
562
-
563
- .robot-slider::-moz-range-thumb:hover {
564
- background: #2563eb;
565
- transform: scale(1.1);
566
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
567
- }
568
- </style>
 
1
  <script lang="ts">
2
  import { onMount } from 'svelte';
3
  import { robotics } from '@robothub/transport-server-client';
4
+ import { settings } from '$lib/settings.svelte';
5
 
6
 
7
  // Get data from load function
 
439
  {@const limits = jointLimits[jointName as JointName]}
440
  <div class="rounded border bg-gray-50 p-4">
441
  <div class="mb-2 flex items-center justify-between">
442
+ <div class="font-mono text-sm font-medium capitalize text-gray-700">
443
  {jointName.replace(/([A-Z])/g, ' $1').replace(/^./, (str) => str.toUpperCase())}
444
+ </div>
445
  <span class="font-mono text-sm font-bold text-blue-600">
446
  {value.toFixed(1)}°
447
  </span>
 
515
  </div>
516
  {/if}
517
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
demo/src/routes/[workspaceId]/video/+page.svelte CHANGED
@@ -2,7 +2,7 @@
2
  import { onMount } from 'svelte';
3
  import { video } from '@robothub/transport-server-client';
4
  import type { video as videoTypes } from '@robothub/transport-server-client';
5
- import { settings } from '$lib/settings.svelte.js';
6
 
7
 
8
  // Get data from load function
 
2
  import { onMount } from 'svelte';
3
  import { video } from '@robothub/transport-server-client';
4
  import type { video as videoTypes } from '@robothub/transport-server-client';
5
+ import { settings } from '$lib/settings.svelte';
6
 
7
 
8
  // Get data from load function
demo/src/routes/[workspaceId]/video/consumer/+page.svelte CHANGED
@@ -1,7 +1,7 @@
1
  <script lang="ts">
2
  import { onMount } from 'svelte';
3
  import { video } from '@robothub/transport-server-client';
4
- import { settings } from '$lib/settings.svelte.js';
5
 
6
 
7
  // Get data from load function
 
1
  <script lang="ts">
2
  import { onMount } from 'svelte';
3
  import { video } from '@robothub/transport-server-client';
4
+ import { settings } from '$lib/settings.svelte';
5
 
6
 
7
  // Get data from load function
demo/src/routes/[workspaceId]/video/producer/+page.svelte CHANGED
@@ -1,7 +1,7 @@
1
  <script lang="ts">
2
  import { onMount } from 'svelte';
3
  import { video } from '@robothub/transport-server-client';
4
- import { settings } from '$lib/settings.svelte.js';
5
 
6
 
7
  // Get data from load function
@@ -416,9 +416,9 @@
416
 
417
  <!-- Quality Presets -->
418
  <div>
419
- <label class="mb-2 block font-mono text-sm font-medium text-gray-700">
420
  Quality Presets
421
- </label>
422
  <div class="grid grid-cols-1 gap-2">
423
  {#each qualityPresets as preset}
424
  <button
 
1
  <script lang="ts">
2
  import { onMount } from 'svelte';
3
  import { video } from '@robothub/transport-server-client';
4
+ import { settings } from '$lib/settings.svelte';
5
 
6
 
7
  // Get data from load function
 
416
 
417
  <!-- Quality Presets -->
418
  <div>
419
+ <div class="mb-2 block font-mono text-sm font-medium text-gray-700">
420
  Quality Presets
421
+ </div>
422
  <div class="grid grid-cols-1 gap-2">
423
  {#each qualityPresets as preset}
424
  <button
server/uv.lock CHANGED
@@ -144,44 +144,44 @@ wheels = [
144
 
145
  [[package]]
146
  name = "coverage"
147
- version = "7.8.2"
148
- source = { registry = "https://pypi.org/simple" }
149
- sdist = { url = "https://files.pythonhosted.org/packages/ba/07/998afa4a0ecdf9b1981ae05415dad2d4e7716e1b1f00abbd91691ac09ac9/coverage-7.8.2.tar.gz", hash = "sha256:a886d531373a1f6ff9fad2a2ba4a045b68467b779ae729ee0b3b10ac20033b27", size = 812759, upload-time = "2025-05-23T11:39:57.856Z" }
150
- wheels = [
151
- { url = "https://files.pythonhosted.org/packages/8d/2a/1da1ada2e3044fcd4a3254fb3576e160b8fe5b36d705c8a31f793423f763/coverage-7.8.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e2f6fe3654468d061942591aef56686131335b7a8325684eda85dacdf311356c", size = 211876, upload-time = "2025-05-23T11:38:29.01Z" },
152
- { url = "https://files.pythonhosted.org/packages/70/e9/3d715ffd5b6b17a8be80cd14a8917a002530a99943cc1939ad5bb2aa74b9/coverage-7.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76090fab50610798cc05241bf83b603477c40ee87acd358b66196ab0ca44ffa1", size = 212130, upload-time = "2025-05-23T11:38:30.675Z" },
153
- { url = "https://files.pythonhosted.org/packages/a0/02/fdce62bb3c21649abfd91fbdcf041fb99be0d728ff00f3f9d54d97ed683e/coverage-7.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bd0a0a5054be160777a7920b731a0570284db5142abaaf81bcbb282b8d99279", size = 246176, upload-time = "2025-05-23T11:38:32.395Z" },
154
- { url = "https://files.pythonhosted.org/packages/a7/52/decbbed61e03b6ffe85cd0fea360a5e04a5a98a7423f292aae62423b8557/coverage-7.8.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da23ce9a3d356d0affe9c7036030b5c8f14556bd970c9b224f9c8205505e3b99", size = 243068, upload-time = "2025-05-23T11:38:33.989Z" },
155
- { url = "https://files.pythonhosted.org/packages/38/6c/d0e9c0cce18faef79a52778219a3c6ee8e336437da8eddd4ab3dbd8fadff/coverage-7.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9392773cffeb8d7e042a7b15b82a414011e9d2b5fdbbd3f7e6a6b17d5e21b20", size = 245328, upload-time = "2025-05-23T11:38:35.568Z" },
156
- { url = "https://files.pythonhosted.org/packages/f0/70/f703b553a2f6b6c70568c7e398ed0789d47f953d67fbba36a327714a7bca/coverage-7.8.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:876cbfd0b09ce09d81585d266c07a32657beb3eaec896f39484b631555be0fe2", size = 245099, upload-time = "2025-05-23T11:38:37.627Z" },
157
- { url = "https://files.pythonhosted.org/packages/ec/fb/4cbb370dedae78460c3aacbdad9d249e853f3bc4ce5ff0e02b1983d03044/coverage-7.8.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3da9b771c98977a13fbc3830f6caa85cae6c9c83911d24cb2d218e9394259c57", size = 243314, upload-time = "2025-05-23T11:38:39.238Z" },
158
- { url = "https://files.pythonhosted.org/packages/39/9f/1afbb2cb9c8699b8bc38afdce00a3b4644904e6a38c7bf9005386c9305ec/coverage-7.8.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a990f6510b3292686713bfef26d0049cd63b9c7bb17e0864f133cbfd2e6167f", size = 244489, upload-time = "2025-05-23T11:38:40.845Z" },
159
- { url = "https://files.pythonhosted.org/packages/79/fa/f3e7ec7d220bff14aba7a4786ae47043770cbdceeea1803083059c878837/coverage-7.8.2-cp312-cp312-win32.whl", hash = "sha256:bf8111cddd0f2b54d34e96613e7fbdd59a673f0cf5574b61134ae75b6f5a33b8", size = 214366, upload-time = "2025-05-23T11:38:43.551Z" },
160
- { url = "https://files.pythonhosted.org/packages/54/aa/9cbeade19b7e8e853e7ffc261df885d66bf3a782c71cba06c17df271f9e6/coverage-7.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:86a323a275e9e44cdf228af9b71c5030861d4d2610886ab920d9945672a81223", size = 215165, upload-time = "2025-05-23T11:38:45.148Z" },
161
- { url = "https://files.pythonhosted.org/packages/c4/73/e2528bf1237d2448f882bbebaec5c3500ef07301816c5c63464b9da4d88a/coverage-7.8.2-cp312-cp312-win_arm64.whl", hash = "sha256:820157de3a589e992689ffcda8639fbabb313b323d26388d02e154164c57b07f", size = 213548, upload-time = "2025-05-23T11:38:46.74Z" },
162
- { url = "https://files.pythonhosted.org/packages/1a/93/eb6400a745ad3b265bac36e8077fdffcf0268bdbbb6c02b7220b624c9b31/coverage-7.8.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ea561010914ec1c26ab4188aef8b1567272ef6de096312716f90e5baa79ef8ca", size = 211898, upload-time = "2025-05-23T11:38:49.066Z" },
163
- { url = "https://files.pythonhosted.org/packages/1b/7c/bdbf113f92683024406a1cd226a199e4200a2001fc85d6a6e7e299e60253/coverage-7.8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cb86337a4fcdd0e598ff2caeb513ac604d2f3da6d53df2c8e368e07ee38e277d", size = 212171, upload-time = "2025-05-23T11:38:51.207Z" },
164
- { url = "https://files.pythonhosted.org/packages/91/22/594513f9541a6b88eb0dba4d5da7d71596dadef6b17a12dc2c0e859818a9/coverage-7.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26a4636ddb666971345541b59899e969f3b301143dd86b0ddbb570bd591f1e85", size = 245564, upload-time = "2025-05-23T11:38:52.857Z" },
165
- { url = "https://files.pythonhosted.org/packages/1f/f4/2860fd6abeebd9f2efcfe0fd376226938f22afc80c1943f363cd3c28421f/coverage-7.8.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5040536cf9b13fb033f76bcb5e1e5cb3b57c4807fef37db9e0ed129c6a094257", size = 242719, upload-time = "2025-05-23T11:38:54.529Z" },
166
- { url = "https://files.pythonhosted.org/packages/89/60/f5f50f61b6332451520e6cdc2401700c48310c64bc2dd34027a47d6ab4ca/coverage-7.8.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc67994df9bcd7e0150a47ef41278b9e0a0ea187caba72414b71dc590b99a108", size = 244634, upload-time = "2025-05-23T11:38:57.326Z" },
167
- { url = "https://files.pythonhosted.org/packages/3b/70/7f4e919039ab7d944276c446b603eea84da29ebcf20984fb1fdf6e602028/coverage-7.8.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e6c86888fd076d9e0fe848af0a2142bf606044dc5ceee0aa9eddb56e26895a0", size = 244824, upload-time = "2025-05-23T11:38:59.421Z" },
168
- { url = "https://files.pythonhosted.org/packages/26/45/36297a4c0cea4de2b2c442fe32f60c3991056c59cdc3cdd5346fbb995c97/coverage-7.8.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:684ca9f58119b8e26bef860db33524ae0365601492e86ba0b71d513f525e7050", size = 242872, upload-time = "2025-05-23T11:39:01.049Z" },
169
- { url = "https://files.pythonhosted.org/packages/a4/71/e041f1b9420f7b786b1367fa2a375703889ef376e0d48de9f5723fb35f11/coverage-7.8.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8165584ddedb49204c4e18da083913bdf6a982bfb558632a79bdaadcdafd0d48", size = 244179, upload-time = "2025-05-23T11:39:02.709Z" },
170
- { url = "https://files.pythonhosted.org/packages/bd/db/3c2bf49bdc9de76acf2491fc03130c4ffc51469ce2f6889d2640eb563d77/coverage-7.8.2-cp313-cp313-win32.whl", hash = "sha256:34759ee2c65362163699cc917bdb2a54114dd06d19bab860725f94ef45a3d9b7", size = 214393, upload-time = "2025-05-23T11:39:05.457Z" },
171
- { url = "https://files.pythonhosted.org/packages/c6/dc/947e75d47ebbb4b02d8babb1fad4ad381410d5bc9da7cfca80b7565ef401/coverage-7.8.2-cp313-cp313-win_amd64.whl", hash = "sha256:2f9bc608fbafaee40eb60a9a53dbfb90f53cc66d3d32c2849dc27cf5638a21e3", size = 215194, upload-time = "2025-05-23T11:39:07.171Z" },
172
- { url = "https://files.pythonhosted.org/packages/90/31/a980f7df8a37eaf0dc60f932507fda9656b3a03f0abf188474a0ea188d6d/coverage-7.8.2-cp313-cp313-win_arm64.whl", hash = "sha256:9fe449ee461a3b0c7105690419d0b0aba1232f4ff6d120a9e241e58a556733f7", size = 213580, upload-time = "2025-05-23T11:39:08.862Z" },
173
- { url = "https://files.pythonhosted.org/packages/8a/6a/25a37dd90f6c95f59355629417ebcb74e1c34e38bb1eddf6ca9b38b0fc53/coverage-7.8.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8369a7c8ef66bded2b6484053749ff220dbf83cba84f3398c84c51a6f748a008", size = 212734, upload-time = "2025-05-23T11:39:11.109Z" },
174
- { url = "https://files.pythonhosted.org/packages/36/8b/3a728b3118988725f40950931abb09cd7f43b3c740f4640a59f1db60e372/coverage-7.8.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:159b81df53a5fcbc7d45dae3adad554fdbde9829a994e15227b3f9d816d00b36", size = 212959, upload-time = "2025-05-23T11:39:12.751Z" },
175
- { url = "https://files.pythonhosted.org/packages/53/3c/212d94e6add3a3c3f412d664aee452045ca17a066def8b9421673e9482c4/coverage-7.8.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6fcbbd35a96192d042c691c9e0c49ef54bd7ed865846a3c9d624c30bb67ce46", size = 257024, upload-time = "2025-05-23T11:39:15.569Z" },
176
- { url = "https://files.pythonhosted.org/packages/a4/40/afc03f0883b1e51bbe804707aae62e29c4e8c8bbc365c75e3e4ddeee9ead/coverage-7.8.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05364b9cc82f138cc86128dc4e2e1251c2981a2218bfcd556fe6b0fbaa3501be", size = 252867, upload-time = "2025-05-23T11:39:17.64Z" },
177
- { url = "https://files.pythonhosted.org/packages/18/a2/3699190e927b9439c6ded4998941a3c1d6fa99e14cb28d8536729537e307/coverage-7.8.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46d532db4e5ff3979ce47d18e2fe8ecad283eeb7367726da0e5ef88e4fe64740", size = 255096, upload-time = "2025-05-23T11:39:19.328Z" },
178
- { url = "https://files.pythonhosted.org/packages/b4/06/16e3598b9466456b718eb3e789457d1a5b8bfb22e23b6e8bbc307df5daf0/coverage-7.8.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4000a31c34932e7e4fa0381a3d6deb43dc0c8f458e3e7ea6502e6238e10be625", size = 256276, upload-time = "2025-05-23T11:39:21.077Z" },
179
- { url = "https://files.pythonhosted.org/packages/a7/d5/4b5a120d5d0223050a53d2783c049c311eea1709fa9de12d1c358e18b707/coverage-7.8.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:43ff5033d657cd51f83015c3b7a443287250dc14e69910577c3e03bd2e06f27b", size = 254478, upload-time = "2025-05-23T11:39:22.838Z" },
180
- { url = "https://files.pythonhosted.org/packages/ba/85/f9ecdb910ecdb282b121bfcaa32fa8ee8cbd7699f83330ee13ff9bbf1a85/coverage-7.8.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94316e13f0981cbbba132c1f9f365cac1d26716aaac130866ca812006f662199", size = 255255, upload-time = "2025-05-23T11:39:24.644Z" },
181
- { url = "https://files.pythonhosted.org/packages/50/63/2d624ac7d7ccd4ebbd3c6a9eba9d7fc4491a1226071360d59dd84928ccb2/coverage-7.8.2-cp313-cp313t-win32.whl", hash = "sha256:3f5673888d3676d0a745c3d0e16da338c5eea300cb1f4ada9c872981265e76d8", size = 215109, upload-time = "2025-05-23T11:39:26.722Z" },
182
- { url = "https://files.pythonhosted.org/packages/22/5e/7053b71462e970e869111c1853afd642212568a350eba796deefdfbd0770/coverage-7.8.2-cp313-cp313t-win_amd64.whl", hash = "sha256:2c08b05ee8d7861e45dc5a2cc4195c8c66dca5ac613144eb6ebeaff2d502e73d", size = 216268, upload-time = "2025-05-23T11:39:28.429Z" },
183
- { url = "https://files.pythonhosted.org/packages/07/69/afa41aa34147655543dbe96994f8a246daf94b361ccf5edfd5df62ce066a/coverage-7.8.2-cp313-cp313t-win_arm64.whl", hash = "sha256:1e1448bb72b387755e1ff3ef1268a06617afd94188164960dba8d0245a46004b", size = 214071, upload-time = "2025-05-23T11:39:30.55Z" },
184
- { url = "https://files.pythonhosted.org/packages/a0/1a/0b9c32220ad694d66062f571cc5cedfa9997b64a591e8a500bb63de1bd40/coverage-7.8.2-py3-none-any.whl", hash = "sha256:726f32ee3713f7359696331a18daf0c3b3a70bb0ae71141b9d3c52be7c595e32", size = 203623, upload-time = "2025-05-23T11:39:53.846Z" },
185
  ]
186
 
187
  [[package]]
@@ -476,11 +476,11 @@ wheels = [
476
 
477
  [[package]]
478
  name = "pygments"
479
- version = "2.19.1"
480
  source = { registry = "https://pypi.org/simple" }
481
- sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581, upload-time = "2025-01-06T17:26:30.443Z" }
482
  wheels = [
483
- { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293, upload-time = "2025-01-06T17:26:25.553Z" },
484
  ]
485
 
486
  [[package]]
@@ -561,11 +561,11 @@ wheels = [
561
 
562
  [[package]]
563
  name = "python-dotenv"
564
- version = "1.1.0"
565
  source = { registry = "https://pypi.org/simple" }
566
- sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920, upload-time = "2025-03-25T10:14:56.835Z" }
567
  wheels = [
568
- { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256, upload-time = "2025-03-25T10:14:55.034Z" },
569
  ]
570
 
571
  [[package]]
@@ -721,38 +721,69 @@ wheels = [
721
 
722
  [[package]]
723
  name = "watchfiles"
724
- version = "1.0.5"
725
  source = { registry = "https://pypi.org/simple" }
726
  dependencies = [
727
  { name = "anyio" },
728
  ]
729
- sdist = { url = "https://files.pythonhosted.org/packages/03/e2/8ed598c42057de7aa5d97c472254af4906ff0a59a66699d426fc9ef795d7/watchfiles-1.0.5.tar.gz", hash = "sha256:b7529b5dcc114679d43827d8c35a07c493ad6f083633d573d81c660abc5979e9", size = 94537, upload-time = "2025-04-08T10:36:26.722Z" }
730
- wheels = [
731
- { url = "https://files.pythonhosted.org/packages/2a/8c/4f0b9bdb75a1bfbd9c78fad7d8854369283f74fe7cf03eb16be77054536d/watchfiles-1.0.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b5eb568c2aa6018e26da9e6c86f3ec3fd958cee7f0311b35c2630fa4217d17f2", size = 401511, upload-time = "2025-04-08T10:35:17.956Z" },
732
- { url = "https://files.pythonhosted.org/packages/dc/4e/7e15825def77f8bd359b6d3f379f0c9dac4eb09dd4ddd58fd7d14127179c/watchfiles-1.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0a04059f4923ce4e856b4b4e5e783a70f49d9663d22a4c3b3298165996d1377f", size = 392715, upload-time = "2025-04-08T10:35:19.202Z" },
733
- { url = "https://files.pythonhosted.org/packages/58/65/b72fb817518728e08de5840d5d38571466c1b4a3f724d190cec909ee6f3f/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e380c89983ce6e6fe2dd1e1921b9952fb4e6da882931abd1824c092ed495dec", size = 454138, upload-time = "2025-04-08T10:35:20.586Z" },
734
- { url = "https://files.pythonhosted.org/packages/3e/a4/86833fd2ea2e50ae28989f5950b5c3f91022d67092bfec08f8300d8b347b/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fe43139b2c0fdc4a14d4f8d5b5d967f7a2777fd3d38ecf5b1ec669b0d7e43c21", size = 458592, upload-time = "2025-04-08T10:35:21.87Z" },
735
- { url = "https://files.pythonhosted.org/packages/38/7e/42cb8df8be9a37e50dd3a818816501cf7a20d635d76d6bd65aae3dbbff68/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee0822ce1b8a14fe5a066f93edd20aada932acfe348bede8aa2149f1a4489512", size = 487532, upload-time = "2025-04-08T10:35:23.143Z" },
736
- { url = "https://files.pythonhosted.org/packages/fc/fd/13d26721c85d7f3df6169d8b495fcac8ab0dc8f0945ebea8845de4681dab/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a0dbcb1c2d8f2ab6e0a81c6699b236932bd264d4cef1ac475858d16c403de74d", size = 522865, upload-time = "2025-04-08T10:35:24.702Z" },
737
- { url = "https://files.pythonhosted.org/packages/a1/0d/7f9ae243c04e96c5455d111e21b09087d0eeaf9a1369e13a01c7d3d82478/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a2014a2b18ad3ca53b1f6c23f8cd94a18ce930c1837bd891262c182640eb40a6", size = 499887, upload-time = "2025-04-08T10:35:25.969Z" },
738
- { url = "https://files.pythonhosted.org/packages/8e/0f/a257766998e26aca4b3acf2ae97dff04b57071e991a510857d3799247c67/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f6ae86d5cb647bf58f9f655fcf577f713915a5d69057a0371bc257e2553234", size = 454498, upload-time = "2025-04-08T10:35:27.353Z" },
739
- { url = "https://files.pythonhosted.org/packages/81/79/8bf142575a03e0af9c3d5f8bcae911ee6683ae93a625d349d4ecf4c8f7df/watchfiles-1.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1a7bac2bde1d661fb31f4d4e8e539e178774b76db3c2c17c4bb3e960a5de07a2", size = 630663, upload-time = "2025-04-08T10:35:28.685Z" },
740
- { url = "https://files.pythonhosted.org/packages/f1/80/abe2e79f610e45c63a70d271caea90c49bbf93eb00fa947fa9b803a1d51f/watchfiles-1.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ab626da2fc1ac277bbf752446470b367f84b50295264d2d313e28dc4405d663", size = 625410, upload-time = "2025-04-08T10:35:30.42Z" },
741
- { url = "https://files.pythonhosted.org/packages/91/6f/bc7fbecb84a41a9069c2c6eb6319f7f7df113adf113e358c57fc1aff7ff5/watchfiles-1.0.5-cp312-cp312-win32.whl", hash = "sha256:9f4571a783914feda92018ef3901dab8caf5b029325b5fe4558c074582815249", size = 277965, upload-time = "2025-04-08T10:35:32.023Z" },
742
- { url = "https://files.pythonhosted.org/packages/99/a5/bf1c297ea6649ec59e935ab311f63d8af5faa8f0b86993e3282b984263e3/watchfiles-1.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:360a398c3a19672cf93527f7e8d8b60d8275119c5d900f2e184d32483117a705", size = 291693, upload-time = "2025-04-08T10:35:33.225Z" },
743
- { url = "https://files.pythonhosted.org/packages/7f/7b/fd01087cc21db5c47e5beae507b87965db341cce8a86f9eb12bf5219d4e0/watchfiles-1.0.5-cp312-cp312-win_arm64.whl", hash = "sha256:1a2902ede862969077b97523987c38db28abbe09fb19866e711485d9fbf0d417", size = 283287, upload-time = "2025-04-08T10:35:34.568Z" },
744
- { url = "https://files.pythonhosted.org/packages/c7/62/435766874b704f39b2fecd8395a29042db2b5ec4005bd34523415e9bd2e0/watchfiles-1.0.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0b289572c33a0deae62daa57e44a25b99b783e5f7aed81b314232b3d3c81a11d", size = 401531, upload-time = "2025-04-08T10:35:35.792Z" },
745
- { url = "https://files.pythonhosted.org/packages/6e/a6/e52a02c05411b9cb02823e6797ef9bbba0bfaf1bb627da1634d44d8af833/watchfiles-1.0.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a056c2f692d65bf1e99c41045e3bdcaea3cb9e6b5a53dcaf60a5f3bd95fc9763", size = 392417, upload-time = "2025-04-08T10:35:37.048Z" },
746
- { url = "https://files.pythonhosted.org/packages/3f/53/c4af6819770455932144e0109d4854437769672d7ad897e76e8e1673435d/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9dca99744991fc9850d18015c4f0438865414e50069670f5f7eee08340d8b40", size = 453423, upload-time = "2025-04-08T10:35:38.357Z" },
747
- { url = "https://files.pythonhosted.org/packages/cb/d1/8e88df58bbbf819b8bc5cfbacd3c79e01b40261cad0fc84d1e1ebd778a07/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:894342d61d355446d02cd3988a7326af344143eb33a2fd5d38482a92072d9563", size = 458185, upload-time = "2025-04-08T10:35:39.708Z" },
748
- { url = "https://files.pythonhosted.org/packages/ff/70/fffaa11962dd5429e47e478a18736d4e42bec42404f5ee3b92ef1b87ad60/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab44e1580924d1ffd7b3938e02716d5ad190441965138b4aa1d1f31ea0877f04", size = 486696, upload-time = "2025-04-08T10:35:41.469Z" },
749
- { url = "https://files.pythonhosted.org/packages/39/db/723c0328e8b3692d53eb273797d9a08be6ffb1d16f1c0ba2bdbdc2a3852c/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6f9367b132078b2ceb8d066ff6c93a970a18c3029cea37bfd7b2d3dd2e5db8f", size = 522327, upload-time = "2025-04-08T10:35:43.289Z" },
750
- { url = "https://files.pythonhosted.org/packages/cd/05/9fccc43c50c39a76b68343484b9da7b12d42d0859c37c61aec018c967a32/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2e55a9b162e06e3f862fb61e399fe9f05d908d019d87bf5b496a04ef18a970a", size = 499741, upload-time = "2025-04-08T10:35:44.574Z" },
751
- { url = "https://files.pythonhosted.org/packages/23/14/499e90c37fa518976782b10a18b18db9f55ea73ca14641615056f8194bb3/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0125f91f70e0732a9f8ee01e49515c35d38ba48db507a50c5bdcad9503af5827", size = 453995, upload-time = "2025-04-08T10:35:46.336Z" },
752
- { url = "https://files.pythonhosted.org/packages/61/d9/f75d6840059320df5adecd2c687fbc18960a7f97b55c300d20f207d48aef/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:13bb21f8ba3248386337c9fa51c528868e6c34a707f729ab041c846d52a0c69a", size = 629693, upload-time = "2025-04-08T10:35:48.161Z" },
753
- { url = "https://files.pythonhosted.org/packages/fc/17/180ca383f5061b61406477218c55d66ec118e6c0c51f02d8142895fcf0a9/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:839ebd0df4a18c5b3c1b890145b5a3f5f64063c2a0d02b13c76d78fe5de34936", size = 624677, upload-time = "2025-04-08T10:35:49.65Z" },
754
- { url = "https://files.pythonhosted.org/packages/bf/15/714d6ef307f803f236d69ee9d421763707899d6298d9f3183e55e366d9af/watchfiles-1.0.5-cp313-cp313-win32.whl", hash = "sha256:4a8ec1e4e16e2d5bafc9ba82f7aaecfeec990ca7cd27e84fb6f191804ed2fcfc", size = 277804, upload-time = "2025-04-08T10:35:51.093Z" },
755
- { url = "https://files.pythonhosted.org/packages/a8/b4/c57b99518fadf431f3ef47a610839e46e5f8abf9814f969859d1c65c02c7/watchfiles-1.0.5-cp313-cp313-win_amd64.whl", hash = "sha256:f436601594f15bf406518af922a89dcaab416568edb6f65c4e5bbbad1ea45c11", size = 291087, upload-time = "2025-04-08T10:35:52.458Z" },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
756
  ]
757
 
758
  [[package]]
 
144
 
145
  [[package]]
146
  name = "coverage"
147
+ version = "7.9.1"
148
+ source = { registry = "https://pypi.org/simple" }
149
+ sdist = { url = "https://files.pythonhosted.org/packages/e7/e0/98670a80884f64578f0c22cd70c5e81a6e07b08167721c7487b4d70a7ca0/coverage-7.9.1.tar.gz", hash = "sha256:6cf43c78c4282708a28e466316935ec7489a9c487518a77fa68f716c67909cec", size = 813650, upload-time = "2025-06-13T13:02:28.627Z" }
150
+ wheels = [
151
+ { url = "https://files.pythonhosted.org/packages/68/d9/7f66eb0a8f2fce222de7bdc2046ec41cb31fe33fb55a330037833fb88afc/coverage-7.9.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a8de12b4b87c20de895f10567639c0797b621b22897b0af3ce4b4e204a743626", size = 212336, upload-time = "2025-06-13T13:01:10.909Z" },
152
+ { url = "https://files.pythonhosted.org/packages/20/20/e07cb920ef3addf20f052ee3d54906e57407b6aeee3227a9c91eea38a665/coverage-7.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5add197315a054e92cee1b5f686a2bcba60c4c3e66ee3de77ace6c867bdee7cb", size = 212571, upload-time = "2025-06-13T13:01:12.518Z" },
153
+ { url = "https://files.pythonhosted.org/packages/78/f8/96f155de7e9e248ca9c8ff1a40a521d944ba48bec65352da9be2463745bf/coverage-7.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:600a1d4106fe66f41e5d0136dfbc68fe7200a5cbe85610ddf094f8f22e1b0300", size = 246377, upload-time = "2025-06-13T13:01:14.87Z" },
154
+ { url = "https://files.pythonhosted.org/packages/3e/cf/1d783bd05b7bca5c10ded5f946068909372e94615a4416afadfe3f63492d/coverage-7.9.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a876e4c3e5a2a1715a6608906aa5a2e0475b9c0f68343c2ada98110512ab1d8", size = 243394, upload-time = "2025-06-13T13:01:16.23Z" },
155
+ { url = "https://files.pythonhosted.org/packages/02/dd/e7b20afd35b0a1abea09fb3998e1abc9f9bd953bee548f235aebd2b11401/coverage-7.9.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81f34346dd63010453922c8e628a52ea2d2ccd73cb2487f7700ac531b247c8a5", size = 245586, upload-time = "2025-06-13T13:01:17.532Z" },
156
+ { url = "https://files.pythonhosted.org/packages/4e/38/b30b0006fea9d617d1cb8e43b1bc9a96af11eff42b87eb8c716cf4d37469/coverage-7.9.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:888f8eee13f2377ce86d44f338968eedec3291876b0b8a7289247ba52cb984cd", size = 245396, upload-time = "2025-06-13T13:01:19.164Z" },
157
+ { url = "https://files.pythonhosted.org/packages/31/e4/4d8ec1dc826e16791f3daf1b50943e8e7e1eb70e8efa7abb03936ff48418/coverage-7.9.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9969ef1e69b8c8e1e70d591f91bbc37fc9a3621e447525d1602801a24ceda898", size = 243577, upload-time = "2025-06-13T13:01:22.433Z" },
158
+ { url = "https://files.pythonhosted.org/packages/25/f4/b0e96c5c38e6e40ef465c4bc7f138863e2909c00e54a331da335faf0d81a/coverage-7.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:60c458224331ee3f1a5b472773e4a085cc27a86a0b48205409d364272d67140d", size = 244809, upload-time = "2025-06-13T13:01:24.143Z" },
159
+ { url = "https://files.pythonhosted.org/packages/8a/65/27e0a1fa5e2e5079bdca4521be2f5dabf516f94e29a0defed35ac2382eb2/coverage-7.9.1-cp312-cp312-win32.whl", hash = "sha256:5f646a99a8c2b3ff4c6a6e081f78fad0dde275cd59f8f49dc4eab2e394332e74", size = 214724, upload-time = "2025-06-13T13:01:25.435Z" },
160
+ { url = "https://files.pythonhosted.org/packages/9b/a8/d5b128633fd1a5e0401a4160d02fa15986209a9e47717174f99dc2f7166d/coverage-7.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:30f445f85c353090b83e552dcbbdad3ec84c7967e108c3ae54556ca69955563e", size = 215535, upload-time = "2025-06-13T13:01:27.861Z" },
161
+ { url = "https://files.pythonhosted.org/packages/a3/37/84bba9d2afabc3611f3e4325ee2c6a47cd449b580d4a606b240ce5a6f9bf/coverage-7.9.1-cp312-cp312-win_arm64.whl", hash = "sha256:af41da5dca398d3474129c58cb2b106a5d93bbb196be0d307ac82311ca234342", size = 213904, upload-time = "2025-06-13T13:01:29.202Z" },
162
+ { url = "https://files.pythonhosted.org/packages/d0/a7/a027970c991ca90f24e968999f7d509332daf6b8c3533d68633930aaebac/coverage-7.9.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:31324f18d5969feef7344a932c32428a2d1a3e50b15a6404e97cba1cc9b2c631", size = 212358, upload-time = "2025-06-13T13:01:30.909Z" },
163
+ { url = "https://files.pythonhosted.org/packages/f2/48/6aaed3651ae83b231556750280682528fea8ac7f1232834573472d83e459/coverage-7.9.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0c804506d624e8a20fb3108764c52e0eef664e29d21692afa375e0dd98dc384f", size = 212620, upload-time = "2025-06-13T13:01:32.256Z" },
164
+ { url = "https://files.pythonhosted.org/packages/6c/2a/f4b613f3b44d8b9f144847c89151992b2b6b79cbc506dee89ad0c35f209d/coverage-7.9.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef64c27bc40189f36fcc50c3fb8f16ccda73b6a0b80d9bd6e6ce4cffcd810bbd", size = 245788, upload-time = "2025-06-13T13:01:33.948Z" },
165
+ { url = "https://files.pythonhosted.org/packages/04/d2/de4fdc03af5e4e035ef420ed26a703c6ad3d7a07aff2e959eb84e3b19ca8/coverage-7.9.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4fe2348cc6ec372e25adec0219ee2334a68d2f5222e0cba9c0d613394e12d86", size = 243001, upload-time = "2025-06-13T13:01:35.285Z" },
166
+ { url = "https://files.pythonhosted.org/packages/f5/e8/eed18aa5583b0423ab7f04e34659e51101135c41cd1dcb33ac1d7013a6d6/coverage-7.9.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34ed2186fe52fcc24d4561041979a0dec69adae7bce2ae8d1c49eace13e55c43", size = 244985, upload-time = "2025-06-13T13:01:36.712Z" },
167
+ { url = "https://files.pythonhosted.org/packages/17/f8/ae9e5cce8885728c934eaa58ebfa8281d488ef2afa81c3dbc8ee9e6d80db/coverage-7.9.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:25308bd3d00d5eedd5ae7d4357161f4df743e3c0240fa773ee1b0f75e6c7c0f1", size = 245152, upload-time = "2025-06-13T13:01:39.303Z" },
168
+ { url = "https://files.pythonhosted.org/packages/5a/c8/272c01ae792bb3af9b30fac14d71d63371db227980682836ec388e2c57c0/coverage-7.9.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:73e9439310f65d55a5a1e0564b48e34f5369bee943d72c88378f2d576f5a5751", size = 243123, upload-time = "2025-06-13T13:01:40.727Z" },
169
+ { url = "https://files.pythonhosted.org/packages/8c/d0/2819a1e3086143c094ab446e3bdf07138527a7b88cb235c488e78150ba7a/coverage-7.9.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:37ab6be0859141b53aa89412a82454b482c81cf750de4f29223d52268a86de67", size = 244506, upload-time = "2025-06-13T13:01:42.184Z" },
170
+ { url = "https://files.pythonhosted.org/packages/8b/4e/9f6117b89152df7b6112f65c7a4ed1f2f5ec8e60c4be8f351d91e7acc848/coverage-7.9.1-cp313-cp313-win32.whl", hash = "sha256:64bdd969456e2d02a8b08aa047a92d269c7ac1f47e0c977675d550c9a0863643", size = 214766, upload-time = "2025-06-13T13:01:44.482Z" },
171
+ { url = "https://files.pythonhosted.org/packages/27/0f/4b59f7c93b52c2c4ce7387c5a4e135e49891bb3b7408dcc98fe44033bbe0/coverage-7.9.1-cp313-cp313-win_amd64.whl", hash = "sha256:be9e3f68ca9edb897c2184ad0eee815c635565dbe7a0e7e814dc1f7cbab92c0a", size = 215568, upload-time = "2025-06-13T13:01:45.772Z" },
172
+ { url = "https://files.pythonhosted.org/packages/09/1e/9679826336f8c67b9c39a359352882b24a8a7aee48d4c9cad08d38d7510f/coverage-7.9.1-cp313-cp313-win_arm64.whl", hash = "sha256:1c503289ffef1d5105d91bbb4d62cbe4b14bec4d13ca225f9c73cde9bb46207d", size = 213939, upload-time = "2025-06-13T13:01:47.087Z" },
173
+ { url = "https://files.pythonhosted.org/packages/bb/5b/5c6b4e7a407359a2e3b27bf9c8a7b658127975def62077d441b93a30dbe8/coverage-7.9.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0b3496922cb5f4215bf5caaef4cf12364a26b0be82e9ed6d050f3352cf2d7ef0", size = 213079, upload-time = "2025-06-13T13:01:48.554Z" },
174
+ { url = "https://files.pythonhosted.org/packages/a2/22/1e2e07279fd2fd97ae26c01cc2186e2258850e9ec125ae87184225662e89/coverage-7.9.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9565c3ab1c93310569ec0d86b017f128f027cab0b622b7af288696d7ed43a16d", size = 213299, upload-time = "2025-06-13T13:01:49.997Z" },
175
+ { url = "https://files.pythonhosted.org/packages/14/c0/4c5125a4b69d66b8c85986d3321520f628756cf524af810baab0790c7647/coverage-7.9.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2241ad5dbf79ae1d9c08fe52b36d03ca122fb9ac6bca0f34439e99f8327ac89f", size = 256535, upload-time = "2025-06-13T13:01:51.314Z" },
176
+ { url = "https://files.pythonhosted.org/packages/81/8b/e36a04889dda9960be4263e95e777e7b46f1bb4fc32202612c130a20c4da/coverage-7.9.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bb5838701ca68b10ebc0937dbd0eb81974bac54447c55cd58dea5bca8451029", size = 252756, upload-time = "2025-06-13T13:01:54.403Z" },
177
+ { url = "https://files.pythonhosted.org/packages/98/82/be04eff8083a09a4622ecd0e1f31a2c563dbea3ed848069e7b0445043a70/coverage-7.9.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b30a25f814591a8c0c5372c11ac8967f669b97444c47fd794926e175c4047ece", size = 254912, upload-time = "2025-06-13T13:01:56.769Z" },
178
+ { url = "https://files.pythonhosted.org/packages/0f/25/c26610a2c7f018508a5ab958e5b3202d900422cf7cdca7670b6b8ca4e8df/coverage-7.9.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2d04b16a6062516df97969f1ae7efd0de9c31eb6ebdceaa0d213b21c0ca1a683", size = 256144, upload-time = "2025-06-13T13:01:58.19Z" },
179
+ { url = "https://files.pythonhosted.org/packages/c5/8b/fb9425c4684066c79e863f1e6e7ecebb49e3a64d9f7f7860ef1688c56f4a/coverage-7.9.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7931b9e249edefb07cd6ae10c702788546341d5fe44db5b6108a25da4dca513f", size = 254257, upload-time = "2025-06-13T13:01:59.645Z" },
180
+ { url = "https://files.pythonhosted.org/packages/93/df/27b882f54157fc1131e0e215b0da3b8d608d9b8ef79a045280118a8f98fe/coverage-7.9.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:52e92b01041151bf607ee858e5a56c62d4b70f4dac85b8c8cb7fb8a351ab2c10", size = 255094, upload-time = "2025-06-13T13:02:01.37Z" },
181
+ { url = "https://files.pythonhosted.org/packages/41/5f/cad1c3dbed8b3ee9e16fa832afe365b4e3eeab1fb6edb65ebbf745eabc92/coverage-7.9.1-cp313-cp313t-win32.whl", hash = "sha256:684e2110ed84fd1ca5f40e89aa44adf1729dc85444004111aa01866507adf363", size = 215437, upload-time = "2025-06-13T13:02:02.905Z" },
182
+ { url = "https://files.pythonhosted.org/packages/99/4d/fad293bf081c0e43331ca745ff63673badc20afea2104b431cdd8c278b4c/coverage-7.9.1-cp313-cp313t-win_amd64.whl", hash = "sha256:437c576979e4db840539674e68c84b3cda82bc824dd138d56bead1435f1cb5d7", size = 216605, upload-time = "2025-06-13T13:02:05.638Z" },
183
+ { url = "https://files.pythonhosted.org/packages/1f/56/4ee027d5965fc7fc126d7ec1187529cc30cc7d740846e1ecb5e92d31b224/coverage-7.9.1-cp313-cp313t-win_arm64.whl", hash = "sha256:18a0912944d70aaf5f399e350445738a1a20b50fbea788f640751c2ed9208b6c", size = 214392, upload-time = "2025-06-13T13:02:07.642Z" },
184
+ { url = "https://files.pythonhosted.org/packages/08/b8/7ddd1e8ba9701dea08ce22029917140e6f66a859427406579fd8d0ca7274/coverage-7.9.1-py3-none-any.whl", hash = "sha256:66b974b145aa189516b6bf2d8423e888b742517d37872f6ee4c5be0073bd9a3c", size = 204000, upload-time = "2025-06-13T13:02:27.173Z" },
185
  ]
186
 
187
  [[package]]
 
476
 
477
  [[package]]
478
  name = "pygments"
479
+ version = "2.19.2"
480
  source = { registry = "https://pypi.org/simple" }
481
+ sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" }
482
  wheels = [
483
+ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" },
484
  ]
485
 
486
  [[package]]
 
561
 
562
  [[package]]
563
  name = "python-dotenv"
564
+ version = "1.1.1"
565
  source = { registry = "https://pypi.org/simple" }
566
+ sdist = { url = "https://files.pythonhosted.org/packages/f6/b0/4bc07ccd3572a2f9df7e6782f52b0c6c90dcbb803ac4a167702d7d0dfe1e/python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab", size = 41978, upload-time = "2025-06-24T04:21:07.341Z" }
567
  wheels = [
568
+ { url = "https://files.pythonhosted.org/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556, upload-time = "2025-06-24T04:21:06.073Z" },
569
  ]
570
 
571
  [[package]]
 
721
 
722
  [[package]]
723
  name = "watchfiles"
724
+ version = "1.1.0"
725
  source = { registry = "https://pypi.org/simple" }
726
  dependencies = [
727
  { name = "anyio" },
728
  ]
729
+ sdist = { url = "https://files.pythonhosted.org/packages/2a/9a/d451fcc97d029f5812e898fd30a53fd8c15c7bbd058fd75cfc6beb9bd761/watchfiles-1.1.0.tar.gz", hash = "sha256:693ed7ec72cbfcee399e92c895362b6e66d63dac6b91e2c11ae03d10d503e575", size = 94406, upload-time = "2025-06-15T19:06:59.42Z" }
730
+ wheels = [
731
+ { url = "https://files.pythonhosted.org/packages/f6/b8/858957045a38a4079203a33aaa7d23ea9269ca7761c8a074af3524fbb240/watchfiles-1.1.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9dc001c3e10de4725c749d4c2f2bdc6ae24de5a88a339c4bce32300a31ede179", size = 402339, upload-time = "2025-06-15T19:05:24.516Z" },
732
+ { url = "https://files.pythonhosted.org/packages/80/28/98b222cca751ba68e88521fabd79a4fab64005fc5976ea49b53fa205d1fa/watchfiles-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d9ba68ec283153dead62cbe81872d28e053745f12335d037de9cbd14bd1877f5", size = 394409, upload-time = "2025-06-15T19:05:25.469Z" },
733
+ { url = "https://files.pythonhosted.org/packages/86/50/dee79968566c03190677c26f7f47960aff738d32087087bdf63a5473e7df/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130fc497b8ee68dce163e4254d9b0356411d1490e868bd8790028bc46c5cc297", size = 450939, upload-time = "2025-06-15T19:05:26.494Z" },
734
+ { url = "https://files.pythonhosted.org/packages/40/45/a7b56fb129700f3cfe2594a01aa38d033b92a33dddce86c8dfdfc1247b72/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:50a51a90610d0845a5931a780d8e51d7bd7f309ebc25132ba975aca016b576a0", size = 457270, upload-time = "2025-06-15T19:05:27.466Z" },
735
+ { url = "https://files.pythonhosted.org/packages/b5/c8/fa5ef9476b1d02dc6b5e258f515fcaaecf559037edf8b6feffcbc097c4b8/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc44678a72ac0910bac46fa6a0de6af9ba1355669b3dfaf1ce5f05ca7a74364e", size = 483370, upload-time = "2025-06-15T19:05:28.548Z" },
736
+ { url = "https://files.pythonhosted.org/packages/98/68/42cfcdd6533ec94f0a7aab83f759ec11280f70b11bfba0b0f885e298f9bd/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a543492513a93b001975ae283a51f4b67973662a375a403ae82f420d2c7205ee", size = 598654, upload-time = "2025-06-15T19:05:29.997Z" },
737
+ { url = "https://files.pythonhosted.org/packages/d3/74/b2a1544224118cc28df7e59008a929e711f9c68ce7d554e171b2dc531352/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ac164e20d17cc285f2b94dc31c384bc3aa3dd5e7490473b3db043dd70fbccfd", size = 478667, upload-time = "2025-06-15T19:05:31.172Z" },
738
+ { url = "https://files.pythonhosted.org/packages/8c/77/e3362fe308358dc9f8588102481e599c83e1b91c2ae843780a7ded939a35/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7590d5a455321e53857892ab8879dce62d1f4b04748769f5adf2e707afb9d4f", size = 452213, upload-time = "2025-06-15T19:05:32.299Z" },
739
+ { url = "https://files.pythonhosted.org/packages/6e/17/c8f1a36540c9a1558d4faf08e909399e8133599fa359bf52ec8fcee5be6f/watchfiles-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:37d3d3f7defb13f62ece99e9be912afe9dd8a0077b7c45ee5a57c74811d581a4", size = 626718, upload-time = "2025-06-15T19:05:33.415Z" },
740
+ { url = "https://files.pythonhosted.org/packages/26/45/fb599be38b4bd38032643783d7496a26a6f9ae05dea1a42e58229a20ac13/watchfiles-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7080c4bb3efd70a07b1cc2df99a7aa51d98685be56be6038c3169199d0a1c69f", size = 623098, upload-time = "2025-06-15T19:05:34.534Z" },
741
+ { url = "https://files.pythonhosted.org/packages/a1/e7/fdf40e038475498e160cd167333c946e45d8563ae4dd65caf757e9ffe6b4/watchfiles-1.1.0-cp312-cp312-win32.whl", hash = "sha256:cbcf8630ef4afb05dc30107bfa17f16c0896bb30ee48fc24bf64c1f970f3b1fd", size = 279209, upload-time = "2025-06-15T19:05:35.577Z" },
742
+ { url = "https://files.pythonhosted.org/packages/3f/d3/3ae9d5124ec75143bdf088d436cba39812122edc47709cd2caafeac3266f/watchfiles-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:cbd949bdd87567b0ad183d7676feb98136cde5bb9025403794a4c0db28ed3a47", size = 292786, upload-time = "2025-06-15T19:05:36.559Z" },
743
+ { url = "https://files.pythonhosted.org/packages/26/2f/7dd4fc8b5f2b34b545e19629b4a018bfb1de23b3a496766a2c1165ca890d/watchfiles-1.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:0a7d40b77f07be87c6faa93d0951a0fcd8cbca1ddff60a1b65d741bac6f3a9f6", size = 284343, upload-time = "2025-06-15T19:05:37.5Z" },
744
+ { url = "https://files.pythonhosted.org/packages/d3/42/fae874df96595556a9089ade83be34a2e04f0f11eb53a8dbf8a8a5e562b4/watchfiles-1.1.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5007f860c7f1f8df471e4e04aaa8c43673429047d63205d1630880f7637bca30", size = 402004, upload-time = "2025-06-15T19:05:38.499Z" },
745
+ { url = "https://files.pythonhosted.org/packages/fa/55/a77e533e59c3003d9803c09c44c3651224067cbe7fb5d574ddbaa31e11ca/watchfiles-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:20ecc8abbd957046f1fe9562757903f5eaf57c3bce70929fda6c7711bb58074a", size = 393671, upload-time = "2025-06-15T19:05:39.52Z" },
746
+ { url = "https://files.pythonhosted.org/packages/05/68/b0afb3f79c8e832e6571022611adbdc36e35a44e14f129ba09709aa4bb7a/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2f0498b7d2a3c072766dba3274fe22a183dbea1f99d188f1c6c72209a1063dc", size = 449772, upload-time = "2025-06-15T19:05:40.897Z" },
747
+ { url = "https://files.pythonhosted.org/packages/ff/05/46dd1f6879bc40e1e74c6c39a1b9ab9e790bf1f5a2fe6c08b463d9a807f4/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:239736577e848678e13b201bba14e89718f5c2133dfd6b1f7846fa1b58a8532b", size = 456789, upload-time = "2025-06-15T19:05:42.045Z" },
748
+ { url = "https://files.pythonhosted.org/packages/8b/ca/0eeb2c06227ca7f12e50a47a3679df0cd1ba487ea19cf844a905920f8e95/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eff4b8d89f444f7e49136dc695599a591ff769300734446c0a86cba2eb2f9895", size = 482551, upload-time = "2025-06-15T19:05:43.781Z" },
749
+ { url = "https://files.pythonhosted.org/packages/31/47/2cecbd8694095647406645f822781008cc524320466ea393f55fe70eed3b/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12b0a02a91762c08f7264e2e79542f76870c3040bbc847fb67410ab81474932a", size = 597420, upload-time = "2025-06-15T19:05:45.244Z" },
750
+ { url = "https://files.pythonhosted.org/packages/d9/7e/82abc4240e0806846548559d70f0b1a6dfdca75c1b4f9fa62b504ae9b083/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29e7bc2eee15cbb339c68445959108803dc14ee0c7b4eea556400131a8de462b", size = 477950, upload-time = "2025-06-15T19:05:46.332Z" },
751
+ { url = "https://files.pythonhosted.org/packages/25/0d/4d564798a49bf5482a4fa9416dea6b6c0733a3b5700cb8a5a503c4b15853/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9481174d3ed982e269c090f780122fb59cee6c3796f74efe74e70f7780ed94c", size = 451706, upload-time = "2025-06-15T19:05:47.459Z" },
752
+ { url = "https://files.pythonhosted.org/packages/81/b5/5516cf46b033192d544102ea07c65b6f770f10ed1d0a6d388f5d3874f6e4/watchfiles-1.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:80f811146831c8c86ab17b640801c25dc0a88c630e855e2bef3568f30434d52b", size = 625814, upload-time = "2025-06-15T19:05:48.654Z" },
753
+ { url = "https://files.pythonhosted.org/packages/0c/dd/7c1331f902f30669ac3e754680b6edb9a0dd06dea5438e61128111fadd2c/watchfiles-1.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:60022527e71d1d1fda67a33150ee42869042bce3d0fcc9cc49be009a9cded3fb", size = 622820, upload-time = "2025-06-15T19:05:50.088Z" },
754
+ { url = "https://files.pythonhosted.org/packages/1b/14/36d7a8e27cd128d7b1009e7715a7c02f6c131be9d4ce1e5c3b73d0e342d8/watchfiles-1.1.0-cp313-cp313-win32.whl", hash = "sha256:32d6d4e583593cb8576e129879ea0991660b935177c0f93c6681359b3654bfa9", size = 279194, upload-time = "2025-06-15T19:05:51.186Z" },
755
+ { url = "https://files.pythonhosted.org/packages/25/41/2dd88054b849aa546dbeef5696019c58f8e0774f4d1c42123273304cdb2e/watchfiles-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:f21af781a4a6fbad54f03c598ab620e3a77032c5878f3d780448421a6e1818c7", size = 292349, upload-time = "2025-06-15T19:05:52.201Z" },
756
+ { url = "https://files.pythonhosted.org/packages/c8/cf/421d659de88285eb13941cf11a81f875c176f76a6d99342599be88e08d03/watchfiles-1.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:5366164391873ed76bfdf618818c82084c9db7fac82b64a20c44d335eec9ced5", size = 283836, upload-time = "2025-06-15T19:05:53.265Z" },
757
+ { url = "https://files.pythonhosted.org/packages/45/10/6faf6858d527e3599cc50ec9fcae73590fbddc1420bd4fdccfebffeedbc6/watchfiles-1.1.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:17ab167cca6339c2b830b744eaf10803d2a5b6683be4d79d8475d88b4a8a4be1", size = 400343, upload-time = "2025-06-15T19:05:54.252Z" },
758
+ { url = "https://files.pythonhosted.org/packages/03/20/5cb7d3966f5e8c718006d0e97dfe379a82f16fecd3caa7810f634412047a/watchfiles-1.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:328dbc9bff7205c215a7807da7c18dce37da7da718e798356212d22696404339", size = 392916, upload-time = "2025-06-15T19:05:55.264Z" },
759
+ { url = "https://files.pythonhosted.org/packages/8c/07/d8f1176328fa9e9581b6f120b017e286d2a2d22ae3f554efd9515c8e1b49/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7208ab6e009c627b7557ce55c465c98967e8caa8b11833531fdf95799372633", size = 449582, upload-time = "2025-06-15T19:05:56.317Z" },
760
+ { url = "https://files.pythonhosted.org/packages/66/e8/80a14a453cf6038e81d072a86c05276692a1826471fef91df7537dba8b46/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a8f6f72974a19efead54195bc9bed4d850fc047bb7aa971268fd9a8387c89011", size = 456752, upload-time = "2025-06-15T19:05:57.359Z" },
761
+ { url = "https://files.pythonhosted.org/packages/5a/25/0853b3fe0e3c2f5af9ea60eb2e781eade939760239a72c2d38fc4cc335f6/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d181ef50923c29cf0450c3cd47e2f0557b62218c50b2ab8ce2ecaa02bd97e670", size = 481436, upload-time = "2025-06-15T19:05:58.447Z" },
762
+ { url = "https://files.pythonhosted.org/packages/fe/9e/4af0056c258b861fbb29dcb36258de1e2b857be4a9509e6298abcf31e5c9/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adb4167043d3a78280d5d05ce0ba22055c266cf8655ce942f2fb881262ff3cdf", size = 596016, upload-time = "2025-06-15T19:05:59.59Z" },
763
+ { url = "https://files.pythonhosted.org/packages/c5/fa/95d604b58aa375e781daf350897aaaa089cff59d84147e9ccff2447c8294/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5701dc474b041e2934a26d31d39f90fac8a3dee2322b39f7729867f932b1d4", size = 476727, upload-time = "2025-06-15T19:06:01.086Z" },
764
+ { url = "https://files.pythonhosted.org/packages/65/95/fe479b2664f19be4cf5ceeb21be05afd491d95f142e72d26a42f41b7c4f8/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b067915e3c3936966a8607f6fe5487df0c9c4afb85226613b520890049deea20", size = 451864, upload-time = "2025-06-15T19:06:02.144Z" },
765
+ { url = "https://files.pythonhosted.org/packages/d3/8a/3c4af14b93a15ce55901cd7a92e1a4701910f1768c78fb30f61d2b79785b/watchfiles-1.1.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:9c733cda03b6d636b4219625a4acb5c6ffb10803338e437fb614fef9516825ef", size = 625626, upload-time = "2025-06-15T19:06:03.578Z" },
766
+ { url = "https://files.pythonhosted.org/packages/da/f5/cf6aa047d4d9e128f4b7cde615236a915673775ef171ff85971d698f3c2c/watchfiles-1.1.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:cc08ef8b90d78bfac66f0def80240b0197008e4852c9f285907377b2947ffdcb", size = 622744, upload-time = "2025-06-15T19:06:05.066Z" },
767
+ { url = "https://files.pythonhosted.org/packages/2c/00/70f75c47f05dea6fd30df90f047765f6fc2d6eb8b5a3921379b0b04defa2/watchfiles-1.1.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:9974d2f7dc561cce3bb88dfa8eb309dab64c729de85fba32e98d75cf24b66297", size = 402114, upload-time = "2025-06-15T19:06:06.186Z" },
768
+ { url = "https://files.pythonhosted.org/packages/53/03/acd69c48db4a1ed1de26b349d94077cca2238ff98fd64393f3e97484cae6/watchfiles-1.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c68e9f1fcb4d43798ad8814c4c1b61547b014b667216cb754e606bfade587018", size = 393879, upload-time = "2025-06-15T19:06:07.369Z" },
769
+ { url = "https://files.pythonhosted.org/packages/2f/c8/a9a2a6f9c8baa4eceae5887fecd421e1b7ce86802bcfc8b6a942e2add834/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95ab1594377effac17110e1352989bdd7bdfca9ff0e5eeccd8c69c5389b826d0", size = 450026, upload-time = "2025-06-15T19:06:08.476Z" },
770
+ { url = "https://files.pythonhosted.org/packages/fe/51/d572260d98388e6e2b967425c985e07d47ee6f62e6455cefb46a6e06eda5/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fba9b62da882c1be1280a7584ec4515d0a6006a94d6e5819730ec2eab60ffe12", size = 457917, upload-time = "2025-06-15T19:06:09.988Z" },
771
+ { url = "https://files.pythonhosted.org/packages/c6/2d/4258e52917bf9f12909b6ec314ff9636276f3542f9d3807d143f27309104/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3434e401f3ce0ed6b42569128b3d1e3af773d7ec18751b918b89cd49c14eaafb", size = 483602, upload-time = "2025-06-15T19:06:11.088Z" },
772
+ { url = "https://files.pythonhosted.org/packages/84/99/bee17a5f341a4345fe7b7972a475809af9e528deba056f8963d61ea49f75/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa257a4d0d21fcbca5b5fcba9dca5a78011cb93c0323fb8855c6d2dfbc76eb77", size = 596758, upload-time = "2025-06-15T19:06:12.197Z" },
773
+ { url = "https://files.pythonhosted.org/packages/40/76/e4bec1d59b25b89d2b0716b41b461ed655a9a53c60dc78ad5771fda5b3e6/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7fd1b3879a578a8ec2076c7961076df540b9af317123f84569f5a9ddee64ce92", size = 477601, upload-time = "2025-06-15T19:06:13.391Z" },
774
+ { url = "https://files.pythonhosted.org/packages/1f/fa/a514292956f4a9ce3c567ec0c13cce427c158e9f272062685a8a727d08fc/watchfiles-1.1.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62cc7a30eeb0e20ecc5f4bd113cd69dcdb745a07c68c0370cea919f373f65d9e", size = 451936, upload-time = "2025-06-15T19:06:14.656Z" },
775
+ { url = "https://files.pythonhosted.org/packages/32/5d/c3bf927ec3bbeb4566984eba8dd7a8eb69569400f5509904545576741f88/watchfiles-1.1.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:891c69e027748b4a73847335d208e374ce54ca3c335907d381fde4e41661b13b", size = 626243, upload-time = "2025-06-15T19:06:16.232Z" },
776
+ { url = "https://files.pythonhosted.org/packages/e6/65/6e12c042f1a68c556802a84d54bb06d35577c81e29fba14019562479159c/watchfiles-1.1.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:12fe8eaffaf0faa7906895b4f8bb88264035b3f0243275e0bf24af0436b27259", size = 623073, upload-time = "2025-06-15T19:06:17.457Z" },
777
+ { url = "https://files.pythonhosted.org/packages/89/ab/7f79d9bf57329e7cbb0a6fd4c7bd7d0cee1e4a8ef0041459f5409da3506c/watchfiles-1.1.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:bfe3c517c283e484843cb2e357dd57ba009cff351edf45fb455b5fbd1f45b15f", size = 400872, upload-time = "2025-06-15T19:06:18.57Z" },
778
+ { url = "https://files.pythonhosted.org/packages/df/d5/3f7bf9912798e9e6c516094db6b8932df53b223660c781ee37607030b6d3/watchfiles-1.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a9ccbf1f129480ed3044f540c0fdbc4ee556f7175e5ab40fe077ff6baf286d4e", size = 392877, upload-time = "2025-06-15T19:06:19.55Z" },
779
+ { url = "https://files.pythonhosted.org/packages/0d/c5/54ec7601a2798604e01c75294770dbee8150e81c6e471445d7601610b495/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba0e3255b0396cac3cc7bbace76404dd72b5438bf0d8e7cefa2f79a7f3649caa", size = 449645, upload-time = "2025-06-15T19:06:20.66Z" },
780
+ { url = "https://files.pythonhosted.org/packages/0a/04/c2f44afc3b2fce21ca0b7802cbd37ed90a29874f96069ed30a36dfe57c2b/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4281cd9fce9fc0a9dbf0fc1217f39bf9cf2b4d315d9626ef1d4e87b84699e7e8", size = 457424, upload-time = "2025-06-15T19:06:21.712Z" },
781
+ { url = "https://files.pythonhosted.org/packages/9f/b0/eec32cb6c14d248095261a04f290636da3df3119d4040ef91a4a50b29fa5/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6d2404af8db1329f9a3c9b79ff63e0ae7131986446901582067d9304ae8aaf7f", size = 481584, upload-time = "2025-06-15T19:06:22.777Z" },
782
+ { url = "https://files.pythonhosted.org/packages/d1/e2/ca4bb71c68a937d7145aa25709e4f5d68eb7698a25ce266e84b55d591bbd/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e78b6ed8165996013165eeabd875c5dfc19d41b54f94b40e9fff0eb3193e5e8e", size = 596675, upload-time = "2025-06-15T19:06:24.226Z" },
783
+ { url = "https://files.pythonhosted.org/packages/a1/dd/b0e4b7fb5acf783816bc950180a6cd7c6c1d2cf7e9372c0ea634e722712b/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:249590eb75ccc117f488e2fabd1bfa33c580e24b96f00658ad88e38844a040bb", size = 477363, upload-time = "2025-06-15T19:06:25.42Z" },
784
+ { url = "https://files.pythonhosted.org/packages/69/c4/088825b75489cb5b6a761a4542645718893d395d8c530b38734f19da44d2/watchfiles-1.1.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d05686b5487cfa2e2c28ff1aa370ea3e6c5accfe6435944ddea1e10d93872147", size = 452240, upload-time = "2025-06-15T19:06:26.552Z" },
785
+ { url = "https://files.pythonhosted.org/packages/10/8c/22b074814970eeef43b7c44df98c3e9667c1f7bf5b83e0ff0201b0bd43f9/watchfiles-1.1.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:d0e10e6f8f6dc5762adee7dece33b722282e1f59aa6a55da5d493a97282fedd8", size = 625607, upload-time = "2025-06-15T19:06:27.606Z" },
786
+ { url = "https://files.pythonhosted.org/packages/32/fa/a4f5c2046385492b2273213ef815bf71a0d4c1943b784fb904e184e30201/watchfiles-1.1.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:af06c863f152005c7592df1d6a7009c836a247c9d8adb78fef8575a5a98699db", size = 623315, upload-time = "2025-06-15T19:06:29.076Z" },
787
  ]
788
 
789
  [[package]]