@agents-at-scale/ark 0.1.66 → 0.1.67

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.
@@ -1,27 +1,62 @@
1
1
  import { Command } from 'commander';
2
2
  import { execa } from 'execa';
3
3
  import output from '../../lib/output.js';
4
- async function importResources(filepath) {
5
- try {
6
- output.info(`importing ark resources from ${filepath}...`);
7
- const args = ['create', '-f', filepath];
8
- await execa('kubectl', args, {
9
- stdio: 'pipe',
10
- });
11
- output.success(`imported resources from ${filepath}`);
4
+ function countApplied(stdout) {
5
+ const counts = { created: 0, configured: 0, unchanged: 0 };
6
+ for (const line of stdout.split('\n')) {
7
+ const trimmed = line.trim();
8
+ if (trimmed.endsWith(' created')) {
9
+ counts.created++;
10
+ }
11
+ else if (trimmed.endsWith(' configured')) {
12
+ counts.configured++;
13
+ }
14
+ else if (trimmed.endsWith(' unchanged')) {
15
+ counts.unchanged++;
16
+ }
12
17
  }
13
- catch (error) {
14
- output.error('import failed:', error instanceof Error ? error.message : error);
18
+ return counts;
19
+ }
20
+ async function importResources(filepath, options) {
21
+ if (!options.upsert) {
22
+ try {
23
+ output.info(`importing ark resources from ${filepath}...`);
24
+ const args = ['create', '-f', filepath];
25
+ await execa('kubectl', args, {
26
+ stdio: 'pipe',
27
+ });
28
+ output.success(`imported resources from ${filepath}`);
29
+ }
30
+ catch (error) {
31
+ output.error('import failed:', error instanceof Error ? error.message : error);
32
+ process.exit(1);
33
+ }
34
+ return;
35
+ }
36
+ output.info(`importing ark resources from ${filepath} (upsert)...`);
37
+ const result = await execa('kubectl', ['apply', '-f', filepath], {
38
+ stdio: 'pipe',
39
+ reject: false,
40
+ });
41
+ const counts = countApplied(result.stdout ?? '');
42
+ if (result.exitCode !== 0) {
43
+ output.error(`import failed (${counts.created} created, ${counts.configured} configured, ${counts.unchanged} unchanged before errors):`);
44
+ const details = (result.stderr || result.stdout || '').trim();
45
+ if (details) {
46
+ output.error(details);
47
+ }
15
48
  process.exit(1);
16
49
  }
50
+ output.success(`import complete: ${counts.created} created, ${counts.configured} configured, ${counts.unchanged} unchanged`);
17
51
  }
18
52
  export function createImportCommand(_) {
19
53
  const importCommand = new Command('import');
20
54
  importCommand
21
55
  .description('import ARK resources from a file')
22
56
  .argument('<filepath>', 'input file path')
23
- .action(async (filepath) => {
24
- await importResources(filepath);
57
+ .option('--upsert', 'create or update resources (kubectl apply); allows re-import onto a cluster that already has some of these resources')
58
+ .action(async (filepath, options) => {
59
+ await importResources(filepath, options);
25
60
  });
26
61
  return importCommand;
27
62
  }
@@ -8,7 +8,7 @@ export function createQueryCommand(config) {
8
8
  .description('Execute a single query against a model or agent')
9
9
  .argument('<target>', 'Query target (e.g., model/default, agent/my-agent)')
10
10
  .argument('<message>', 'Message to send')
11
- .option('-o, --output <format>', 'Output format: yaml, json, name or events (shows structured event data)')
11
+ .option('-o, --output <format>', 'Output format: yaml, json, name, events (structured event data), or events-pretty (events with color-coded reasons and expanded key/value detail)')
12
12
  .option('--timeout <timeout>', 'Query timeout (e.g., 30s, 5m, 1h)')
13
13
  .option('-p, --parameter <name=value>', 'Template parameter in name=value format (can be used multiple times)', (val, acc) => [...acc, val], [])
14
14
  .option('--session-id <sessionId>', 'Session ID to associate with the query for conversation continuity')
@@ -137,6 +137,10 @@ async function executeQueryWithFormat(options) {
137
137
  await watchEventsLive(queryName);
138
138
  return;
139
139
  }
140
+ if (options.outputFormat === 'events-pretty') {
141
+ await watchEventsLive(queryName, true);
142
+ return;
143
+ }
140
144
  const timeoutSeconds = 300;
141
145
  await execa('kubectl', [
142
146
  'wait',
@@ -153,7 +157,7 @@ async function executeQueryWithFormat(options) {
153
157
  console.log(stdout);
154
158
  }
155
159
  else {
156
- console.error(chalk.red(`Invalid output format: ${options.outputFormat}. Use: yaml, json, name, or events`));
160
+ console.error(chalk.red(`Invalid output format: ${options.outputFormat}. Use: yaml, json, name, events, or events-pretty`));
157
161
  process.exit(ExitCodes.CliError);
158
162
  }
159
163
  }
@@ -0,0 +1,29 @@
1
+ export interface K8sEvent {
2
+ type?: string;
3
+ reason?: string;
4
+ eventTime?: string;
5
+ lastTimestamp?: string;
6
+ firstTimestamp?: string;
7
+ metadata?: {
8
+ uid?: string;
9
+ creationTimestamp?: string;
10
+ annotations?: Record<string, string>;
11
+ };
12
+ }
13
+ export declare function pad(value: number, width: number): string;
14
+ /**
15
+ * Derive an HH:MM:SS.mmm timestamp, preferring the event-data payload timestamp
16
+ * and falling back through the native Event time fields to wall-clock now.
17
+ */
18
+ export declare function formatEventTimestamp(event: K8sEvent): string;
19
+ /**
20
+ * Render the structured event-data payload as `message > key=value ...`.
21
+ * The message is clipped and colored red for Warning/Error events; trailing
22
+ * fields keep their full value. Non-object payloads are echoed as-is.
23
+ */
24
+ export declare function formatEventData(eventData: string, eventType?: string): string;
25
+ /**
26
+ * Format a Kubernetes Event carrying an ark event-data annotation into a
27
+ * single human-readable line. Returns null when the event has no payload.
28
+ */
29
+ export declare function formatEvent(event: K8sEvent): string | null;
@@ -0,0 +1,138 @@
1
+ import chalk from 'chalk';
2
+ import { EVENT_ANNOTATIONS } from './constants.js';
3
+ /**
4
+ * Shape of the JSON carried in the `ark.mckinsey.com/event-data` annotation:
5
+ *
6
+ * {
7
+ * "durationMs": "7084.30",
8
+ * "input": "ok?",
9
+ * "message": "Query execution completed",
10
+ * "queryId": "0b61250b-...",
11
+ * "queryName": "cli-query-1784110137509",
12
+ * "queryNamespace": "ark-system",
13
+ * "sessionId": "0b61250b-...",
14
+ * "targetType": "model",
15
+ * "timestamp": "2026-07-15T10:09:04.602422162Z"
16
+ * }
17
+ */
18
+ const NUMERIC = /^-?\d+(\.\d+)?$/;
19
+ const MAX_MESSAGE_LENGTH = 120;
20
+ // Fields rendered first (in this order); everything else is sorted alphabetically.
21
+ const FIELD_PRIORITY = { input: 0, durationMs: 1 };
22
+ // Keys pulled out of the trailing field list because they are rendered elsewhere.
23
+ const RESERVED_KEYS = new Set(['message', 'timestamp']);
24
+ export function pad(value, width) {
25
+ return value.toString().padStart(width, '0');
26
+ }
27
+ function parseEventData(raw) {
28
+ if (!raw) {
29
+ return null;
30
+ }
31
+ try {
32
+ const parsed = JSON.parse(raw);
33
+ return parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)
34
+ ? parsed
35
+ : null;
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
41
+ function firstValidDate(candidates) {
42
+ for (const candidate of candidates) {
43
+ if (!candidate) {
44
+ continue;
45
+ }
46
+ const date = new Date(candidate);
47
+ if (!Number.isNaN(date.getTime())) {
48
+ return date;
49
+ }
50
+ }
51
+ return new Date();
52
+ }
53
+ function truncate(value, max = MAX_MESSAGE_LENGTH) {
54
+ return value.length > max ? `${value.slice(0, max)}…` : value;
55
+ }
56
+ /**
57
+ * Derive an HH:MM:SS.mmm timestamp, preferring the event-data payload timestamp
58
+ * and falling back through the native Event time fields to wall-clock now.
59
+ */
60
+ export function formatEventTimestamp(event) {
61
+ const data = parseEventData(event.metadata?.annotations?.[EVENT_ANNOTATIONS.EVENT_DATA]);
62
+ const dataTimestamp = typeof data?.timestamp === 'string' ? data.timestamp : undefined;
63
+ const date = firstValidDate([
64
+ dataTimestamp,
65
+ event.eventTime,
66
+ event.lastTimestamp,
67
+ event.firstTimestamp,
68
+ event.metadata?.creationTimestamp,
69
+ ]);
70
+ return `${pad(date.getHours(), 2)}:${pad(date.getMinutes(), 2)}:${pad(date.getSeconds(), 2)}.${pad(date.getMilliseconds(), 3)}`;
71
+ }
72
+ function colorReason(reason, eventType) {
73
+ if (eventType === 'Warning') {
74
+ return chalk.yellow(reason);
75
+ }
76
+ if (eventType === 'Normal') {
77
+ return chalk.green(reason);
78
+ }
79
+ return chalk.red(reason);
80
+ }
81
+ function isErrorType(eventType) {
82
+ return eventType === 'Warning' || eventType === 'Error';
83
+ }
84
+ function compareKeys(a, b) {
85
+ const rank = (key) => FIELD_PRIORITY[key] ?? Number.MAX_SAFE_INTEGER;
86
+ return rank(a) - rank(b) || a.localeCompare(b);
87
+ }
88
+ function renderFieldValue(key, value) {
89
+ if (typeof value === 'number') {
90
+ return chalk.green(String(value));
91
+ }
92
+ if (value !== null && typeof value === 'object') {
93
+ return chalk.white(JSON.stringify(value));
94
+ }
95
+ const str = String(value);
96
+ if (NUMERIC.test(str)) {
97
+ return chalk.green(str);
98
+ }
99
+ return chalk.white(key === 'input' ? `"${str}"` : str);
100
+ }
101
+ /**
102
+ * Render the structured event-data payload as `message > key=value ...`.
103
+ * The message is clipped and colored red for Warning/Error events; trailing
104
+ * fields keep their full value. Non-object payloads are echoed as-is.
105
+ */
106
+ export function formatEventData(eventData, eventType = 'Normal') {
107
+ const data = parseEventData(eventData);
108
+ if (!data) {
109
+ return ` ${eventData}`;
110
+ }
111
+ const messageColor = isErrorType(eventType) ? chalk.red : chalk.white;
112
+ const messagePart = typeof data.message === 'string'
113
+ ? ` ${messageColor(truncate(data.message))}`
114
+ : '';
115
+ const fields = Object.keys(data)
116
+ .filter((key) => !RESERVED_KEYS.has(key))
117
+ .sort(compareKeys)
118
+ .map((key) => `${chalk.blue(key)}${chalk.dim('=')}${renderFieldValue(key, data[key])}`)
119
+ .join(' ');
120
+ if (!fields) {
121
+ return messagePart;
122
+ }
123
+ return `${messagePart} ${chalk.dim('>')} ${fields}`;
124
+ }
125
+ /**
126
+ * Format a Kubernetes Event carrying an ark event-data annotation into a
127
+ * single human-readable line. Returns null when the event has no payload.
128
+ */
129
+ export function formatEvent(event) {
130
+ const eventData = event.metadata?.annotations?.[EVENT_ANNOTATIONS.EVENT_DATA];
131
+ if (!eventData) {
132
+ return null;
133
+ }
134
+ const timestamp = formatEventTimestamp(event);
135
+ const reason = event.reason || 'Unknown';
136
+ const eventType = event.type || 'Normal';
137
+ return `${chalk.dim(timestamp)} [${colorReason(reason, eventType)}]${formatEventData(eventData, eventType)}`;
138
+ }
@@ -14,5 +14,5 @@ export declare function deleteResource(resourceType: string, name?: string, opti
14
14
  all?: boolean;
15
15
  }): Promise<void>;
16
16
  export declare function replaceResource<T extends K8sResource>(resource: T): Promise<T>;
17
- export declare function watchEventsLive(queryName: string): Promise<void>;
17
+ export declare function watchEventsLive(queryName: string, pretty?: boolean): Promise<void>;
18
18
  export {};
@@ -1,6 +1,7 @@
1
1
  import { execa } from 'execa';
2
2
  import chalk from 'chalk';
3
3
  import { EVENT_ANNOTATIONS } from './constants.js';
4
+ import { formatEvent } from './formatEvent.js';
4
5
  export async function getResource(resourceType, name) {
5
6
  if (name === '@latest') {
6
7
  const result = await execa('kubectl', [
@@ -53,7 +54,7 @@ export async function replaceResource(resource) {
53
54
  });
54
55
  return JSON.parse(result.stdout);
55
56
  }
56
- export async function watchEventsLive(queryName) {
57
+ export async function watchEventsLive(queryName, pretty = false) {
57
58
  const seenEvents = new Set();
58
59
  const pollEvents = async () => {
59
60
  try {
@@ -73,16 +74,24 @@ export async function watchEventsLive(queryName) {
73
74
  const annotations = event.metadata?.annotations || {};
74
75
  const eventData = annotations[EVENT_ANNOTATIONS.EVENT_DATA];
75
76
  if (eventData) {
76
- const now = new Date();
77
- const hours = now.getHours().toString().padStart(2, '0');
78
- const minutes = now.getMinutes().toString().padStart(2, '0');
79
- const seconds = now.getSeconds().toString().padStart(2, '0');
80
- const millis = now.getMilliseconds().toString().padStart(3, '0');
81
- const timestamp = `${hours}:${minutes}:${seconds}.${millis}`;
82
- const reason = event.reason || 'Unknown';
83
- const eventType = event.type || 'Normal';
84
- const colorCode = eventType === 'Normal' ? 32 : eventType === 'Warning' ? 33 : 31;
85
- console.log(`${timestamp} \x1b[${colorCode}m${reason}\x1b[0m ${eventData}`);
77
+ if (pretty) {
78
+ const line = formatEvent(event);
79
+ if (line !== null) {
80
+ console.log(line);
81
+ }
82
+ }
83
+ else {
84
+ const now = new Date();
85
+ const hours = now.getHours().toString().padStart(2, '0');
86
+ const minutes = now.getMinutes().toString().padStart(2, '0');
87
+ const seconds = now.getSeconds().toString().padStart(2, '0');
88
+ const millis = now.getMilliseconds().toString().padStart(3, '0');
89
+ const timestamp = `${hours}:${minutes}:${seconds}.${millis}`;
90
+ const reason = event.reason || 'Unknown';
91
+ const eventType = event.type || 'Normal';
92
+ const colorCode = eventType === 'Normal' ? 32 : eventType === 'Warning' ? 33 : 31;
93
+ console.log(`${timestamp} \x1b[${colorCode}m${reason}\x1b[0m ${eventData}`);
94
+ }
86
95
  }
87
96
  }
88
97
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agents-at-scale/ark",
3
- "version": "0.1.66",
3
+ "version": "0.1.67",
4
4
  "description": "Ark CLI - Interactive terminal interface for ARK agents",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -93,7 +93,7 @@
93
93
  "flatted": "^3.4.2",
94
94
  "tar": "^7.5.11",
95
95
  "express-rate-limit": "^8.3.0",
96
- "fast-uri": "^3.1.3",
96
+ "fast-uri": "^3.1.4",
97
97
  "ws": "^8.21.0",
98
98
  "esbuild": "^0.28.1",
99
99
  "form-data": "^4.0.6"
@@ -1,6 +1,12 @@
1
1
  version = 1
2
2
  revision = 3
3
3
  requires-python = ">=3.12"
4
+ resolution-markers = [
5
+ "python_full_version >= '3.14' and sys_platform == 'win32'",
6
+ "python_full_version >= '3.14' and sys_platform != 'win32'",
7
+ "python_full_version < '3.14' and sys_platform == 'win32'",
8
+ "python_full_version < '3.14' and sys_platform != 'win32'",
9
+ ]
4
10
 
5
11
  [[package]]
6
12
  name = "aiofile"
@@ -321,7 +327,8 @@ dependencies = [
321
327
  { name = "packaging" },
322
328
  { name = "platformdirs" },
323
329
  { name = "py-key-value-aio", extra = ["filetree", "keyring", "memory"] },
324
- { name = "pydantic", extra = ["email"] },
330
+ { name = "pydantic", version = "2.11.7", source = { registry = "https://pypi.org/simple" }, extra = ["email"], marker = "python_full_version < '3.14'" },
331
+ { name = "pydantic", version = "2.13.4", source = { registry = "https://pypi.org/simple" }, extra = ["email"], marker = "python_full_version >= '3.14'" },
325
332
  { name = "pyperclip" },
326
333
  { name = "python-dotenv" },
327
334
  { name = "pyyaml" },
@@ -526,14 +533,15 @@ wheels = [
526
533
 
527
534
  [[package]]
528
535
  name = "mcp"
529
- version = "1.26.0"
536
+ version = "1.28.1"
530
537
  source = { registry = "https://pypi.org/simple" }
531
538
  dependencies = [
532
539
  { name = "anyio" },
533
540
  { name = "httpx" },
534
541
  { name = "httpx-sse" },
535
542
  { name = "jsonschema" },
536
- { name = "pydantic" },
543
+ { name = "pydantic", version = "2.11.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
544
+ { name = "pydantic", version = "2.13.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
537
545
  { name = "pydantic-settings" },
538
546
  { name = "pyjwt", extra = ["crypto"] },
539
547
  { name = "python-multipart" },
@@ -541,12 +549,13 @@ dependencies = [
541
549
  { name = "sse-starlette" },
542
550
  { name = "starlette" },
543
551
  { name = "typing-extensions" },
544
- { name = "typing-inspection" },
552
+ { name = "typing-inspection", version = "0.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
553
+ { name = "typing-inspection", version = "0.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
545
554
  { name = "uvicorn", marker = "sys_platform != 'emscripten'" },
546
555
  ]
547
- sdist = { url = "https://files.pythonhosted.org/packages/fc/6d/62e76bbb8144d6ed86e202b5edd8a4cb631e7c8130f3f4893c3f90262b10/mcp-1.26.0.tar.gz", hash = "sha256:db6e2ef491eecc1a0d93711a76f28dec2e05999f93afd48795da1c1137142c66", size = 608005, upload-time = "2026-01-24T19:40:32.468Z" }
556
+ sdist = { url = "https://files.pythonhosted.org/packages/6e/77/9450b8f251a13affb6281997d0523c4615f8a8b35d0b21ff30db3a5aac9d/mcp-1.28.1.tar.gz", hash = "sha256:d51e36a5f5644faea4f85ea649bfffa6bc6c26770d42798ad6a3de3d2ba69683", size = 638501, upload-time = "2026-06-26T12:57:29.093Z" }
548
557
  wheels = [
549
- { url = "https://files.pythonhosted.org/packages/fd/d9/eaa1f80170d2b7c5ba23f3b59f766f3a0bb41155fbc32a69adfa1adaaef9/mcp-1.26.0-py3-none-any.whl", hash = "sha256:904a21c33c25aa98ddbeb47273033c435e595bbacfdb177f4bd87f6dceebe1ca", size = 233615, upload-time = "2026-01-24T19:40:30.652Z" },
558
+ { url = "https://files.pythonhosted.org/packages/e2/5e/d118fce19f87a2e7d8101c35c8ae0ec289098a4df0ff244cec23e415aca0/mcp-1.28.1-py3-none-any.whl", hash = "sha256:2726bca5e7193f61c5dde8b12500a6de2d9acf6d1a1c0be9e8c2e706437991df", size = 222620, upload-time = "2026-06-26T12:57:27.218Z" },
550
559
  ]
551
560
 
552
561
  [[package]]
@@ -572,7 +581,8 @@ name = "openapi-pydantic"
572
581
  version = "0.5.1"
573
582
  source = { registry = "https://pypi.org/simple" }
574
583
  dependencies = [
575
- { name = "pydantic" },
584
+ { name = "pydantic", version = "2.11.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
585
+ { name = "pydantic", version = "2.13.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
576
586
  ]
577
587
  sdist = { url = "https://files.pythonhosted.org/packages/02/2e/58d83848dd1a79cb92ed8e63f6ba901ca282c5f09d04af9423ec26c56fd7/openapi_pydantic-0.5.1.tar.gz", hash = "sha256:ff6835af6bde7a459fb93eb93bb92b8749b754fc6e51b2f1590a19dc3005ee0d", size = 60892, upload-time = "2025-01-08T19:29:27.083Z" }
578
588
  wheels = [
@@ -657,11 +667,15 @@ wheels = [
657
667
  name = "pydantic"
658
668
  version = "2.11.7"
659
669
  source = { registry = "https://pypi.org/simple" }
670
+ resolution-markers = [
671
+ "python_full_version < '3.14' and sys_platform == 'win32'",
672
+ "python_full_version < '3.14' and sys_platform != 'win32'",
673
+ ]
660
674
  dependencies = [
661
- { name = "annotated-types" },
662
- { name = "pydantic-core" },
663
- { name = "typing-extensions" },
664
- { name = "typing-inspection" },
675
+ { name = "annotated-types", marker = "python_full_version < '3.14'" },
676
+ { name = "pydantic-core", version = "2.33.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
677
+ { name = "typing-extensions", marker = "python_full_version < '3.14'" },
678
+ { name = "typing-inspection", version = "0.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
665
679
  ]
666
680
  sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350, upload-time = "2025-06-14T08:33:17.137Z" }
667
681
  wheels = [
@@ -670,15 +684,43 @@ wheels = [
670
684
 
671
685
  [package.optional-dependencies]
672
686
  email = [
673
- { name = "email-validator" },
687
+ { name = "email-validator", marker = "python_full_version < '3.14'" },
688
+ ]
689
+
690
+ [[package]]
691
+ name = "pydantic"
692
+ version = "2.13.4"
693
+ source = { registry = "https://pypi.org/simple" }
694
+ resolution-markers = [
695
+ "python_full_version >= '3.14' and sys_platform == 'win32'",
696
+ "python_full_version >= '3.14' and sys_platform != 'win32'",
697
+ ]
698
+ dependencies = [
699
+ { name = "annotated-types", marker = "python_full_version >= '3.14'" },
700
+ { name = "pydantic-core", version = "2.46.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
701
+ { name = "typing-extensions", marker = "python_full_version >= '3.14'" },
702
+ { name = "typing-inspection", version = "0.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
703
+ ]
704
+ sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" }
705
+ wheels = [
706
+ { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262, upload-time = "2026-05-06T13:43:02.641Z" },
707
+ ]
708
+
709
+ [package.optional-dependencies]
710
+ email = [
711
+ { name = "email-validator", marker = "python_full_version >= '3.14'" },
674
712
  ]
675
713
 
676
714
  [[package]]
677
715
  name = "pydantic-core"
678
716
  version = "2.33.2"
679
717
  source = { registry = "https://pypi.org/simple" }
718
+ resolution-markers = [
719
+ "python_full_version < '3.14' and sys_platform == 'win32'",
720
+ "python_full_version < '3.14' and sys_platform != 'win32'",
721
+ ]
680
722
  dependencies = [
681
- { name = "typing-extensions" },
723
+ { name = "typing-extensions", marker = "python_full_version < '3.14'" },
682
724
  ]
683
725
  sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" }
684
726
  wheels = [
@@ -715,14 +757,95 @@ wheels = [
715
757
  { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload-time = "2025-04-23T18:32:25.088Z" },
716
758
  ]
717
759
 
760
+ [[package]]
761
+ name = "pydantic-core"
762
+ version = "2.46.4"
763
+ source = { registry = "https://pypi.org/simple" }
764
+ resolution-markers = [
765
+ "python_full_version >= '3.14' and sys_platform == 'win32'",
766
+ "python_full_version >= '3.14' and sys_platform != 'win32'",
767
+ ]
768
+ dependencies = [
769
+ { name = "typing-extensions", marker = "python_full_version >= '3.14'" },
770
+ ]
771
+ sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" }
772
+ wheels = [
773
+ { url = "https://files.pythonhosted.org/packages/ce/8c/af022f0af448d7747c5154288d46b5f2bc5f17366eaa0e23e9aa04d59f3b/pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2", size = 2106158, upload-time = "2026-05-06T13:38:57.215Z" },
774
+ { url = "https://files.pythonhosted.org/packages/19/95/6195171e385007300f0f5574592e467c568becce2d937a0b6804f218bc49/pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f", size = 1951724, upload-time = "2026-05-06T13:37:02.697Z" },
775
+ { url = "https://files.pythonhosted.org/packages/8e/bc/f47d1ff9cbb1620e1b5b697eef06010035735f07820180e74178226b27b3/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7", size = 1975742, upload-time = "2026-05-06T13:37:09.448Z" },
776
+ { url = "https://files.pythonhosted.org/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", size = 2052418, upload-time = "2026-05-06T13:37:38.234Z" },
777
+ { url = "https://files.pythonhosted.org/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", size = 2232274, upload-time = "2026-05-06T13:38:27.753Z" },
778
+ { url = "https://files.pythonhosted.org/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", size = 2309940, upload-time = "2026-05-06T13:38:05.353Z" },
779
+ { url = "https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", size = 2094516, upload-time = "2026-05-06T13:39:10.577Z" },
780
+ { url = "https://files.pythonhosted.org/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", size = 2136854, upload-time = "2026-05-06T13:40:22.59Z" },
781
+ { url = "https://files.pythonhosted.org/packages/24/99/fcef1b79238c06a8cbec70819ac722ba76e02bc8ada9b0fd66eba40da01b/pydantic_core-2.46.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c68fcd102d71ea85c5b2dfac3f4f8476eff42a9e078fd5faefff6d145063536b", size = 2180306, upload-time = "2026-05-06T13:40:10.666Z" },
782
+ { url = "https://files.pythonhosted.org/packages/ae/6c/fc44000918855b42779d007ae63b0532794739027b2f417321cddbc44f6a/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458", size = 2190044, upload-time = "2026-05-06T13:40:43.231Z" },
783
+ { url = "https://files.pythonhosted.org/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", size = 2329133, upload-time = "2026-05-06T13:39:57.365Z" },
784
+ { url = "https://files.pythonhosted.org/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", size = 2374464, upload-time = "2026-05-06T13:38:06.976Z" },
785
+ { url = "https://files.pythonhosted.org/packages/47/bd/6f2fc8188f31bf10590f1e98e7b306336161fac930a8c514cd7bd828c7dc/pydantic_core-2.46.4-cp312-cp312-win32.whl", hash = "sha256:9aa768456404a8bf48a4406685ac2bec8e72b62c69313734fa3b73cf33b3a894", size = 1974823, upload-time = "2026-05-06T13:40:47.985Z" },
786
+ { url = "https://files.pythonhosted.org/packages/40/8c/985c1d41ea1107c2534abd9870e4ed5c8e7669b5c308297835c001e7a1c4/pydantic_core-2.46.4-cp312-cp312-win_amd64.whl", hash = "sha256:e9c26f834c65f5752f3f06cb08cb86a913ceb7274d0db6e267808a708b46bc89", size = 2072919, upload-time = "2026-05-06T13:39:21.153Z" },
787
+ { url = "https://files.pythonhosted.org/packages/c4/ba/f463d006e0c47373ca7ec5e1a261c59dc01ef4d62b2657af925fb0deee3a/pydantic_core-2.46.4-cp312-cp312-win_arm64.whl", hash = "sha256:4fc73cb559bdb54b1134a706a2802a4cddd27a0633f5abb7e53056268751ac6a", size = 2027604, upload-time = "2026-05-06T13:39:03.753Z" },
788
+ { url = "https://files.pythonhosted.org/packages/51/a2/5d30b469c5267a17b39dec53208222f76a8d351dfac4af661888c5aee77d/pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5d5902252db0d3cedf8d4a1bc68f70eeb430f7e4c7104c8c476753519b423008", size = 2106306, upload-time = "2026-05-06T13:37:48.029Z" },
789
+ { url = "https://files.pythonhosted.org/packages/c1/81/4fa520eaffa8bd7d1525e644cd6d39e7d60b1592bc5b516693c7340b50f1/pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4", size = 1951906, upload-time = "2026-05-06T13:37:17.012Z" },
790
+ { url = "https://files.pythonhosted.org/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76", size = 1976802, upload-time = "2026-05-06T13:37:35.113Z" },
791
+ { url = "https://files.pythonhosted.org/packages/21/f2/95727e1368be3d3ed485eaab7adbd7dda408f33f7a36e8b48e0144002b91/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3", size = 2052446, upload-time = "2026-05-06T13:37:12.313Z" },
792
+ { url = "https://files.pythonhosted.org/packages/9c/86/5d99feea3f77c7234b8718075b23db11532773c1a0dbd9b9490215dc2eeb/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76", size = 2232757, upload-time = "2026-05-06T13:39:01.149Z" },
793
+ { url = "https://files.pythonhosted.org/packages/d2/3a/508ac615935ef7588cf6d9e9b91309fdc2da751af865e02a9098de88258c/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4", size = 2309275, upload-time = "2026-05-06T13:37:41.406Z" },
794
+ { url = "https://files.pythonhosted.org/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a", size = 2094467, upload-time = "2026-05-06T13:39:18.847Z" },
795
+ { url = "https://files.pythonhosted.org/packages/2c/e2/f35033184cb11d0052daf4416e8e10a502ea2ac006fc4f459aee872727d1/pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262", size = 2134417, upload-time = "2026-05-06T13:40:17.944Z" },
796
+ { url = "https://files.pythonhosted.org/packages/7e/7b/6ceeb1cc90e193862f444ebe373d8fdf613f0a82572dde03fb10734c6c71/pydantic_core-2.46.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5855698a4856556d86e8e6cd8434bc3ac0314ee8e12089ae0e143f64c6256e4e", size = 2179782, upload-time = "2026-05-06T13:40:32.618Z" },
797
+ { url = "https://files.pythonhosted.org/packages/5a/f2/c8d7773ede6af08036423a00ae0ceffce266c3c52a096c435d68c896083f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd", size = 2188782, upload-time = "2026-05-06T13:36:51.018Z" },
798
+ { url = "https://files.pythonhosted.org/packages/59/31/0c864784e31f09f05cdd87606f08923b9c9e7f6e51dd27f20f62f975ce9f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be", size = 2328334, upload-time = "2026-05-06T13:40:37.764Z" },
799
+ { url = "https://files.pythonhosted.org/packages/c2/eb/4f6c8a41efa30baa755590f4141abf3a8c370fab610915733e74134a7270/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d", size = 2372986, upload-time = "2026-05-06T13:39:34.152Z" },
800
+ { url = "https://files.pythonhosted.org/packages/5b/24/b375a480d53113860c299764bfe9f349a3dc9108b3adc0d7f0d786492ebf/pydantic_core-2.46.4-cp313-cp313-win32.whl", hash = "sha256:9fa8ae11da9e2b3126c6426f147e0fba88d96d65921799bb30c6abd1cb2c97fb", size = 1973693, upload-time = "2026-05-06T13:37:55.072Z" },
801
+ { url = "https://files.pythonhosted.org/packages/7e/e8/cff247591966f2d22ec8c003cd7587e27b7ba7b81ab2fb888e3ab75dc285/pydantic_core-2.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:6b3ace8194b0e5204818c92802dcdca7fc6d88aabbb799d7c795540d9cd6d292", size = 2071819, upload-time = "2026-05-06T13:38:49.139Z" },
802
+ { url = "https://files.pythonhosted.org/packages/c6/1a/f4aee670d5670e9e148e0c82c7db98d780be566c6e6a97ee8035528ca0b3/pydantic_core-2.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:184c081504d17f1c1066e430e117142b2c77d9448a97f7b65c6ac9fd9aee238d", size = 2027411, upload-time = "2026-05-06T13:40:45.796Z" },
803
+ { url = "https://files.pythonhosted.org/packages/8d/74/228a26ddad29c6672b805d9fd78e8d251cd04004fa7eed0e622096cd0250/pydantic_core-2.46.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:428e04521a40150c85216fc8b85e8d39fece235a9cf5e383761238c7fa9b96fb", size = 2102079, upload-time = "2026-05-06T13:38:41.019Z" },
804
+ { url = "https://files.pythonhosted.org/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462", size = 1952179, upload-time = "2026-05-06T13:36:59.812Z" },
805
+ { url = "https://files.pythonhosted.org/packages/95/30/5211a831ae054928054b2f79731661087a2bc5c01e825c672b3a4a8f1b3e/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9", size = 1978926, upload-time = "2026-05-06T13:37:39.933Z" },
806
+ { url = "https://files.pythonhosted.org/packages/57/e9/689668733b1eb67adeef047db3c2e8788fcf65a7fd9c9e2b46b7744fe245/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4", size = 2046785, upload-time = "2026-05-06T13:38:01.995Z" },
807
+ { url = "https://files.pythonhosted.org/packages/60/d9/6715260422ff50a2109878fd24d948a6c3446bb2664f34ee78cd972b3acd/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914", size = 2228733, upload-time = "2026-05-06T13:40:50.371Z" },
808
+ { url = "https://files.pythonhosted.org/packages/18/ae/fdb2f64316afca925640f8e70bb1a564b0ec2721c1389e25b8eb4bf9a299/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28", size = 2307534, upload-time = "2026-05-06T13:37:21.531Z" },
809
+ { url = "https://files.pythonhosted.org/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b", size = 2099732, upload-time = "2026-05-06T13:39:31.942Z" },
810
+ { url = "https://files.pythonhosted.org/packages/06/d5/ee5a3366637fee41dee51a1fc91562dcf12ddbc68fda34e6b253da2324bb/pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c", size = 2129627, upload-time = "2026-05-06T13:37:25.033Z" },
811
+ { url = "https://files.pythonhosted.org/packages/94/33/2414be571d2c6a6c4d08be21f9292b6d3fdb08949a97b6dfe985017821db/pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb", size = 2179141, upload-time = "2026-05-06T13:37:14.046Z" },
812
+ { url = "https://files.pythonhosted.org/packages/7b/79/7daa95be995be0eecc4cf75064cb33f9bbbfe3fe0158caf2f0d4a996a5c7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898", size = 2184325, upload-time = "2026-05-06T13:36:53.615Z" },
813
+ { url = "https://files.pythonhosted.org/packages/9f/cb/d0a382f5c0de8a222dc61c65348e0ce831b1f68e0a018450d31c2cace3a5/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e", size = 2323990, upload-time = "2026-05-06T13:40:29.971Z" },
814
+ { url = "https://files.pythonhosted.org/packages/05/db/d9ba624cc4a5aced1598e88c04fdbd8310c8a69b9d38b9a3d39ce3a61ed7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519", size = 2369978, upload-time = "2026-05-06T13:37:23.027Z" },
815
+ { url = "https://files.pythonhosted.org/packages/f2/20/d15df15ba918c423461905802bfd2981c3af0bfa0e40d05e13edbfa48bc3/pydantic_core-2.46.4-cp314-cp314-win32.whl", hash = "sha256:85bb3611ff1802f3ee7fdd7dbff26b56f343fb432d57a4728fdd49b6ef35e2f4", size = 1966354, upload-time = "2026-05-06T13:38:03.499Z" },
816
+ { url = "https://files.pythonhosted.org/packages/fc/b6/6b8de4c0a7d7ab3004c439c80c5c1e0a3e8d78bbae19379b01960383d9e5/pydantic_core-2.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:811ff8e9c313ab425368bcbb36e5c4ebd7108c2bbf4e4089cfbb0b01eff63fac", size = 2072238, upload-time = "2026-05-06T13:39:40.807Z" },
817
+ { url = "https://files.pythonhosted.org/packages/32/36/51eb763beec1f4cf59b1db243a7dcc39cbb41230f050a09b9d69faaf0a48/pydantic_core-2.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:bfec22eab3c8cc2ceec0248aec886624116dc079afa027ecc8ad4a7e62010f8a", size = 2018251, upload-time = "2026-05-06T13:37:26.72Z" },
818
+ { url = "https://files.pythonhosted.org/packages/e8/91/855af51d625b23aa987116a19e231d2aaef9c4a415273ddc189b79a45fee/pydantic_core-2.46.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:af8244b2bef6aaad6d92cda81372de7f8c8d36c9f0c3ea36e827c60e7d9467a0", size = 2099593, upload-time = "2026-05-06T13:39:47.682Z" },
819
+ { url = "https://files.pythonhosted.org/packages/fb/1b/8784a54c65edb5f49f0a14d6977cf1b209bba85a4c77445b255c2de58ab3/pydantic_core-2.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a4330cdbc57162e4b3aa303f588ba752257694c9c9be3e7ebb11b4aca659b5d", size = 1935226, upload-time = "2026-05-06T13:40:40.428Z" },
820
+ { url = "https://files.pythonhosted.org/packages/e8/e7/1955d28d1afc56dd4b3ad7cc0cf39df1b9852964cf16e5d13912756d6d6b/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b", size = 1974605, upload-time = "2026-05-06T13:37:32.029Z" },
821
+ { url = "https://files.pythonhosted.org/packages/93/e2/3fedbf0ba7a22850e6e9fd78117f1c0f10f950182344d8a6c535d468fdd8/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000", size = 2030777, upload-time = "2026-05-06T13:38:55.239Z" },
822
+ { url = "https://files.pythonhosted.org/packages/f8/61/46be275fcaaba0b4f5b9669dd852267ce1ff616592dccf7a7845588df091/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e", size = 2236641, upload-time = "2026-05-06T13:37:08.096Z" },
823
+ { url = "https://files.pythonhosted.org/packages/60/db/12e93e46a8bac9988be3c016860f83293daea8c716c029c9ace279036f2f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd", size = 2286404, upload-time = "2026-05-06T13:40:20.221Z" },
824
+ { url = "https://files.pythonhosted.org/packages/e2/4a/4d8b19008f38d31c53b8219cfedc2e3d5de5fe99d90076b7e767de29274f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3", size = 2109219, upload-time = "2026-05-06T13:38:12.153Z" },
825
+ { url = "https://files.pythonhosted.org/packages/88/70/3cbc40978fefb7bb09c6708d40d4ad1a5d70fd7213c3d17f971de868ec1f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7", size = 2110594, upload-time = "2026-05-06T13:40:02.971Z" },
826
+ { url = "https://files.pythonhosted.org/packages/9d/20/b8d36736216e29491125531685b2f9e61aa5b4b2599893f8268551da3338/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff", size = 2159542, upload-time = "2026-05-06T13:39:27.506Z" },
827
+ { url = "https://files.pythonhosted.org/packages/1d/a2/367df868eb584dacf6bf82a389272406d7178e301c4ac82545ab98bc2dd9/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424", size = 2168146, upload-time = "2026-05-06T13:38:31.93Z" },
828
+ { url = "https://files.pythonhosted.org/packages/c1/b8/4460f77f7e201893f649a29ab355dddd3beee8a97bcb1a320db414f9a06e/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6", size = 2306309, upload-time = "2026-05-06T13:37:44.717Z" },
829
+ { url = "https://files.pythonhosted.org/packages/64/c4/be2639293acd87dc8ddbcec41a73cee9b2ebf996fe6d892a1a74e88ad3f7/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565", size = 2369736, upload-time = "2026-05-06T13:37:05.645Z" },
830
+ { url = "https://files.pythonhosted.org/packages/30/a6/9f9f380dbb301f67023bf8f707aaa75daadf84f7152d95c410fd7e81d994/pydantic_core-2.46.4-cp314-cp314t-win32.whl", hash = "sha256:e846ae7835bf0703ae43f534ab79a867146dadd59dc9ca5c8b53d5c8f7c9ef02", size = 1955575, upload-time = "2026-05-06T13:38:51.116Z" },
831
+ { url = "https://files.pythonhosted.org/packages/40/1f/f1eb9eb350e795d1af8586289746f5c5677d16043040d63710e22abc43c9/pydantic_core-2.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:2108ba5c1c1eca18030634489dc544844144ee36357f2f9f780b93e7ddbb44b5", size = 2051624, upload-time = "2026-05-06T13:38:21.672Z" },
832
+ { url = "https://files.pythonhosted.org/packages/f6/d2/42dd53d0a85c27606f316d3aa5d2869c4e8470a5ed6dec30e4a1abe19192/pydantic_core-2.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:4fcbe087dbc2068af7eda3aa87634eba216dbda64d1ae73c8684b621d33f6596", size = 2017325, upload-time = "2026-05-06T13:40:52.723Z" },
833
+ { url = "https://files.pythonhosted.org/packages/9d/1d/8987ad40f65ae1432753072f214fb5c74fe47ffbd0698bb9cbbb585664f8/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:1d8ba486450b14f3b1d63bc521d410ec7565e52f887b9fb671791886436a42f7", size = 2095527, upload-time = "2026-05-06T13:39:52.283Z" },
834
+ { url = "https://files.pythonhosted.org/packages/64/d3/84c282a7eee1d3ac4c0377546ef5a1ea436ce26840d9ac3b7ed54a377507/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df", size = 1936024, upload-time = "2026-05-06T13:40:15.671Z" },
835
+ { url = "https://files.pythonhosted.org/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", size = 1990696, upload-time = "2026-05-06T13:38:34.717Z" },
836
+ { url = "https://files.pythonhosted.org/packages/fa/c3/7c8b240552251faf6b3a957db200fcfbbcec36763c050428b601e0c9b83b/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0", size = 2147590, upload-time = "2026-05-06T13:39:29.883Z" },
837
+ ]
838
+
718
839
  [[package]]
719
840
  name = "pydantic-settings"
720
841
  version = "2.10.1"
721
842
  source = { registry = "https://pypi.org/simple" }
722
843
  dependencies = [
723
- { name = "pydantic" },
844
+ { name = "pydantic", version = "2.11.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
845
+ { name = "pydantic", version = "2.13.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
724
846
  { name = "python-dotenv" },
725
- { name = "typing-inspection" },
847
+ { name = "typing-inspection", version = "0.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
848
+ { name = "typing-inspection", version = "0.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
726
849
  ]
727
850
  sdist = { url = "https://files.pythonhosted.org/packages/68/85/1ea668bbab3c50071ca613c6ab30047fb36ab0da1b92fa8f17bbc38fd36c/pydantic_settings-2.10.1.tar.gz", hash = "sha256:06f0062169818d0f5524420a360d632d5857b83cffd4d42fe29597807a1614ee", size = 172583, upload-time = "2025-06-24T13:26:46.841Z" }
728
851
  wheels = [
@@ -976,8 +1099,8 @@ name = "secretstorage"
976
1099
  version = "3.5.0"
977
1100
  source = { registry = "https://pypi.org/simple" }
978
1101
  dependencies = [
979
- { name = "cryptography" },
980
- { name = "jeepney" },
1102
+ { name = "cryptography", marker = "sys_platform != 'win32'" },
1103
+ { name = "jeepney", marker = "sys_platform != 'win32'" },
981
1104
  ]
982
1105
  sdist = { url = "https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size = 19884, upload-time = "2025-11-23T19:02:53.191Z" }
983
1106
  wheels = [
@@ -1042,14 +1165,34 @@ wheels = [
1042
1165
  name = "typing-inspection"
1043
1166
  version = "0.4.1"
1044
1167
  source = { registry = "https://pypi.org/simple" }
1168
+ resolution-markers = [
1169
+ "python_full_version < '3.14' and sys_platform == 'win32'",
1170
+ "python_full_version < '3.14' and sys_platform != 'win32'",
1171
+ ]
1045
1172
  dependencies = [
1046
- { name = "typing-extensions" },
1173
+ { name = "typing-extensions", marker = "python_full_version < '3.14'" },
1047
1174
  ]
1048
1175
  sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload-time = "2025-05-21T18:55:23.885Z" }
1049
1176
  wheels = [
1050
1177
  { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" },
1051
1178
  ]
1052
1179
 
1180
+ [[package]]
1181
+ name = "typing-inspection"
1182
+ version = "0.4.2"
1183
+ source = { registry = "https://pypi.org/simple" }
1184
+ resolution-markers = [
1185
+ "python_full_version >= '3.14' and sys_platform == 'win32'",
1186
+ "python_full_version >= '3.14' and sys_platform != 'win32'",
1187
+ ]
1188
+ dependencies = [
1189
+ { name = "typing-extensions", marker = "python_full_version >= '3.14'" },
1190
+ ]
1191
+ sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" }
1192
+ wheels = [
1193
+ { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" },
1194
+ ]
1195
+
1053
1196
  [[package]]
1054
1197
  name = "uncalled-for"
1055
1198
  version = "0.2.0"