From 1a47aec6e41b8d945a15da8c637dbeedbc28f71d Mon Sep 17 00:00:00 2001 From: Elie Habib Date: Sun, 4 Jan 2026 11:56:38 +0000 Subject: [PATCH 1/5] feat(gateway): add serve feature for sharing files via public URLs --- src/agents/pi-embedded-helpers.ts | 5 +- src/agents/pi-embedded-runner.ts | 5 +- src/agents/tools/serve-tool.ts | 97 ++++++++ src/gateway/serve.ts | 366 ++++++++++++++++++++++++++++++ src/gateway/server-http.ts | 4 + src/gateway/server.ts | 12 + 6 files changed, 484 insertions(+), 5 deletions(-) create mode 100644 src/agents/tools/serve-tool.ts create mode 100644 src/gateway/serve.ts diff --git a/src/agents/pi-embedded-helpers.ts b/src/agents/pi-embedded-helpers.ts index 81d129b4a..90cb6e713 100644 --- a/src/agents/pi-embedded-helpers.ts +++ b/src/agents/pi-embedded-helpers.ts @@ -1,10 +1,7 @@ import fs from "node:fs/promises"; import path from "node:path"; -import type { - AgentMessage, - AgentToolResult, -} from "@mariozechner/pi-agent-core"; +import type { AgentMessage, AgentToolResult } from "@mariozechner/pi-agent-core"; import type { AssistantMessage } from "@mariozechner/pi-ai"; import { normalizeThinkLevel, diff --git a/src/agents/pi-embedded-runner.ts b/src/agents/pi-embedded-runner.ts index 9fab11a0a..ad4eafd57 100644 --- a/src/agents/pi-embedded-runner.ts +++ b/src/agents/pi-embedded-runner.ts @@ -853,6 +853,7 @@ export async function compactEmbeddedPiSession(params: { sessionKey: params.sessionKey ?? params.sessionId, agentDir, config: params.config, + serveBaseUrl: params.serveBaseUrl, }); const machineName = await getMachineDisplayName(); const runtimeInfo = { @@ -1015,6 +1016,7 @@ export async function runEmbeddedPiAgent(params: { extraSystemPrompt?: string; ownerNumbers?: string[]; enforceFinalTag?: boolean; + serveBaseUrl?: string; }): Promise { const sessionLane = resolveSessionLane( params.sessionKey?.trim() || params.sessionId, @@ -1050,7 +1052,7 @@ export async function runEmbeddedPiAgent(params: { provider, preferredProfile: explicitProfileId, }); - if (explicitProfileId && !profileOrder.includes(explicitProfileId)) { +if (explicitProfileId && !profileOrder.includes(explicitProfileId)) { throw new Error( `Auth profile "${explicitProfileId}" is not configured for ${provider}.`, ); @@ -1166,6 +1168,7 @@ export async function runEmbeddedPiAgent(params: { sessionKey: params.sessionKey ?? params.sessionId, agentDir, config: params.config, + serveBaseUrl: params.serveBaseUrl, }); const machineName = await getMachineDisplayName(); const runtimeInfo = { diff --git a/src/agents/tools/serve-tool.ts b/src/agents/tools/serve-tool.ts new file mode 100644 index 000000000..05bec1d7f --- /dev/null +++ b/src/agents/tools/serve-tool.ts @@ -0,0 +1,97 @@ +import { Type } from "@sinclair/typebox"; + +import { getTailnetHostname } from "../../infra/tailscale.js"; +import { + serveCreate, + serveDelete, + serveList, +} from "../../gateway/serve.js"; +import { type AnyAgentTool, jsonResult, readStringParam } from "./common.js"; + +async function resolveServeBaseUrl(providedUrl?: string): Promise { + if (providedUrl) return providedUrl; + try { + const tailnetHost = await getTailnetHostname(); + return `https://${tailnetHost}`; + } catch { + return "http://localhost:18789"; + } +} + +export function createServeTool(opts?: { baseUrl?: string }): AnyAgentTool { + return { + label: "Serve File", + name: "serve", + description: + "Create a publicly accessible URL for a file. Returns a URL that can be shared. " + + "Supports optional title, description, and OG image for rich link previews. " + + "TTL can be specified as a duration (e.g., '1h', '7d') or 'forever'.", + parameters: Type.Object({ + path: Type.String({ description: "Absolute path to the file to serve" }), + slug: Type.Optional( + Type.String({ description: "Custom URL slug (auto-generated if omitted)" }), + ), + title: Type.Optional( + Type.String({ description: "Title for link preview" }), + ), + description: Type.Optional( + Type.String({ description: "Description for link preview" }), + ), + ttl: Type.Optional( + Type.String({ + description: "Time to live: '1h', '7d', 'forever' (default: '24h')", + }), + ), + ogImage: Type.Optional( + Type.String({ description: "URL or path to Open Graph preview image" }), + ), + }), + execute: async (_toolCallId: string, args: unknown) => { + const params = (args ?? {}) as Record; + const filePath = readStringParam(params, "path", { required: true }); + const slug = readStringParam(params, "slug"); + const title = readStringParam(params, "title"); + const description = readStringParam(params, "description"); + const ttl = readStringParam(params, "ttl"); + const ogImage = readStringParam(params, "ogImage"); + + const baseUrl = await resolveServeBaseUrl(opts?.baseUrl); + const result = serveCreate( + { path: filePath, slug, title, description, ttl, ogImage }, + baseUrl, + ); + return jsonResult(result); + }, + }; +} + +export function createServeListTool(opts?: { baseUrl?: string }): AnyAgentTool { + return { + label: "List Served Files", + name: "serve_list", + description: "List all currently served files with their URLs and metadata.", + parameters: Type.Object({}), + execute: async () => { + const baseUrl = await resolveServeBaseUrl(opts?.baseUrl); + const items = serveList(baseUrl); + return jsonResult({ count: items.length, items }); + }, + }; +} + +export function createServeDeleteTool(): AnyAgentTool { + return { + label: "Delete Served File", + name: "serve_delete", + description: "Remove a served file by its slug.", + parameters: Type.Object({ + slug: Type.String({ description: "The slug of the served file to delete" }), + }), + execute: async (_toolCallId: string, args: unknown) => { + const params = (args ?? {}) as Record; + const slug = readStringParam(params, "slug", { required: true }); + const deleted = serveDelete(slug); + return jsonResult({ deleted, slug }); + }, + }; +} diff --git a/src/gateway/serve.ts b/src/gateway/serve.ts new file mode 100644 index 000000000..c791737d9 --- /dev/null +++ b/src/gateway/serve.ts @@ -0,0 +1,366 @@ +import { createHash } from "node:crypto"; +import { + existsSync, + mkdirSync, + readFileSync, + readdirSync, + unlinkSync, + writeFileSync, + copyFileSync, + statSync, +} from "node:fs"; +import { extname, join, basename } from "node:path"; +import type { IncomingMessage, ServerResponse } from "node:http"; +import MarkdownIt from "markdown-it"; +import { CONFIG_DIR } from "../utils.js"; + +const md = new MarkdownIt({ html: true, linkify: true, typographer: true }); + +export type ServeMetadata = { + slug: string; + contentPath: string; + contentHash: string; + contentType: string; + size: number; + title: string; + description: string; + ogImage: string | null; + createdAt: string; + expiresAt: string | null; + ttl: string; +}; + +export type ServeCreateParams = { + path: string; + slug: string; + title: string; + description: string; + ttl?: string; + ogImage?: string; +}; + +const SERVE_DIR = join(CONFIG_DIR, "serve"); + +function ensureServeDir() { + if (!existsSync(SERVE_DIR)) { + mkdirSync(SERVE_DIR, { recursive: true }); + } +} + +export function parseTtl(ttl: string): number | null { + if (ttl === "forever") return null; + const match = ttl.match(/^(\d+)(m|h|d)$/); + if (!match) return 24 * 60 * 60 * 1000; // default 24h + const value = parseInt(match[1], 10); + const unit = match[2]; + switch (unit) { + case "m": + return value * 60 * 1000; + case "h": + return value * 60 * 60 * 1000; + case "d": + return value * 24 * 60 * 60 * 1000; + default: + return 24 * 60 * 60 * 1000; + } +} + +function hashContent(content: Buffer): string { + return createHash("sha256").update(content).digest("hex").slice(0, 16); +} + +function getMimeType(ext: string): string { + const mimes: Record = { + ".md": "text/markdown", + ".html": "text/html", + ".htm": "text/html", + ".txt": "text/plain", + ".json": "application/json", + ".pdf": "application/pdf", + ".png": "image/png", + ".jpg": "image/jpeg", + ".jpeg": "image/jpeg", + ".gif": "image/gif", + ".svg": "image/svg+xml", + ".webp": "image/webp", + ".mp3": "audio/mpeg", + ".wav": "audio/wav", + ".mp4": "video/mp4", + ".webm": "video/webm", + ".css": "text/css", + ".js": "application/javascript", + }; + return mimes[ext.toLowerCase()] ?? "application/octet-stream"; +} + +function findUniqueSlug(baseSlug: string): string { + ensureServeDir(); + let slug = baseSlug; + let counter = 1; + while (existsSync(join(SERVE_DIR, `${slug}.json`))) { + const existing = loadMetadata(slug); + if (!existing) break; + slug = `${baseSlug}-${counter}`; + counter++; + } + return slug; +} + +function loadMetadata(slug: string): ServeMetadata | null { + const metaPath = join(SERVE_DIR, `${slug}.json`); + if (!existsSync(metaPath)) return null; + try { + return JSON.parse(readFileSync(metaPath, "utf-8")) as ServeMetadata; + } catch { + return null; + } +} + +function saveMetadata(meta: ServeMetadata) { + ensureServeDir(); + const metaPath = join(SERVE_DIR, `${meta.slug}.json`); + writeFileSync(metaPath, JSON.stringify(meta, null, 2)); +} + +function isExpired(meta: ServeMetadata): boolean { + if (!meta.expiresAt) return false; + return new Date(meta.expiresAt).getTime() < Date.now(); +} + +function deleteServedContent(slug: string) { + const meta = loadMetadata(slug); + if (!meta) return false; + const metaPath = join(SERVE_DIR, `${slug}.json`); + const contentPath = join(SERVE_DIR, meta.contentPath); + try { + if (existsSync(contentPath)) unlinkSync(contentPath); + if (existsSync(metaPath)) unlinkSync(metaPath); + return true; + } catch { + return false; + } +} + +export function serveCreate( + params: ServeCreateParams, + baseUrl: string, +): { url: string; slug: string } { + ensureServeDir(); + + if (!existsSync(params.path)) { + throw new Error(`File not found: ${params.path}`); + } + + const content = readFileSync(params.path); + const hash = hashContent(content); + const ext = extname(params.path); + const contentType = getMimeType(ext); + + // Check for existing with same slug + const existing = loadMetadata(params.slug); + let slug: string; + + if (existing && existing.contentHash === hash) { + // Same content, update metadata + slug = params.slug; + } else if (existing) { + // Different content, find unique slug + slug = findUniqueSlug(params.slug); + } else { + slug = params.slug; + } + + const contentFilename = `${slug}${ext}`; + const contentPath = join(SERVE_DIR, contentFilename); + copyFileSync(params.path, contentPath); + + const ttl = params.ttl ?? "24h"; + const ttlMs = parseTtl(ttl); + const now = new Date(); + const expiresAt = ttlMs ? new Date(now.getTime() + ttlMs).toISOString() : null; + + const meta: ServeMetadata = { + slug, + contentPath: contentFilename, + contentHash: hash, + contentType, + size: content.length, + title: params.title, + description: params.description, + ogImage: params.ogImage ?? null, + createdAt: now.toISOString(), + expiresAt, + ttl, + }; + + saveMetadata(meta); + + return { url: `${baseUrl}/s/${slug}`, slug }; +} + +export function serveList(baseUrl: string): ServeMetadata[] { + ensureServeDir(); + const files = readdirSync(SERVE_DIR).filter((f) => f.endsWith(".json")); + const items: ServeMetadata[] = []; + + for (const file of files) { + const slug = file.replace(/\.json$/, ""); + const meta = loadMetadata(slug); + if (meta && !isExpired(meta)) { + items.push(meta); + } + } + + return items; +} + +export function serveDelete(slug: string): boolean { + return deleteServedContent(slug); +} + +// CSS for rendered pages +const CSS = ` +body { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + line-height: 1.6; + color: #333; + max-width: 700px; + margin: 0 auto; + padding: 20px; + background: #fff; +} +h1, h2, h3, h4, h5, h6 { margin-top: 1.5em; margin-bottom: 0.5em; } +h1 { font-size: 2em; } +h2 { font-size: 1.5em; } +h3 { font-size: 1.25em; } +p { margin: 1em 0; } +a { color: #0066cc; } +img { max-width: 100%; height: auto; } +pre { background: #f5f5f5; padding: 1em; overflow-x: auto; border-radius: 4px; } +code { background: #f5f5f5; padding: 0.2em 0.4em; border-radius: 3px; font-size: 0.9em; } +pre code { background: none; padding: 0; } +blockquote { border-left: 4px solid #ddd; margin: 1em 0; padding-left: 1em; color: #666; } +table { border-collapse: collapse; width: 100%; margin: 1em 0; } +th, td { border: 1px solid #ddd; padding: 8px; text-align: left; } +th { background: #f5f5f5; } +`; + +const HIGHLIGHT_CSS = ` +.hljs{background:#f5f5f5;padding:0} +.hljs-keyword,.hljs-selector-tag,.hljs-literal,.hljs-section,.hljs-link{color:#a626a4} +.hljs-string,.hljs-title,.hljs-name,.hljs-type,.hljs-attribute,.hljs-symbol,.hljs-bullet,.hljs-addition,.hljs-variable,.hljs-template-tag,.hljs-template-variable{color:#50a14f} +.hljs-comment,.hljs-quote,.hljs-deletion,.hljs-meta{color:#a0a1a7} +.hljs-number,.hljs-regexp,.hljs-literal,.hljs-bullet,.hljs-link{color:#986801} +.hljs-emphasis{font-style:italic} +.hljs-strong{font-weight:bold} +`; + +function renderHtmlPage(meta: ServeMetadata, bodyHtml: string, baseUrl: string): string { + const ogImageTag = meta.ogImage + ? `` + : ""; + + return ` + + + + + + + ${ogImageTag} + + ${escapeHtml(meta.title)} + + + + +
+ ${bodyHtml} +
+ + + +`; +} + +function render404Page(): string { + return ` + + + + + Not Found - Clawdis + + + +
+

Content Not Found

+

This content may have expired or been removed.

+
+ +`; +} + +function escapeHtml(str: string): string { + return str + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """); +} + +export function handleServeRequest( + req: IncomingMessage, + res: ServerResponse, + opts: { baseUrl: string }, +): boolean { + const url = new URL(req.url ?? "/", "http://localhost"); + if (!url.pathname.startsWith("/s/")) return false; + + const slug = url.pathname.slice(3); // Remove "/s/" + if (!slug || slug.includes("/")) { + res.statusCode = 404; + res.setHeader("Content-Type", "text/html; charset=utf-8"); + res.end(render404Page()); + return true; + } + + const meta = loadMetadata(slug); + if (!meta || isExpired(meta)) { + if (meta && isExpired(meta)) { + deleteServedContent(slug); + } + res.statusCode = 404; + res.setHeader("Content-Type", "text/html; charset=utf-8"); + res.end(render404Page()); + return true; + } + + const contentPath = join(SERVE_DIR, meta.contentPath); + if (!existsSync(contentPath)) { + res.statusCode = 404; + res.setHeader("Content-Type", "text/html; charset=utf-8"); + res.end(render404Page()); + return true; + } + + const content = readFileSync(contentPath); + + // Render markdown/text as HTML + if (meta.contentType === "text/markdown" || meta.contentType === "text/plain") { + const text = content.toString("utf-8"); + const bodyHtml = meta.contentType === "text/markdown" ? md.render(text) : `
${escapeHtml(text)}
`; + const html = renderHtmlPage(meta, bodyHtml, opts.baseUrl); + res.statusCode = 200; + res.setHeader("Content-Type", "text/html; charset=utf-8"); + res.end(html); + return true; + } + + // Serve other files directly + res.statusCode = 200; + res.setHeader("Content-Type", meta.contentType); + res.setHeader("Content-Length", content.length); + res.end(content); + return true; +} diff --git a/src/gateway/server-http.ts b/src/gateway/server-http.ts index 6dc106ac9..6abf3cdcf 100644 --- a/src/gateway/server-http.ts +++ b/src/gateway/server-http.ts @@ -22,6 +22,7 @@ import { resolveHookProvider, } from "./hooks.js"; import { applyHookMappings } from "./hooks-mapping.js"; +import { handleServeRequest } from "./serve.js"; type SubsystemLogger = ReturnType; @@ -206,12 +207,14 @@ export function createGatewayHttpServer(opts: { controlUiEnabled: boolean; controlUiBasePath: string; handleHooksRequest: HooksRequestHandler; + serveBaseUrl?: string; }): HttpServer { const { canvasHost, controlUiEnabled, controlUiBasePath, handleHooksRequest, + serveBaseUrl, } = opts; const httpServer: HttpServer = createHttpServer((req, res) => { // Don't interfere with WebSocket upgrades; ws handles the 'upgrade' event. @@ -219,6 +222,7 @@ export function createGatewayHttpServer(opts: { void (async () => { if (await handleHooksRequest(req, res)) return; + if (serveBaseUrl && handleServeRequest(req, res, { baseUrl: serveBaseUrl })) return; if (canvasHost) { if (await handleA2uiHttpRequest(req, res)) return; if (await canvasHost.handleHttpRequest(req, res)) return; diff --git a/src/gateway/server.ts b/src/gateway/server.ts index 9dd92c846..10bb97d57 100644 --- a/src/gateway/server.ts +++ b/src/gateway/server.ts @@ -593,11 +593,23 @@ export async function startGatewayServer( dispatchWakeHook, }); + // Try to use Tailscale funnel URL for serve feature (public URLs) + let serveBaseUrl: string; + try { + const tailnetHost = await getTailnetHostname(); + serveBaseUrl = `https://${tailnetHost}`; + log.info(`Serve base URL (Tailscale): ${serveBaseUrl}`); + } catch { + const serveHost = bindHost === "0.0.0.0" ? "localhost" : bindHost; + serveBaseUrl = `http://${serveHost}:${port}`; + log.info(`Serve base URL (local): ${serveBaseUrl}`); + } const httpServer: HttpServer = createGatewayHttpServer({ canvasHost, controlUiEnabled, controlUiBasePath, handleHooksRequest, + serveBaseUrl, }); let bonjourStop: (() => Promise) | null = null; let bridge: Awaited> | null = null; From f85807a2a69cc741356e1382500c0076c076d766 Mon Sep 17 00:00:00 2001 From: Elie Habib Date: Wed, 7 Jan 2026 06:00:21 +0000 Subject: [PATCH 2/5] fix: add serveBaseUrl to compactEmbeddedPiSession params --- .../lib/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 771 bytes .../lib/__pycache__/api.cpython-312.pyc | Bin 0 -> 25346 bytes .../lib/__pycache__/session.cpython-312.pyc | Bin 0 -> 7368 bytes .../lib/__pycache__/types.cpython-312.pyc | Bin 0 -> 4424 bytes .../__pycache__/classifier.cpython-312.pyc | Bin 0 -> 12709 bytes .../lib/__pycache__/extractor.cpython-312.pyc | Bin 0 -> 8404 bytes .../lib/__pycache__/fetcher.cpython-312.pyc | Bin 0 -> 7068 bytes .../lib/__pycache__/generator.cpython-312.pyc | Bin 0 -> 13640 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 224 bytes .../__pycache__/google_places.cpython-312.pyc | Bin 0 -> 12051 bytes .../__pycache__/main.cpython-312.pyc | Bin 0 -> 3039 bytes .../__pycache__/schemas.cpython-312.pyc | Bin 0 -> 5619 bytes skills/local-places/uv.lock | 638 +++++++++++++++++ .../mino/lib/__pycache__/api.cpython-312.pyc | Bin 0 -> 9100 bytes skills/thebuilders-v2/LESSONS.md | 197 ++++++ skills/thebuilders-v2/SKILL.md | 111 +++ skills/thebuilders-v2/config/presets.yaml | 59 ++ skills/thebuilders-v2/config/voices.yaml | 47 ++ .../scripts/generate-sections.mjs | 271 ++++++++ skills/thebuilders-v2/scripts/generate.mjs | 639 ++++++++++++++++++ skills/thebuilders-v2/scripts/generate.sh | 22 + skills/thebuilders-v2/scripts/llm-helper.mjs | 45 ++ .../templates/acquired-bible.md | 78 +++ .../thebuilders-v2/templates/hook-prompt.md | 79 +++ .../templates/outline-prompt.md | 96 +++ .../templates/research-prompt.md | 144 ++++ .../thebuilders-v2/templates/review-prompt.md | 101 +++ .../thebuilders-v2/templates/script-prompt.md | 157 +++++ .../lib/__pycache__/r2_upload.cpython-312.pyc | Bin 0 -> 5537 bytes .../lib/__pycache__/whisper.cpython-312.pyc | Bin 0 -> 13459 bytes skills/uv.lock | 638 +++++++++++++++++ skills/whoopskill/SKILL.md | 102 +++ src/agents/pi-embedded-runner.ts | 1 + src/agents/pi-tools.ts | 1 + src/agents/tools/serve-tool.ts | 2 +- 35 files changed, 3427 insertions(+), 1 deletion(-) create mode 100644 skills/barrys/lib/__pycache__/__init__.cpython-312.pyc create mode 100644 skills/barrys/lib/__pycache__/api.cpython-312.pyc create mode 100644 skills/barrys/lib/__pycache__/session.cpython-312.pyc create mode 100644 skills/barrys/lib/__pycache__/types.cpython-312.pyc create mode 100644 skills/bookmark-brain/lib/__pycache__/classifier.cpython-312.pyc create mode 100644 skills/bookmark-brain/lib/__pycache__/extractor.cpython-312.pyc create mode 100644 skills/bookmark-brain/lib/__pycache__/fetcher.cpython-312.pyc create mode 100644 skills/bookmark-brain/lib/__pycache__/generator.cpython-312.pyc create mode 100644 skills/local-places/src/local_places/__pycache__/__init__.cpython-312.pyc create mode 100644 skills/local-places/src/local_places/__pycache__/google_places.cpython-312.pyc create mode 100644 skills/local-places/src/local_places/__pycache__/main.cpython-312.pyc create mode 100644 skills/local-places/src/local_places/__pycache__/schemas.cpython-312.pyc create mode 100644 skills/local-places/uv.lock create mode 100644 skills/mino/lib/__pycache__/api.cpython-312.pyc create mode 100644 skills/thebuilders-v2/LESSONS.md create mode 100644 skills/thebuilders-v2/SKILL.md create mode 100644 skills/thebuilders-v2/config/presets.yaml create mode 100644 skills/thebuilders-v2/config/voices.yaml create mode 100755 skills/thebuilders-v2/scripts/generate-sections.mjs create mode 100755 skills/thebuilders-v2/scripts/generate.mjs create mode 100755 skills/thebuilders-v2/scripts/generate.sh create mode 100644 skills/thebuilders-v2/scripts/llm-helper.mjs create mode 100644 skills/thebuilders-v2/templates/acquired-bible.md create mode 100644 skills/thebuilders-v2/templates/hook-prompt.md create mode 100644 skills/thebuilders-v2/templates/outline-prompt.md create mode 100644 skills/thebuilders-v2/templates/research-prompt.md create mode 100644 skills/thebuilders-v2/templates/review-prompt.md create mode 100644 skills/thebuilders-v2/templates/script-prompt.md create mode 100644 skills/transcribe/lib/__pycache__/r2_upload.cpython-312.pyc create mode 100644 skills/transcribe/lib/__pycache__/whisper.cpython-312.pyc create mode 100644 skills/uv.lock create mode 100644 skills/whoopskill/SKILL.md diff --git a/skills/barrys/lib/__pycache__/__init__.cpython-312.pyc b/skills/barrys/lib/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8219e3cf4b6d361f18a194eac18156dffc1c0c4c GIT binary patch literal 771 zcmY+C&5qMB5XYVLBW=^PO&3;t2&obW6s@#5azRLK*-9%SK(u@D#Y!8KT5C5^oPf%W zr{K;E(c7;~j6CP8_GKXJ0p2^JL_I&ZY4$@XJ%r0z%zJc@Cv~TQktv?@8 zf-p*~#O9W;v2DS+#%rRE>!N`hqKTWr!H#I*mT2R)iPw2YxY!k4+!Y@7L=X2wANR!o z4}_0>F~mc0fDbH`qNMT3!nd}~zZP21(8%rmTgp*Ny4) zlH>(_LkqfD(V(pkpPkIcXVHR0r?Ul_jiYEXo<5%||G)kDtCtJqY3=81lfI_1;-&IV zHburcO{P4SQn^u~8YLfB$Nk(ojY<%56@iDfFkL z>2Ks15k{R6Yt(^a=oWKM$Y*q^U3C38TxWuYlrtKptXx;iaK+xszV+MX8obsd-rd8F~PW?9x(^zb{ncV#=4eT4vn4y-hO0WR+N LuKmF&?&|#C^7PK! literal 0 HcmV?d00001 diff --git a/skills/barrys/lib/__pycache__/api.cpython-312.pyc b/skills/barrys/lib/__pycache__/api.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dda3aa224fc39dcfeb603f9c2d0e135b16760701 GIT binary patch literal 25346 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 WQP1ZKyVi1-*E)7sls_@^aQ_b#2u4!? literal 0 HcmV?d00001 diff --git a/skills/barrys/lib/__pycache__/session.cpython-312.pyc b/skills/barrys/lib/__pycache__/session.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e6cfb0fa3ebfcddd7ae15b2072d9af6ec9f4b5cf GIT binary patch literal 7368 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 E4{0MM!~g&Q literal 0 HcmV?d00001 diff --git a/skills/barrys/lib/__pycache__/types.cpython-312.pyc b/skills/barrys/lib/__pycache__/types.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c5b2a6baf0f97250c4c9ac165ebd6a8bc92db14 GIT binary patch literal 4424 zcmb_fO>Y~=8J;DV-(QkQNtPVNv;{nUyW)scOvx@#l)yfmnP+x5 z^UV9jza|n<0-w5BGWWuS{1ZFJpMcjmG894{lNDl+5-}9RXDJn5$){l3Z}}@~Nv#A* zfl9CxgfX=gG6JRW1~GzvR!R{gw4s!uMz|DPCr0E?N-1tcO9>jJ$st&tri|FT@V!n- zJyh+C#c_=KeB=%>5?>P|`K{00%eU?qDfN163fP`AY@f&W0^4_nO?zw_*vuI=-{I+ViiqG?+0r@B`GvY@az}&~O@}hw65)F_$F!@uwKcinI5mDNpI^l#`Kq^| zS#_+5Ewj45W;zpPyOL*=Q}!jzn^l88m?*DRzWV@v=6yeaQ09fQEPS`;85jrIQs=K- zznP26@3$nrE%AoLpGmwf@g0e8N}SyC&tIF8%_(e7V)MqE1(CTuH$T0yxU4PB-C0?j zUeb!6+*=ky-J|om2LaJNqH_R!kSjq zD^$}&RMRT9QMa%i*R(I{y5%u`?l6(kG`(829UZTO!<^Ldxrz(RbK1gf)&m<5ez*_T z3oRA|cuI}{$&WYl8+L`}sb$jqy6J4xSMzY+n}*5r{Jv>f+`H7gWv=F3ed01?!qpgw4(E5D0{ODKD)XQubCdpUM*Y?*yzeHP9S?VhF z_Dj8SOzJAf0-dp-Yz2S~by{I;H6kEsvRK}rD5NoqHZ8)^v_W{Gf}vBPI%b86s5^=h zi>O%ziR)#@W+H6VnbcUsOs;L}remQ)q_7qK;R4A|p81pqaZy*qbX(ZtSz3q9$bdo2l)=5?(mJWB!V72T{tk`c*Tos~CqP7O^ubBsQynXDl@ukuMIW$H48ci>PA z;pg!1F#ymd)wfe{y|FjbR5LBv&kQ!z!B+3dt>atgEA@&P*SU4b9hgZ1o^MH|u*#8f zPDVGF5rG*|BZPCjd2WpJ=OQ8j`TRcUu|#>@LW8N7%aCkDr~;_3(*n!EYx81=(J$&I zq-4z#m{W_EF@?x;i=;Pf%Ph}xv2KTw=7d4bwJuy$W)?Pstyu&Wp-b6c;26RjJbVfO zEe?a7G`q3!?Yp~^`?GuRHP!Lfl{XI5k$tDBzR`MnYP+!e;r{ZIiNlfWhnXAC)G608 zajo<9euZUr>20W2Wp@Ng8jTPDn{=3yd>I$gZ9J@;^OclObH&(uqP2oHU&X>v?&@!;(Zkf}L3mW|E0^r@7!lGm!!B#uNde^s zYw0yIxJcJQ7XkH|U8Brtux047PZ7F&Y5~U(kmP#+-;jT(*IRDkD#K5rAM4eoI_w4a z3;XH4g{C^v>KopFYwuc9z0?}K2+^t0RI{hN4#!^~-Tv_5#x8$Uf#UahAkp?If!Ck- ze<1L6F-UfJ6|=a0u{j zbPd3Wj3T1vxayyoF3xEyON(p}XD2_MUR=1XeX=w+zwr57Q6v@@=9f>py~l6KVfnXc z;Dw>ieAMG{r`4C)PW=!heWTk+$h5nG?F7i!fAN6yilNN|GSIqm z^?+n{H}?5nrAe-~#&ZW`X#eID{~xBBBnNYSv48vg%4nMafY`oRTXy4;2rI*F0^kwY z9gsvs>2DJNkHGE)Z>bC}mFX;%X}e1W@eKfvz;2&>BcR-B69A9EZjU5XCEF$d9)aDY SB>I%GHUW^t_daMz+xQPwcl3+^ literal 0 HcmV?d00001 diff --git a/skills/bookmark-brain/lib/__pycache__/classifier.cpython-312.pyc b/skills/bookmark-brain/lib/__pycache__/classifier.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0fd55a826e486af78eea8ab9428d483d43db1ba GIT binary patch literal 12709 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 literal 0 HcmV?d00001 diff --git a/skills/bookmark-brain/lib/__pycache__/extractor.cpython-312.pyc b/skills/bookmark-brain/lib/__pycache__/extractor.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4368940e68b07e9b8ac692a3dcdb2e54006fe54e GIT binary patch literal 8404 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 literal 0 HcmV?d00001 diff --git a/skills/local-places/src/local_places/__pycache__/__init__.cpython-312.pyc b/skills/local-places/src/local_places/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7311f39763545ad462614d53267929b4508164b9 GIT binary patch literal 224 zcmX@j%ge<81U#2xGYx?BV-N=h7@>^Md_cx@h7^W$#wdmq#wf;0CQasB-0|^csYS(^ z`FZj2RjdYjhI$5mnoPIYu*uC& oDa}c>D`E#44RT|#AdvXL%*e=igIl6Qzk&S*pJ*d@5i3v>05!2ZJpcdz literal 0 HcmV?d00001 diff --git a/skills/local-places/src/local_places/__pycache__/google_places.cpython-312.pyc b/skills/local-places/src/local_places/__pycache__/google_places.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1237f3af20dd295cd9aac213195c91d900d39f6 GIT binary patch literal 12051 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 literal 0 HcmV?d00001 diff --git a/skills/local-places/src/local_places/__pycache__/schemas.cpython-312.pyc b/skills/local-places/src/local_places/__pycache__/schemas.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e91dbf9d545ce72ec8f9e1da1346fe230d273c0 GIT binary patch literal 5619 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 MhI9WdK*Iy&ziCDDU;qFB literal 0 HcmV?d00001 diff --git a/skills/local-places/uv.lock b/skills/local-places/uv.lock new file mode 100644 index 000000000..dd2ee6799 --- /dev/null +++ b/skills/local-places/uv.lock @@ -0,0 +1,638 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "anyio" +version = "4.12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685, upload-time = "2026-01-06T11:45:21.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" }, +] + +[[package]] +name = "certifi" +version = "2026.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" }, +] + +[[package]] +name = "click" +version = "8.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "fastapi" +version = "0.128.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/08/8c8508db6c7b9aae8f7175046af41baad690771c9bcde676419965e338c7/fastapi-0.128.0.tar.gz", hash = "sha256:1cc179e1cef10a6be60ffe429f79b829dce99d8de32d7acb7e6c8dfdf7f2645a", size = 365682, upload-time = "2025-12-27T15:21:13.714Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/05/5cbb59154b093548acd0f4c7c474a118eda06da25aa75c616b72d8fcd92a/fastapi-0.128.0-py3-none-any.whl", hash = "sha256:aebd93f9716ee3b4f4fcfe13ffb7cf308d99c9f3ab5622d8877441072561582d", size = 103094, upload-time = "2025-12-27T15:21:12.154Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httptools" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/46/120a669232c7bdedb9d52d4aeae7e6c7dfe151e99dc70802e2fc7a5e1993/httptools-0.7.1.tar.gz", hash = "sha256:abd72556974f8e7c74a259655924a717a2365b236c882c3f6f8a45fe94703ac9", size = 258961, upload-time = "2025-10-10T03:55:08.559Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/08/17e07e8d89ab8f343c134616d72eebfe03798835058e2ab579dcc8353c06/httptools-0.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:474d3b7ab469fefcca3697a10d11a32ee2b9573250206ba1e50d5980910da657", size = 206521, upload-time = "2025-10-10T03:54:31.002Z" }, + { url = "https://files.pythonhosted.org/packages/aa/06/c9c1b41ff52f16aee526fd10fbda99fa4787938aa776858ddc4a1ea825ec/httptools-0.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3c3b7366bb6c7b96bd72d0dbe7f7d5eead261361f013be5f6d9590465ea1c70", size = 110375, upload-time = "2025-10-10T03:54:31.941Z" }, + { url = "https://files.pythonhosted.org/packages/cc/cc/10935db22fda0ee34c76f047590ca0a8bd9de531406a3ccb10a90e12ea21/httptools-0.7.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:379b479408b8747f47f3b253326183d7c009a3936518cdb70db58cffd369d9df", size = 456621, upload-time = "2025-10-10T03:54:33.176Z" }, + { url = "https://files.pythonhosted.org/packages/0e/84/875382b10d271b0c11aa5d414b44f92f8dd53e9b658aec338a79164fa548/httptools-0.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cad6b591a682dcc6cf1397c3900527f9affef1e55a06c4547264796bbd17cf5e", size = 454954, upload-time = "2025-10-10T03:54:34.226Z" }, + { url = "https://files.pythonhosted.org/packages/30/e1/44f89b280f7e46c0b1b2ccee5737d46b3bb13136383958f20b580a821ca0/httptools-0.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eb844698d11433d2139bbeeb56499102143beb582bd6c194e3ba69c22f25c274", size = 440175, upload-time = "2025-10-10T03:54:35.942Z" }, + { url = "https://files.pythonhosted.org/packages/6f/7e/b9287763159e700e335028bc1824359dc736fa9b829dacedace91a39b37e/httptools-0.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f65744d7a8bdb4bda5e1fa23e4ba16832860606fcc09d674d56e425e991539ec", size = 440310, upload-time = "2025-10-10T03:54:37.1Z" }, + { url = "https://files.pythonhosted.org/packages/b3/07/5b614f592868e07f5c94b1f301b5e14a21df4e8076215a3bccb830a687d8/httptools-0.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:135fbe974b3718eada677229312e97f3b31f8a9c8ffa3ae6f565bf808d5b6bcb", size = 86875, upload-time = "2025-10-10T03:54:38.421Z" }, + { url = "https://files.pythonhosted.org/packages/53/7f/403e5d787dc4942316e515e949b0c8a013d84078a915910e9f391ba9b3ed/httptools-0.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:38e0c83a2ea9746ebbd643bdfb521b9aa4a91703e2cd705c20443405d2fd16a5", size = 206280, upload-time = "2025-10-10T03:54:39.274Z" }, + { url = "https://files.pythonhosted.org/packages/2a/0d/7f3fd28e2ce311ccc998c388dd1c53b18120fda3b70ebb022b135dc9839b/httptools-0.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f25bbaf1235e27704f1a7b86cd3304eabc04f569c828101d94a0e605ef7205a5", size = 110004, upload-time = "2025-10-10T03:54:40.403Z" }, + { url = "https://files.pythonhosted.org/packages/84/a6/b3965e1e146ef5762870bbe76117876ceba51a201e18cc31f5703e454596/httptools-0.7.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c15f37ef679ab9ecc06bfc4e6e8628c32a8e4b305459de7cf6785acd57e4d03", size = 517655, upload-time = "2025-10-10T03:54:41.347Z" }, + { url = "https://files.pythonhosted.org/packages/11/7d/71fee6f1844e6fa378f2eddde6c3e41ce3a1fb4b2d81118dd544e3441ec0/httptools-0.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7fe6e96090df46b36ccfaf746f03034e5ab723162bc51b0a4cf58305324036f2", size = 511440, upload-time = "2025-10-10T03:54:42.452Z" }, + { url = "https://files.pythonhosted.org/packages/22/a5/079d216712a4f3ffa24af4a0381b108aa9c45b7a5cc6eb141f81726b1823/httptools-0.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f72fdbae2dbc6e68b8239defb48e6a5937b12218e6ffc2c7846cc37befa84362", size = 495186, upload-time = "2025-10-10T03:54:43.937Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9e/025ad7b65278745dee3bd0ebf9314934c4592560878308a6121f7f812084/httptools-0.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e99c7b90a29fd82fea9ef57943d501a16f3404d7b9ee81799d41639bdaae412c", size = 499192, upload-time = "2025-10-10T03:54:45.003Z" }, + { url = "https://files.pythonhosted.org/packages/6d/de/40a8f202b987d43afc4d54689600ff03ce65680ede2f31df348d7f368b8f/httptools-0.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:3e14f530fefa7499334a79b0cf7e7cd2992870eb893526fb097d51b4f2d0f321", size = 86694, upload-time = "2025-10-10T03:54:45.923Z" }, + { url = "https://files.pythonhosted.org/packages/09/8f/c77b1fcbfd262d422f12da02feb0d218fa228d52485b77b953832105bb90/httptools-0.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6babce6cfa2a99545c60bfef8bee0cc0545413cb0018f617c8059a30ad985de3", size = 202889, upload-time = "2025-10-10T03:54:47.089Z" }, + { url = "https://files.pythonhosted.org/packages/0a/1a/22887f53602feaa066354867bc49a68fc295c2293433177ee90870a7d517/httptools-0.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:601b7628de7504077dd3dcb3791c6b8694bbd967148a6d1f01806509254fb1ca", size = 108180, upload-time = "2025-10-10T03:54:48.052Z" }, + { url = "https://files.pythonhosted.org/packages/32/6a/6aaa91937f0010d288d3d124ca2946d48d60c3a5ee7ca62afe870e3ea011/httptools-0.7.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:04c6c0e6c5fb0739c5b8a9eb046d298650a0ff38cf42537fc372b28dc7e4472c", size = 478596, upload-time = "2025-10-10T03:54:48.919Z" }, + { url = "https://files.pythonhosted.org/packages/6d/70/023d7ce117993107be88d2cbca566a7c1323ccbaf0af7eabf2064fe356f6/httptools-0.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69d4f9705c405ae3ee83d6a12283dc9feba8cc6aaec671b412917e644ab4fa66", size = 473268, upload-time = "2025-10-10T03:54:49.993Z" }, + { url = "https://files.pythonhosted.org/packages/32/4d/9dd616c38da088e3f436e9a616e1d0cc66544b8cdac405cc4e81c8679fc7/httptools-0.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:44c8f4347d4b31269c8a9205d8a5ee2df5322b09bbbd30f8f862185bb6b05346", size = 455517, upload-time = "2025-10-10T03:54:51.066Z" }, + { url = "https://files.pythonhosted.org/packages/1d/3a/a6c595c310b7df958e739aae88724e24f9246a514d909547778d776799be/httptools-0.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:465275d76db4d554918aba40bf1cbebe324670f3dfc979eaffaa5d108e2ed650", size = 458337, upload-time = "2025-10-10T03:54:52.196Z" }, + { url = "https://files.pythonhosted.org/packages/fd/82/88e8d6d2c51edc1cc391b6e044c6c435b6aebe97b1abc33db1b0b24cd582/httptools-0.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:322d00c2068d125bd570f7bf78b2d367dad02b919d8581d7476d8b75b294e3e6", size = 85743, upload-time = "2025-10-10T03:54:53.448Z" }, + { url = "https://files.pythonhosted.org/packages/34/50/9d095fcbb6de2d523e027a2f304d4551855c2f46e0b82befd718b8b20056/httptools-0.7.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:c08fe65728b8d70b6923ce31e3956f859d5e1e8548e6f22ec520a962c6757270", size = 203619, upload-time = "2025-10-10T03:54:54.321Z" }, + { url = "https://files.pythonhosted.org/packages/07/f0/89720dc5139ae54b03f861b5e2c55a37dba9a5da7d51e1e824a1f343627f/httptools-0.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7aea2e3c3953521c3c51106ee11487a910d45586e351202474d45472db7d72d3", size = 108714, upload-time = "2025-10-10T03:54:55.163Z" }, + { url = "https://files.pythonhosted.org/packages/b3/cb/eea88506f191fb552c11787c23f9a405f4c7b0c5799bf73f2249cd4f5228/httptools-0.7.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0e68b8582f4ea9166be62926077a3334064d422cf08ab87d8b74664f8e9058e1", size = 472909, upload-time = "2025-10-10T03:54:56.056Z" }, + { url = "https://files.pythonhosted.org/packages/e0/4a/a548bdfae6369c0d078bab5769f7b66f17f1bfaa6fa28f81d6be6959066b/httptools-0.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df091cf961a3be783d6aebae963cc9b71e00d57fa6f149025075217bc6a55a7b", size = 470831, upload-time = "2025-10-10T03:54:57.219Z" }, + { url = "https://files.pythonhosted.org/packages/4d/31/14df99e1c43bd132eec921c2e7e11cda7852f65619bc0fc5bdc2d0cb126c/httptools-0.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f084813239e1eb403ddacd06a30de3d3e09a9b76e7894dcda2b22f8a726e9c60", size = 452631, upload-time = "2025-10-10T03:54:58.219Z" }, + { url = "https://files.pythonhosted.org/packages/22/d2/b7e131f7be8d854d48cb6d048113c30f9a46dca0c9a8b08fcb3fcd588cdc/httptools-0.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7347714368fb2b335e9063bc2b96f2f87a9ceffcd9758ac295f8bbcd3ffbc0ca", size = 452910, upload-time = "2025-10-10T03:54:59.366Z" }, + { url = "https://files.pythonhosted.org/packages/53/cf/878f3b91e4e6e011eff6d1fa9ca39f7eb17d19c9d7971b04873734112f30/httptools-0.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:cfabda2a5bb85aa2a904ce06d974a3f30fb36cc63d7feaddec05d2050acede96", size = 88205, upload-time = "2025-10-10T03:55:00.389Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "my-api" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "fastapi" }, + { name = "httpx" }, + { name = "uvicorn", extra = ["standard"] }, +] + +[package.optional-dependencies] +dev = [ + { name = "pytest" }, +] + +[package.metadata] +requires-dist = [ + { name = "fastapi", specifier = ">=0.110.0" }, + { name = "httpx", specifier = ">=0.27.0" }, + { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0.0" }, + { name = "uvicorn", extras = ["standard"], specifier = ">=0.29.0" }, +] +provides-extras = ["dev"] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pydantic" +version = "2.12.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.41.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", size = 2105873, upload-time = "2025-11-04T13:39:31.373Z" }, + { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826, upload-time = "2025-11-04T13:39:32.897Z" }, + { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869, upload-time = "2025-11-04T13:39:34.469Z" }, + { url = "https://files.pythonhosted.org/packages/6e/6a/30d94a9674a7fe4f4744052ed6c5e083424510be1e93da5bc47569d11810/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8", size = 2063890, upload-time = "2025-11-04T13:39:36.053Z" }, + { url = "https://files.pythonhosted.org/packages/50/be/76e5d46203fcb2750e542f32e6c371ffa9b8ad17364cf94bb0818dbfb50c/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e", size = 2229740, upload-time = "2025-11-04T13:39:37.753Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ee/fed784df0144793489f87db310a6bbf8118d7b630ed07aa180d6067e653a/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1", size = 2350021, upload-time = "2025-11-04T13:39:40.94Z" }, + { url = "https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", size = 2066378, upload-time = "2025-11-04T13:39:42.523Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3b/698cf8ae1d536a010e05121b4958b1257f0b5522085e335360e53a6b1c8b/pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b", size = 2175761, upload-time = "2025-11-04T13:39:44.553Z" }, + { url = "https://files.pythonhosted.org/packages/b8/ba/15d537423939553116dea94ce02f9c31be0fa9d0b806d427e0308ec17145/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", size = 2146303, upload-time = "2025-11-04T13:39:46.238Z" }, + { url = "https://files.pythonhosted.org/packages/58/7f/0de669bf37d206723795f9c90c82966726a2ab06c336deba4735b55af431/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594", size = 2340355, upload-time = "2025-11-04T13:39:48.002Z" }, + { url = "https://files.pythonhosted.org/packages/e5/de/e7482c435b83d7e3c3ee5ee4451f6e8973cff0eb6007d2872ce6383f6398/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", size = 2319875, upload-time = "2025-11-04T13:39:49.705Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e6/8c9e81bb6dd7560e33b9053351c29f30c8194b72f2d6932888581f503482/pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b", size = 1987549, upload-time = "2025-11-04T13:39:51.842Z" }, + { url = "https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe", size = 2011305, upload-time = "2025-11-04T13:39:53.485Z" }, + { url = "https://files.pythonhosted.org/packages/56/d8/0e271434e8efd03186c5386671328154ee349ff0354d83c74f5caaf096ed/pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f", size = 1972902, upload-time = "2025-11-04T13:39:56.488Z" }, + { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, + { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, + { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, + { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" }, + { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" }, + { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" }, + { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, + { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" }, + { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, + { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, + { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload-time = "2025-11-04T13:40:19.309Z" }, + { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload-time = "2025-11-04T13:40:21.548Z" }, + { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload-time = "2025-11-04T13:40:23.393Z" }, + { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403, upload-time = "2025-11-04T13:40:25.248Z" }, + { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload-time = "2025-11-04T13:40:27.099Z" }, + { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload-time = "2025-11-04T13:40:29.806Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258, upload-time = "2025-11-04T13:40:33.544Z" }, + { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917, upload-time = "2025-11-04T13:40:35.479Z" }, + { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186, upload-time = "2025-11-04T13:40:37.436Z" }, + { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164, upload-time = "2025-11-04T13:40:40.289Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146, upload-time = "2025-11-04T13:40:42.809Z" }, + { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788, upload-time = "2025-11-04T13:40:44.752Z" }, + { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133, upload-time = "2025-11-04T13:40:46.66Z" }, + { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852, upload-time = "2025-11-04T13:40:48.575Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", size = 1994679, upload-time = "2025-11-04T13:40:50.619Z" }, + { url = "https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", size = 2019766, upload-time = "2025-11-04T13:40:52.631Z" }, + { url = "https://files.pythonhosted.org/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", size = 1981005, upload-time = "2025-11-04T13:40:54.734Z" }, + { url = "https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", size = 2119622, upload-time = "2025-11-04T13:40:56.68Z" }, + { url = "https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", size = 1891725, upload-time = "2025-11-04T13:40:58.807Z" }, + { url = "https://files.pythonhosted.org/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", size = 1915040, upload-time = "2025-11-04T13:41:00.853Z" }, + { url = "https://files.pythonhosted.org/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", size = 2063691, upload-time = "2025-11-04T13:41:03.504Z" }, + { url = "https://files.pythonhosted.org/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", size = 2213897, upload-time = "2025-11-04T13:41:05.804Z" }, + { url = "https://files.pythonhosted.org/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", size = 2333302, upload-time = "2025-11-04T13:41:07.809Z" }, + { url = "https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", size = 2064877, upload-time = "2025-11-04T13:41:09.827Z" }, + { url = "https://files.pythonhosted.org/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", size = 2180680, upload-time = "2025-11-04T13:41:12.379Z" }, + { url = "https://files.pythonhosted.org/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", size = 2138960, upload-time = "2025-11-04T13:41:14.627Z" }, + { url = "https://files.pythonhosted.org/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", size = 2339102, upload-time = "2025-11-04T13:41:16.868Z" }, + { url = "https://files.pythonhosted.org/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", size = 2326039, upload-time = "2025-11-04T13:41:18.934Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", size = 1995126, upload-time = "2025-11-04T13:41:21.418Z" }, + { url = "https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", size = 2015489, upload-time = "2025-11-04T13:41:24.076Z" }, + { url = "https://files.pythonhosted.org/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", size = 1977288, upload-time = "2025-11-04T13:41:26.33Z" }, + { url = "https://files.pythonhosted.org/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", size = 2120255, upload-time = "2025-11-04T13:41:28.569Z" }, + { url = "https://files.pythonhosted.org/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", size = 1863760, upload-time = "2025-11-04T13:41:31.055Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", size = 1878092, upload-time = "2025-11-04T13:41:33.21Z" }, + { url = "https://files.pythonhosted.org/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", size = 2053385, upload-time = "2025-11-04T13:41:35.508Z" }, + { url = "https://files.pythonhosted.org/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", size = 2218832, upload-time = "2025-11-04T13:41:37.732Z" }, + { url = "https://files.pythonhosted.org/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", size = 2327585, upload-time = "2025-11-04T13:41:40Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", size = 2041078, upload-time = "2025-11-04T13:41:42.323Z" }, + { url = "https://files.pythonhosted.org/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", size = 2173914, upload-time = "2025-11-04T13:41:45.221Z" }, + { url = "https://files.pythonhosted.org/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", size = 2129560, upload-time = "2025-11-04T13:41:47.474Z" }, + { url = "https://files.pythonhosted.org/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", size = 2329244, upload-time = "2025-11-04T13:41:49.992Z" }, + { url = "https://files.pythonhosted.org/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", size = 2331955, upload-time = "2025-11-04T13:41:54.079Z" }, + { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906, upload-time = "2025-11-04T13:41:56.606Z" }, + { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607, upload-time = "2025-11-04T13:41:58.889Z" }, + { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" }, + { url = "https://files.pythonhosted.org/packages/11/72/90fda5ee3b97e51c494938a4a44c3a35a9c96c19bba12372fb9c634d6f57/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034", size = 2115441, upload-time = "2025-11-04T13:42:39.557Z" }, + { url = "https://files.pythonhosted.org/packages/1f/53/8942f884fa33f50794f119012dc6a1a02ac43a56407adaac20463df8e98f/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", size = 1930291, upload-time = "2025-11-04T13:42:42.169Z" }, + { url = "https://files.pythonhosted.org/packages/79/c8/ecb9ed9cd942bce09fc888ee960b52654fbdbede4ba6c2d6e0d3b1d8b49c/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", size = 1948632, upload-time = "2025-11-04T13:42:44.564Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1b/687711069de7efa6af934e74f601e2a4307365e8fdc404703afc453eab26/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", size = 2138905, upload-time = "2025-11-04T13:42:47.156Z" }, + { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, + { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, + { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, + { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, + { url = "https://files.pythonhosted.org/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", size = 2101980, upload-time = "2025-11-04T13:43:25.97Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865, upload-time = "2025-11-04T13:43:28.763Z" }, + { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256, upload-time = "2025-11-04T13:43:31.71Z" }, + { url = "https://files.pythonhosted.org/packages/83/d9/8412d7f06f616bbc053d30cb4e5f76786af3221462ad5eee1f202021eb4e/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1", size = 2174762, upload-time = "2025-11-04T13:43:34.744Z" }, + { url = "https://files.pythonhosted.org/packages/55/4c/162d906b8e3ba3a99354e20faa1b49a85206c47de97a639510a0e673f5da/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", size = 2143141, upload-time = "2025-11-04T13:43:37.701Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f2/f11dd73284122713f5f89fc940f370d035fa8e1e078d446b3313955157fe/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770", size = 2330317, upload-time = "2025-11-04T13:43:40.406Z" }, + { url = "https://files.pythonhosted.org/packages/88/9d/b06ca6acfe4abb296110fb1273a4d848a0bfb2ff65f3ee92127b3244e16b/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", size = 2316992, upload-time = "2025-11-04T13:43:43.602Z" }, + { url = "https://files.pythonhosted.org/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", size = 2145302, upload-time = "2025-11-04T13:43:46.64Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +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" } +wheels = [ + { 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" }, +] + +[[package]] +name = "pytest" +version = "9.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" }, +] + +[[package]] +name = "python-dotenv" +version = "1.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f0/26/19cadc79a718c5edbec86fd4919a6b6d3f681039a2f6d66d14be94e75fb9/python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6", size = 44221, upload-time = "2025-10-26T15:12:10.434Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/1b/a298b06749107c305e1fe0f814c6c74aea7b2f1e10989cb30f544a1b3253/python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61", size = 21230, upload-time = "2025-10-26T15:12:09.109Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "starlette" +version = "0.50.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/b8/73a0e6a6e079a9d9cfa64113d771e421640b6f679a52eeb9b32f72d871a1/starlette-0.50.0.tar.gz", hash = "sha256:a2a17b22203254bcbc2e1f926d2d55f3f9497f769416b3190768befe598fa3ca", size = 2646985, upload-time = "2025-11-01T15:25:27.516Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/52/1064f510b141bd54025f9b55105e26d1fa970b9be67ad766380a3c9b74b0/starlette-0.50.0-py3-none-any.whl", hash = "sha256:9e5391843ec9b6e472eed1365a78c8098cfceb7a74bfd4d6b1c0c0095efb3bca", size = 74033, upload-time = "2025-11-01T15:25:25.461Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +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" } +wheels = [ + { 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" }, +] + +[[package]] +name = "uvicorn" +version = "0.40.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c3/d1/8f3c683c9561a4e6689dd3b1d345c815f10f86acd044ee1fb9a4dcd0b8c5/uvicorn-0.40.0.tar.gz", hash = "sha256:839676675e87e73694518b5574fd0f24c9d97b46bea16df7b8c05ea1a51071ea", size = 81761, upload-time = "2025-12-21T14:16:22.45Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/d8/2083a1daa7439a66f3a48589a57d576aa117726762618f6bb09fe3798796/uvicorn-0.40.0-py3-none-any.whl", hash = "sha256:c6c8f55bc8bf13eb6fa9ff87ad62308bbbc33d0b67f84293151efe87e0d5f2ee", size = 68502, upload-time = "2025-12-21T14:16:21.041Z" }, +] + +[package.optional-dependencies] +standard = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "httptools" }, + { name = "python-dotenv" }, + { name = "pyyaml" }, + { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, + { name = "watchfiles" }, + { name = "websockets" }, +] + +[[package]] +name = "uvloop" +version = "0.22.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/06/f0/18d39dbd1971d6d62c4629cc7fa67f74821b0dc1f5a77af43719de7936a7/uvloop-0.22.1.tar.gz", hash = "sha256:6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f", size = 2443250, upload-time = "2025-10-16T22:17:19.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/d5/69900f7883235562f1f50d8184bb7dd84a2fb61e9ec63f3782546fdbd057/uvloop-0.22.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c60ebcd36f7b240b30788554b6f0782454826a0ed765d8430652621b5de674b9", size = 1352420, upload-time = "2025-10-16T22:16:21.187Z" }, + { url = "https://files.pythonhosted.org/packages/a8/73/c4e271b3bce59724e291465cc936c37758886a4868787da0278b3b56b905/uvloop-0.22.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b7f102bf3cb1995cfeaee9321105e8f5da76fdb104cdad8986f85461a1b7b77", size = 748677, upload-time = "2025-10-16T22:16:22.558Z" }, + { url = "https://files.pythonhosted.org/packages/86/94/9fb7fad2f824d25f8ecac0d70b94d0d48107ad5ece03769a9c543444f78a/uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53c85520781d84a4b8b230e24a5af5b0778efdb39142b424990ff1ef7c48ba21", size = 3753819, upload-time = "2025-10-16T22:16:23.903Z" }, + { url = "https://files.pythonhosted.org/packages/74/4f/256aca690709e9b008b7108bc85fba619a2bc37c6d80743d18abad16ee09/uvloop-0.22.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56a2d1fae65fd82197cb8c53c367310b3eabe1bbb9fb5a04d28e3e3520e4f702", size = 3804529, upload-time = "2025-10-16T22:16:25.246Z" }, + { url = "https://files.pythonhosted.org/packages/7f/74/03c05ae4737e871923d21a76fe28b6aad57f5c03b6e6bfcfa5ad616013e4/uvloop-0.22.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40631b049d5972c6755b06d0bfe8233b1bd9a8a6392d9d1c45c10b6f9e9b2733", size = 3621267, upload-time = "2025-10-16T22:16:26.819Z" }, + { url = "https://files.pythonhosted.org/packages/75/be/f8e590fe61d18b4a92070905497aec4c0e64ae1761498cad09023f3f4b3e/uvloop-0.22.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:535cc37b3a04f6cd2c1ef65fa1d370c9a35b6695df735fcff5427323f2cd5473", size = 3723105, upload-time = "2025-10-16T22:16:28.252Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ff/7f72e8170be527b4977b033239a83a68d5c881cc4775fca255c677f7ac5d/uvloop-0.22.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fe94b4564e865d968414598eea1a6de60adba0c040ba4ed05ac1300de402cd42", size = 1359936, upload-time = "2025-10-16T22:16:29.436Z" }, + { url = "https://files.pythonhosted.org/packages/c3/c6/e5d433f88fd54d81ef4be58b2b7b0cea13c442454a1db703a1eea0db1a59/uvloop-0.22.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:51eb9bd88391483410daad430813d982010f9c9c89512321f5b60e2cddbdddd6", size = 752769, upload-time = "2025-10-16T22:16:30.493Z" }, + { url = "https://files.pythonhosted.org/packages/24/68/a6ac446820273e71aa762fa21cdcc09861edd3536ff47c5cd3b7afb10eeb/uvloop-0.22.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:700e674a166ca5778255e0e1dc4e9d79ab2acc57b9171b79e65feba7184b3370", size = 4317413, upload-time = "2025-10-16T22:16:31.644Z" }, + { url = "https://files.pythonhosted.org/packages/5f/6f/e62b4dfc7ad6518e7eff2516f680d02a0f6eb62c0c212e152ca708a0085e/uvloop-0.22.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b5b1ac819a3f946d3b2ee07f09149578ae76066d70b44df3fa990add49a82e4", size = 4426307, upload-time = "2025-10-16T22:16:32.917Z" }, + { url = "https://files.pythonhosted.org/packages/90/60/97362554ac21e20e81bcef1150cb2a7e4ffdaf8ea1e5b2e8bf7a053caa18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e047cc068570bac9866237739607d1313b9253c3051ad84738cbb095be0537b2", size = 4131970, upload-time = "2025-10-16T22:16:34.015Z" }, + { url = "https://files.pythonhosted.org/packages/99/39/6b3f7d234ba3964c428a6e40006340f53ba37993f46ed6e111c6e9141d18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:512fec6815e2dd45161054592441ef76c830eddaad55c8aa30952e6fe1ed07c0", size = 4296343, upload-time = "2025-10-16T22:16:35.149Z" }, + { url = "https://files.pythonhosted.org/packages/89/8c/182a2a593195bfd39842ea68ebc084e20c850806117213f5a299dfc513d9/uvloop-0.22.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:561577354eb94200d75aca23fbde86ee11be36b00e52a4eaf8f50fb0c86b7705", size = 1358611, upload-time = "2025-10-16T22:16:36.833Z" }, + { url = "https://files.pythonhosted.org/packages/d2/14/e301ee96a6dc95224b6f1162cd3312f6d1217be3907b79173b06785f2fe7/uvloop-0.22.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cdf5192ab3e674ca26da2eada35b288d2fa49fdd0f357a19f0e7c4e7d5077c8", size = 751811, upload-time = "2025-10-16T22:16:38.275Z" }, + { url = "https://files.pythonhosted.org/packages/b7/02/654426ce265ac19e2980bfd9ea6590ca96a56f10c76e63801a2df01c0486/uvloop-0.22.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e2ea3d6190a2968f4a14a23019d3b16870dd2190cd69c8180f7c632d21de68d", size = 4288562, upload-time = "2025-10-16T22:16:39.375Z" }, + { url = "https://files.pythonhosted.org/packages/15/c0/0be24758891ef825f2065cd5db8741aaddabe3e248ee6acc5e8a80f04005/uvloop-0.22.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0530a5fbad9c9e4ee3f2b33b148c6a64d47bbad8000ea63704fa8260f4cf728e", size = 4366890, upload-time = "2025-10-16T22:16:40.547Z" }, + { url = "https://files.pythonhosted.org/packages/d2/53/8369e5219a5855869bcee5f4d317f6da0e2c669aecf0ef7d371e3d084449/uvloop-0.22.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bc5ef13bbc10b5335792360623cc378d52d7e62c2de64660616478c32cd0598e", size = 4119472, upload-time = "2025-10-16T22:16:41.694Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ba/d69adbe699b768f6b29a5eec7b47dd610bd17a69de51b251126a801369ea/uvloop-0.22.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1f38ec5e3f18c8a10ded09742f7fb8de0108796eb673f30ce7762ce1b8550cad", size = 4239051, upload-time = "2025-10-16T22:16:43.224Z" }, + { url = "https://files.pythonhosted.org/packages/90/cd/b62bdeaa429758aee8de8b00ac0dd26593a9de93d302bff3d21439e9791d/uvloop-0.22.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3879b88423ec7e97cd4eba2a443aa26ed4e59b45e6b76aabf13fe2f27023a142", size = 1362067, upload-time = "2025-10-16T22:16:44.503Z" }, + { url = "https://files.pythonhosted.org/packages/0d/f8/a132124dfda0777e489ca86732e85e69afcd1ff7686647000050ba670689/uvloop-0.22.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4baa86acedf1d62115c1dc6ad1e17134476688f08c6efd8a2ab076e815665c74", size = 752423, upload-time = "2025-10-16T22:16:45.968Z" }, + { url = "https://files.pythonhosted.org/packages/a3/94/94af78c156f88da4b3a733773ad5ba0b164393e357cc4bd0ab2e2677a7d6/uvloop-0.22.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:297c27d8003520596236bdb2335e6b3f649480bd09e00d1e3a99144b691d2a35", size = 4272437, upload-time = "2025-10-16T22:16:47.451Z" }, + { url = "https://files.pythonhosted.org/packages/b5/35/60249e9fd07b32c665192cec7af29e06c7cd96fa1d08b84f012a56a0b38e/uvloop-0.22.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1955d5a1dd43198244d47664a5858082a3239766a839b2102a269aaff7a4e25", size = 4292101, upload-time = "2025-10-16T22:16:49.318Z" }, + { url = "https://files.pythonhosted.org/packages/02/62/67d382dfcb25d0a98ce73c11ed1a6fba5037a1a1d533dcbb7cab033a2636/uvloop-0.22.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b31dc2fccbd42adc73bc4e7cdbae4fc5086cf378979e53ca5d0301838c5682c6", size = 4114158, upload-time = "2025-10-16T22:16:50.517Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/f1171b4a882a5d13c8b7576f348acfe6074d72eaf52cccef752f748d4a9f/uvloop-0.22.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:93f617675b2d03af4e72a5333ef89450dfaa5321303ede6e67ba9c9d26878079", size = 4177360, upload-time = "2025-10-16T22:16:52.646Z" }, + { url = "https://files.pythonhosted.org/packages/79/7b/b01414f31546caf0919da80ad57cbfe24c56b151d12af68cee1b04922ca8/uvloop-0.22.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:37554f70528f60cad66945b885eb01f1bb514f132d92b6eeed1c90fd54ed6289", size = 1454790, upload-time = "2025-10-16T22:16:54.355Z" }, + { url = "https://files.pythonhosted.org/packages/d4/31/0bb232318dd838cad3fa8fb0c68c8b40e1145b32025581975e18b11fab40/uvloop-0.22.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b76324e2dc033a0b2f435f33eb88ff9913c156ef78e153fb210e03c13da746b3", size = 796783, upload-time = "2025-10-16T22:16:55.906Z" }, + { url = "https://files.pythonhosted.org/packages/42/38/c9b09f3271a7a723a5de69f8e237ab8e7803183131bc57c890db0b6bb872/uvloop-0.22.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:badb4d8e58ee08dad957002027830d5c3b06aea446a6a3744483c2b3b745345c", size = 4647548, upload-time = "2025-10-16T22:16:57.008Z" }, + { url = "https://files.pythonhosted.org/packages/c1/37/945b4ca0ac27e3dc4952642d4c900edd030b3da6c9634875af6e13ae80e5/uvloop-0.22.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b91328c72635f6f9e0282e4a57da7470c7350ab1c9f48546c0f2866205349d21", size = 4467065, upload-time = "2025-10-16T22:16:58.206Z" }, + { url = "https://files.pythonhosted.org/packages/97/cc/48d232f33d60e2e2e0b42f4e73455b146b76ebe216487e862700457fbf3c/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:daf620c2995d193449393d6c62131b3fbd40a63bf7b307a1527856ace637fe88", size = 4328384, upload-time = "2025-10-16T22:16:59.36Z" }, + { url = "https://files.pythonhosted.org/packages/e4/16/c1fd27e9549f3c4baf1dc9c20c456cd2f822dbf8de9f463824b0c0357e06/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6cde23eeda1a25c75b2e07d39970f3374105d5eafbaab2a4482be82f272d5a5e", size = 4296730, upload-time = "2025-10-16T22:17:00.744Z" }, +] + +[[package]] +name = "watchfiles" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c2/c9/8869df9b2a2d6c59d79220a4db37679e74f807c559ffe5265e08b227a210/watchfiles-1.1.1.tar.gz", hash = "sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2", size = 94440, upload-time = "2025-10-14T15:06:21.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/f8/2c5f479fb531ce2f0564eda479faecf253d886b1ab3630a39b7bf7362d46/watchfiles-1.1.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f57b396167a2565a4e8b5e56a5a1c537571733992b226f4f1197d79e94cf0ae5", size = 406529, upload-time = "2025-10-14T15:04:32.899Z" }, + { url = "https://files.pythonhosted.org/packages/fe/cd/f515660b1f32f65df671ddf6f85bfaca621aee177712874dc30a97397977/watchfiles-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:421e29339983e1bebc281fab40d812742268ad057db4aee8c4d2bce0af43b741", size = 394384, upload-time = "2025-10-14T15:04:33.761Z" }, + { url = "https://files.pythonhosted.org/packages/7b/c3/28b7dc99733eab43fca2d10f55c86e03bd6ab11ca31b802abac26b23d161/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e43d39a741e972bab5d8100b5cdacf69db64e34eb19b6e9af162bccf63c5cc6", size = 448789, upload-time = "2025-10-14T15:04:34.679Z" }, + { url = "https://files.pythonhosted.org/packages/4a/24/33e71113b320030011c8e4316ccca04194bf0cbbaeee207f00cbc7d6b9f5/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f537afb3276d12814082a2e9b242bdcf416c2e8fd9f799a737990a1dbe906e5b", size = 460521, upload-time = "2025-10-14T15:04:35.963Z" }, + { url = "https://files.pythonhosted.org/packages/f4/c3/3c9a55f255aa57b91579ae9e98c88704955fa9dac3e5614fb378291155df/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2cd9e04277e756a2e2d2543d65d1e2166d6fd4c9b183f8808634fda23f17b14", size = 488722, upload-time = "2025-10-14T15:04:37.091Z" }, + { url = "https://files.pythonhosted.org/packages/49/36/506447b73eb46c120169dc1717fe2eff07c234bb3232a7200b5f5bd816e9/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f3f58818dc0b07f7d9aa7fe9eb1037aecb9700e63e1f6acfed13e9fef648f5d", size = 596088, upload-time = "2025-10-14T15:04:38.39Z" }, + { url = "https://files.pythonhosted.org/packages/82/ab/5f39e752a9838ec4d52e9b87c1e80f1ee3ccdbe92e183c15b6577ab9de16/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb9f66367023ae783551042d31b1d7fd422e8289eedd91f26754a66f44d5cff", size = 472923, upload-time = "2025-10-14T15:04:39.666Z" }, + { url = "https://files.pythonhosted.org/packages/af/b9/a419292f05e302dea372fa7e6fda5178a92998411f8581b9830d28fb9edb/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aebfd0861a83e6c3d1110b78ad54704486555246e542be3e2bb94195eabb2606", size = 456080, upload-time = "2025-10-14T15:04:40.643Z" }, + { url = "https://files.pythonhosted.org/packages/b0/c3/d5932fd62bde1a30c36e10c409dc5d54506726f08cb3e1d8d0ba5e2bc8db/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5fac835b4ab3c6487b5dbad78c4b3724e26bcc468e886f8ba8cc4306f68f6701", size = 629432, upload-time = "2025-10-14T15:04:41.789Z" }, + { url = "https://files.pythonhosted.org/packages/f7/77/16bddd9779fafb795f1a94319dc965209c5641db5bf1edbbccace6d1b3c0/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:399600947b170270e80134ac854e21b3ccdefa11a9529a3decc1327088180f10", size = 623046, upload-time = "2025-10-14T15:04:42.718Z" }, + { url = "https://files.pythonhosted.org/packages/46/ef/f2ecb9a0f342b4bfad13a2787155c6ee7ce792140eac63a34676a2feeef2/watchfiles-1.1.1-cp311-cp311-win32.whl", hash = "sha256:de6da501c883f58ad50db3a32ad397b09ad29865b5f26f64c24d3e3281685849", size = 271473, upload-time = "2025-10-14T15:04:43.624Z" }, + { url = "https://files.pythonhosted.org/packages/94/bc/f42d71125f19731ea435c3948cad148d31a64fccde3867e5ba4edee901f9/watchfiles-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:35c53bd62a0b885bf653ebf6b700d1bf05debb78ad9292cf2a942b23513dc4c4", size = 287598, upload-time = "2025-10-14T15:04:44.516Z" }, + { url = "https://files.pythonhosted.org/packages/57/c9/a30f897351f95bbbfb6abcadafbaca711ce1162f4db95fc908c98a9165f3/watchfiles-1.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:57ca5281a8b5e27593cb7d82c2ac927ad88a96ed406aa446f6344e4328208e9e", size = 277210, upload-time = "2025-10-14T15:04:45.883Z" }, + { url = "https://files.pythonhosted.org/packages/74/d5/f039e7e3c639d9b1d09b07ea412a6806d38123f0508e5f9b48a87b0a76cc/watchfiles-1.1.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8c89f9f2f740a6b7dcc753140dd5e1ab9215966f7a3530d0c0705c83b401bd7d", size = 404745, upload-time = "2025-10-14T15:04:46.731Z" }, + { url = "https://files.pythonhosted.org/packages/a5/96/a881a13aa1349827490dab2d363c8039527060cfcc2c92cc6d13d1b1049e/watchfiles-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd404be08018c37350f0d6e34676bd1e2889990117a2b90070b3007f172d0610", size = 391769, upload-time = "2025-10-14T15:04:48.003Z" }, + { url = "https://files.pythonhosted.org/packages/4b/5b/d3b460364aeb8da471c1989238ea0e56bec24b6042a68046adf3d9ddb01c/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8526e8f916bb5b9a0a777c8317c23ce65de259422bba5b31325a6fa6029d33af", size = 449374, upload-time = "2025-10-14T15:04:49.179Z" }, + { url = "https://files.pythonhosted.org/packages/b9/44/5769cb62d4ed055cb17417c0a109a92f007114a4e07f30812a73a4efdb11/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2edc3553362b1c38d9f06242416a5d8e9fe235c204a4072e988ce2e5bb1f69f6", size = 459485, upload-time = "2025-10-14T15:04:50.155Z" }, + { url = "https://files.pythonhosted.org/packages/19/0c/286b6301ded2eccd4ffd0041a1b726afda999926cf720aab63adb68a1e36/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30f7da3fb3f2844259cba4720c3fc7138eb0f7b659c38f3bfa65084c7fc7abce", size = 488813, upload-time = "2025-10-14T15:04:51.059Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2b/8530ed41112dd4a22f4dcfdb5ccf6a1baad1ff6eed8dc5a5f09e7e8c41c7/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8979280bdafff686ba5e4d8f97840f929a87ed9cdf133cbbd42f7766774d2aa", size = 594816, upload-time = "2025-10-14T15:04:52.031Z" }, + { url = "https://files.pythonhosted.org/packages/ce/d2/f5f9fb49489f184f18470d4f99f4e862a4b3e9ac2865688eb2099e3d837a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcc5c24523771db3a294c77d94771abcfcb82a0e0ee8efd910c37c59ec1b31bb", size = 475186, upload-time = "2025-10-14T15:04:53.064Z" }, + { url = "https://files.pythonhosted.org/packages/cf/68/5707da262a119fb06fbe214d82dd1fe4a6f4af32d2d14de368d0349eb52a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db5d7ae38ff20153d542460752ff397fcf5c96090c1230803713cf3147a6803", size = 456812, upload-time = "2025-10-14T15:04:55.174Z" }, + { url = "https://files.pythonhosted.org/packages/66/ab/3cbb8756323e8f9b6f9acb9ef4ec26d42b2109bce830cc1f3468df20511d/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:28475ddbde92df1874b6c5c8aaeb24ad5be47a11f87cde5a28ef3835932e3e94", size = 630196, upload-time = "2025-10-14T15:04:56.22Z" }, + { url = "https://files.pythonhosted.org/packages/78/46/7152ec29b8335f80167928944a94955015a345440f524d2dfe63fc2f437b/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:36193ed342f5b9842edd3532729a2ad55c4160ffcfa3700e0d54be496b70dd43", size = 622657, upload-time = "2025-10-14T15:04:57.521Z" }, + { url = "https://files.pythonhosted.org/packages/0a/bf/95895e78dd75efe9a7f31733607f384b42eb5feb54bd2eb6ed57cc2e94f4/watchfiles-1.1.1-cp312-cp312-win32.whl", hash = "sha256:859e43a1951717cc8de7f4c77674a6d389b106361585951d9e69572823f311d9", size = 272042, upload-time = "2025-10-14T15:04:59.046Z" }, + { url = "https://files.pythonhosted.org/packages/87/0a/90eb755f568de2688cb220171c4191df932232c20946966c27a59c400850/watchfiles-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:91d4c9a823a8c987cce8fa2690923b069966dabb196dd8d137ea2cede885fde9", size = 288410, upload-time = "2025-10-14T15:05:00.081Z" }, + { url = "https://files.pythonhosted.org/packages/36/76/f322701530586922fbd6723c4f91ace21364924822a8772c549483abed13/watchfiles-1.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:a625815d4a2bdca61953dbba5a39d60164451ef34c88d751f6c368c3ea73d404", size = 278209, upload-time = "2025-10-14T15:05:01.168Z" }, + { url = "https://files.pythonhosted.org/packages/bb/f4/f750b29225fe77139f7ae5de89d4949f5a99f934c65a1f1c0b248f26f747/watchfiles-1.1.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:130e4876309e8686a5e37dba7d5e9bc77e6ed908266996ca26572437a5271e18", size = 404321, upload-time = "2025-10-14T15:05:02.063Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f9/f07a295cde762644aa4c4bb0f88921d2d141af45e735b965fb2e87858328/watchfiles-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f3bde70f157f84ece3765b42b4a52c6ac1a50334903c6eaf765362f6ccca88a", size = 391783, upload-time = "2025-10-14T15:05:03.052Z" }, + { url = "https://files.pythonhosted.org/packages/bc/11/fc2502457e0bea39a5c958d86d2cb69e407a4d00b85735ca724bfa6e0d1a/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e0b1fe858430fc0251737ef3824c54027bedb8c37c38114488b8e131cf8219", size = 449279, upload-time = "2025-10-14T15:05:04.004Z" }, + { url = "https://files.pythonhosted.org/packages/e3/1f/d66bc15ea0b728df3ed96a539c777acfcad0eb78555ad9efcaa1274688f0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f27db948078f3823a6bb3b465180db8ebecf26dd5dae6f6180bd87383b6b4428", size = 459405, upload-time = "2025-10-14T15:05:04.942Z" }, + { url = "https://files.pythonhosted.org/packages/be/90/9f4a65c0aec3ccf032703e6db02d89a157462fbb2cf20dd415128251cac0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:059098c3a429f62fc98e8ec62b982230ef2c8df68c79e826e37b895bc359a9c0", size = 488976, upload-time = "2025-10-14T15:05:05.905Z" }, + { url = "https://files.pythonhosted.org/packages/37/57/ee347af605d867f712be7029bb94c8c071732a4b44792e3176fa3c612d39/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfb5862016acc9b869bb57284e6cb35fdf8e22fe59f7548858e2f971d045f150", size = 595506, upload-time = "2025-10-14T15:05:06.906Z" }, + { url = "https://files.pythonhosted.org/packages/a8/78/cc5ab0b86c122047f75e8fc471c67a04dee395daf847d3e59381996c8707/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:319b27255aacd9923b8a276bb14d21a5f7ff82564c744235fc5eae58d95422ae", size = 474936, upload-time = "2025-10-14T15:05:07.906Z" }, + { url = "https://files.pythonhosted.org/packages/62/da/def65b170a3815af7bd40a3e7010bf6ab53089ef1b75d05dd5385b87cf08/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c755367e51db90e75b19454b680903631d41f9e3607fbd941d296a020c2d752d", size = 456147, upload-time = "2025-10-14T15:05:09.138Z" }, + { url = "https://files.pythonhosted.org/packages/57/99/da6573ba71166e82d288d4df0839128004c67d2778d3b566c138695f5c0b/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c22c776292a23bfc7237a98f791b9ad3144b02116ff10d820829ce62dff46d0b", size = 630007, upload-time = "2025-10-14T15:05:10.117Z" }, + { url = "https://files.pythonhosted.org/packages/a8/51/7439c4dd39511368849eb1e53279cd3454b4a4dbace80bab88feeb83c6b5/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3a476189be23c3686bc2f4321dd501cb329c0a0469e77b7b534ee10129ae6374", size = 622280, upload-time = "2025-10-14T15:05:11.146Z" }, + { url = "https://files.pythonhosted.org/packages/95/9c/8ed97d4bba5db6fdcdb2b298d3898f2dd5c20f6b73aee04eabe56c59677e/watchfiles-1.1.1-cp313-cp313-win32.whl", hash = "sha256:bf0a91bfb5574a2f7fc223cf95eeea79abfefa404bf1ea5e339c0c1560ae99a0", size = 272056, upload-time = "2025-10-14T15:05:12.156Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f3/c14e28429f744a260d8ceae18bf58c1d5fa56b50d006a7a9f80e1882cb0d/watchfiles-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:52e06553899e11e8074503c8e716d574adeeb7e68913115c4b3653c53f9bae42", size = 288162, upload-time = "2025-10-14T15:05:13.208Z" }, + { url = "https://files.pythonhosted.org/packages/dc/61/fe0e56c40d5cd29523e398d31153218718c5786b5e636d9ae8ae79453d27/watchfiles-1.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:ac3cc5759570cd02662b15fbcd9d917f7ecd47efe0d6b40474eafd246f91ea18", size = 277909, upload-time = "2025-10-14T15:05:14.49Z" }, + { url = "https://files.pythonhosted.org/packages/79/42/e0a7d749626f1e28c7108a99fb9bf524b501bbbeb9b261ceecde644d5a07/watchfiles-1.1.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:563b116874a9a7ce6f96f87cd0b94f7faf92d08d0021e837796f0a14318ef8da", size = 403389, upload-time = "2025-10-14T15:05:15.777Z" }, + { url = "https://files.pythonhosted.org/packages/15/49/08732f90ce0fbbc13913f9f215c689cfc9ced345fb1bcd8829a50007cc8d/watchfiles-1.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3ad9fe1dae4ab4212d8c91e80b832425e24f421703b5a42ef2e4a1e215aff051", size = 389964, upload-time = "2025-10-14T15:05:16.85Z" }, + { url = "https://files.pythonhosted.org/packages/27/0d/7c315d4bd5f2538910491a0393c56bf70d333d51bc5b34bee8e68e8cea19/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce70f96a46b894b36eba678f153f052967a0d06d5b5a19b336ab0dbbd029f73e", size = 448114, upload-time = "2025-10-14T15:05:17.876Z" }, + { url = "https://files.pythonhosted.org/packages/c3/24/9e096de47a4d11bc4df41e9d1e61776393eac4cb6eb11b3e23315b78b2cc/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cb467c999c2eff23a6417e58d75e5828716f42ed8289fe6b77a7e5a91036ca70", size = 460264, upload-time = "2025-10-14T15:05:18.962Z" }, + { url = "https://files.pythonhosted.org/packages/cc/0f/e8dea6375f1d3ba5fcb0b3583e2b493e77379834c74fd5a22d66d85d6540/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:836398932192dae4146c8f6f737d74baeac8b70ce14831a239bdb1ca882fc261", size = 487877, upload-time = "2025-10-14T15:05:20.094Z" }, + { url = "https://files.pythonhosted.org/packages/ac/5b/df24cfc6424a12deb41503b64d42fbea6b8cb357ec62ca84a5a3476f654a/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:743185e7372b7bc7c389e1badcc606931a827112fbbd37f14c537320fca08620", size = 595176, upload-time = "2025-10-14T15:05:21.134Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b5/853b6757f7347de4e9b37e8cc3289283fb983cba1ab4d2d7144694871d9c/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afaeff7696e0ad9f02cbb8f56365ff4686ab205fcf9c4c5b6fdfaaa16549dd04", size = 473577, upload-time = "2025-10-14T15:05:22.306Z" }, + { url = "https://files.pythonhosted.org/packages/e1/f7/0a4467be0a56e80447c8529c9fce5b38eab4f513cb3d9bf82e7392a5696b/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7eb7da0eb23aa2ba036d4f616d46906013a68caf61b7fdbe42fc8b25132e77", size = 455425, upload-time = "2025-10-14T15:05:23.348Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e0/82583485ea00137ddf69bc84a2db88bd92ab4a6e3c405e5fb878ead8d0e7/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:831a62658609f0e5c64178211c942ace999517f5770fe9436be4c2faeba0c0ef", size = 628826, upload-time = "2025-10-14T15:05:24.398Z" }, + { url = "https://files.pythonhosted.org/packages/28/9a/a785356fccf9fae84c0cc90570f11702ae9571036fb25932f1242c82191c/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f9a2ae5c91cecc9edd47e041a930490c31c3afb1f5e6d71de3dc671bfaca02bf", size = 622208, upload-time = "2025-10-14T15:05:25.45Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f4/0872229324ef69b2c3edec35e84bd57a1289e7d3fe74588048ed8947a323/watchfiles-1.1.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:d1715143123baeeaeadec0528bb7441103979a1d5f6fd0e1f915383fea7ea6d5", size = 404315, upload-time = "2025-10-14T15:05:26.501Z" }, + { url = "https://files.pythonhosted.org/packages/7b/22/16d5331eaed1cb107b873f6ae1b69e9ced582fcf0c59a50cd84f403b1c32/watchfiles-1.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:39574d6370c4579d7f5d0ad940ce5b20db0e4117444e39b6d8f99db5676c52fd", size = 390869, upload-time = "2025-10-14T15:05:27.649Z" }, + { url = "https://files.pythonhosted.org/packages/b2/7e/5643bfff5acb6539b18483128fdc0ef2cccc94a5b8fbda130c823e8ed636/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7365b92c2e69ee952902e8f70f3ba6360d0d596d9299d55d7d386df84b6941fb", size = 449919, upload-time = "2025-10-14T15:05:28.701Z" }, + { url = "https://files.pythonhosted.org/packages/51/2e/c410993ba5025a9f9357c376f48976ef0e1b1aefb73b97a5ae01a5972755/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bfff9740c69c0e4ed32416f013f3c45e2ae42ccedd1167ef2d805c000b6c71a5", size = 460845, upload-time = "2025-10-14T15:05:30.064Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a4/2df3b404469122e8680f0fcd06079317e48db58a2da2950fb45020947734/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b27cf2eb1dda37b2089e3907d8ea92922b673c0c427886d4edc6b94d8dfe5db3", size = 489027, upload-time = "2025-10-14T15:05:31.064Z" }, + { url = "https://files.pythonhosted.org/packages/ea/84/4587ba5b1f267167ee715b7f66e6382cca6938e0a4b870adad93e44747e6/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:526e86aced14a65a5b0ec50827c745597c782ff46b571dbfe46192ab9e0b3c33", size = 595615, upload-time = "2025-10-14T15:05:32.074Z" }, + { url = "https://files.pythonhosted.org/packages/6a/0f/c6988c91d06e93cd0bb3d4a808bcf32375ca1904609835c3031799e3ecae/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04e78dd0b6352db95507fd8cb46f39d185cf8c74e4cf1e4fbad1d3df96faf510", size = 474836, upload-time = "2025-10-14T15:05:33.209Z" }, + { url = "https://files.pythonhosted.org/packages/b4/36/ded8aebea91919485b7bbabbd14f5f359326cb5ec218cd67074d1e426d74/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c85794a4cfa094714fb9c08d4a218375b2b95b8ed1666e8677c349906246c05", size = 455099, upload-time = "2025-10-14T15:05:34.189Z" }, + { url = "https://files.pythonhosted.org/packages/98/e0/8c9bdba88af756a2fce230dd365fab2baf927ba42cd47521ee7498fd5211/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:74d5012b7630714b66be7b7b7a78855ef7ad58e8650c73afc4c076a1f480a8d6", size = 630626, upload-time = "2025-10-14T15:05:35.216Z" }, + { url = "https://files.pythonhosted.org/packages/2a/84/a95db05354bf2d19e438520d92a8ca475e578c647f78f53197f5a2f17aaf/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:8fbe85cb3201c7d380d3d0b90e63d520f15d6afe217165d7f98c9c649654db81", size = 622519, upload-time = "2025-10-14T15:05:36.259Z" }, + { url = "https://files.pythonhosted.org/packages/1d/ce/d8acdc8de545de995c339be67711e474c77d643555a9bb74a9334252bd55/watchfiles-1.1.1-cp314-cp314-win32.whl", hash = "sha256:3fa0b59c92278b5a7800d3ee7733da9d096d4aabcfabb9a928918bd276ef9b9b", size = 272078, upload-time = "2025-10-14T15:05:37.63Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c9/a74487f72d0451524be827e8edec251da0cc1fcf111646a511ae752e1a3d/watchfiles-1.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:c2047d0b6cea13b3316bdbafbfa0c4228ae593d995030fda39089d36e64fc03a", size = 287664, upload-time = "2025-10-14T15:05:38.95Z" }, + { url = "https://files.pythonhosted.org/packages/df/b8/8ac000702cdd496cdce998c6f4ee0ca1f15977bba51bdf07d872ebdfc34c/watchfiles-1.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:842178b126593addc05acf6fce960d28bc5fae7afbaa2c6c1b3a7b9460e5be02", size = 277154, upload-time = "2025-10-14T15:05:39.954Z" }, + { url = "https://files.pythonhosted.org/packages/47/a8/e3af2184707c29f0f14b1963c0aace6529f9d1b8582d5b99f31bbf42f59e/watchfiles-1.1.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:88863fbbc1a7312972f1c511f202eb30866370ebb8493aef2812b9ff28156a21", size = 403820, upload-time = "2025-10-14T15:05:40.932Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ec/e47e307c2f4bd75f9f9e8afbe3876679b18e1bcec449beca132a1c5ffb2d/watchfiles-1.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:55c7475190662e202c08c6c0f4d9e345a29367438cf8e8037f3155e10a88d5a5", size = 390510, upload-time = "2025-10-14T15:05:41.945Z" }, + { url = "https://files.pythonhosted.org/packages/d5/a0/ad235642118090f66e7b2f18fd5c42082418404a79205cdfca50b6309c13/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f53fa183d53a1d7a8852277c92b967ae99c2d4dcee2bfacff8868e6e30b15f7", size = 448408, upload-time = "2025-10-14T15:05:43.385Z" }, + { url = "https://files.pythonhosted.org/packages/df/85/97fa10fd5ff3332ae17e7e40e20784e419e28521549780869f1413742e9d/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6aae418a8b323732fa89721d86f39ec8f092fc2af67f4217a2b07fd3e93c6101", size = 458968, upload-time = "2025-10-14T15:05:44.404Z" }, + { url = "https://files.pythonhosted.org/packages/47/c2/9059c2e8966ea5ce678166617a7f75ecba6164375f3b288e50a40dc6d489/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f096076119da54a6080e8920cbdaac3dbee667eb91dcc5e5b78840b87415bd44", size = 488096, upload-time = "2025-10-14T15:05:45.398Z" }, + { url = "https://files.pythonhosted.org/packages/94/44/d90a9ec8ac309bc26db808a13e7bfc0e4e78b6fc051078a554e132e80160/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00485f441d183717038ed2e887a7c868154f216877653121068107b227a2f64c", size = 596040, upload-time = "2025-10-14T15:05:46.502Z" }, + { url = "https://files.pythonhosted.org/packages/95/68/4e3479b20ca305cfc561db3ed207a8a1c745ee32bf24f2026a129d0ddb6e/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a55f3e9e493158d7bfdb60a1165035f1cf7d320914e7b7ea83fe22c6023b58fc", size = 473847, upload-time = "2025-10-14T15:05:47.484Z" }, + { url = "https://files.pythonhosted.org/packages/4f/55/2af26693fd15165c4ff7857e38330e1b61ab8c37d15dc79118cdba115b7a/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c91ed27800188c2ae96d16e3149f199d62f86c7af5f5f4d2c61a3ed8cd3666c", size = 455072, upload-time = "2025-10-14T15:05:48.928Z" }, + { url = "https://files.pythonhosted.org/packages/66/1d/d0d200b10c9311ec25d2273f8aad8c3ef7cc7ea11808022501811208a750/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:311ff15a0bae3714ffb603e6ba6dbfba4065ab60865d15a6ec544133bdb21099", size = 629104, upload-time = "2025-10-14T15:05:49.908Z" }, + { url = "https://files.pythonhosted.org/packages/e3/bd/fa9bb053192491b3867ba07d2343d9f2252e00811567d30ae8d0f78136fe/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a916a2932da8f8ab582f242c065f5c81bed3462849ca79ee357dd9551b0e9b01", size = 622112, upload-time = "2025-10-14T15:05:50.941Z" }, + { url = "https://files.pythonhosted.org/packages/d3/8e/e500f8b0b77be4ff753ac94dc06b33d8f0d839377fee1b78e8c8d8f031bf/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:db476ab59b6765134de1d4fe96a1a9c96ddf091683599be0f26147ea1b2e4b88", size = 408250, upload-time = "2025-10-14T15:06:10.264Z" }, + { url = "https://files.pythonhosted.org/packages/bd/95/615e72cd27b85b61eec764a5ca51bd94d40b5adea5ff47567d9ebc4d275a/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89eef07eee5e9d1fda06e38822ad167a044153457e6fd997f8a858ab7564a336", size = 396117, upload-time = "2025-10-14T15:06:11.28Z" }, + { url = "https://files.pythonhosted.org/packages/c9/81/e7fe958ce8a7fb5c73cc9fb07f5aeaf755e6aa72498c57d760af760c91f8/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce19e06cbda693e9e7686358af9cd6f5d61312ab8b00488bc36f5aabbaf77e24", size = 450493, upload-time = "2025-10-14T15:06:12.321Z" }, + { url = "https://files.pythonhosted.org/packages/6e/d4/ed38dd3b1767193de971e694aa544356e63353c33a85d948166b5ff58b9e/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e6f39af2eab0118338902798b5aa6664f46ff66bc0280de76fca67a7f262a49", size = 457546, upload-time = "2025-10-14T15:06:13.372Z" }, +] + +[[package]] +name = "websockets" +version = "15.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/32/18fcd5919c293a398db67443acd33fde142f283853076049824fc58e6f75/websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", size = 175423, upload-time = "2025-03-05T20:01:56.276Z" }, + { url = "https://files.pythonhosted.org/packages/76/70/ba1ad96b07869275ef42e2ce21f07a5b0148936688c2baf7e4a1f60d5058/websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", size = 173082, upload-time = "2025-03-05T20:01:57.563Z" }, + { url = "https://files.pythonhosted.org/packages/86/f2/10b55821dd40eb696ce4704a87d57774696f9451108cff0d2824c97e0f97/websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", size = 173330, upload-time = "2025-03-05T20:01:59.063Z" }, + { url = "https://files.pythonhosted.org/packages/a5/90/1c37ae8b8a113d3daf1065222b6af61cc44102da95388ac0018fcb7d93d9/websockets-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562", size = 182878, upload-time = "2025-03-05T20:02:00.305Z" }, + { url = "https://files.pythonhosted.org/packages/8e/8d/96e8e288b2a41dffafb78e8904ea7367ee4f891dafc2ab8d87e2124cb3d3/websockets-15.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792", size = 181883, upload-time = "2025-03-05T20:02:03.148Z" }, + { url = "https://files.pythonhosted.org/packages/93/1f/5d6dbf551766308f6f50f8baf8e9860be6182911e8106da7a7f73785f4c4/websockets-15.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413", size = 182252, upload-time = "2025-03-05T20:02:05.29Z" }, + { url = "https://files.pythonhosted.org/packages/d4/78/2d4fed9123e6620cbf1706c0de8a1632e1a28e7774d94346d7de1bba2ca3/websockets-15.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8", size = 182521, upload-time = "2025-03-05T20:02:07.458Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3b/66d4c1b444dd1a9823c4a81f50231b921bab54eee2f69e70319b4e21f1ca/websockets-15.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3", size = 181958, upload-time = "2025-03-05T20:02:09.842Z" }, + { url = "https://files.pythonhosted.org/packages/08/ff/e9eed2ee5fed6f76fdd6032ca5cd38c57ca9661430bb3d5fb2872dc8703c/websockets-15.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf", size = 181918, upload-time = "2025-03-05T20:02:11.968Z" }, + { url = "https://files.pythonhosted.org/packages/d8/75/994634a49b7e12532be6a42103597b71098fd25900f7437d6055ed39930a/websockets-15.0.1-cp311-cp311-win32.whl", hash = "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85", size = 176388, upload-time = "2025-03-05T20:02:13.32Z" }, + { url = "https://files.pythonhosted.org/packages/98/93/e36c73f78400a65f5e236cd376713c34182e6663f6889cd45a4a04d8f203/websockets-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065", size = 176828, upload-time = "2025-03-05T20:02:14.585Z" }, + { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437, upload-time = "2025-03-05T20:02:16.706Z" }, + { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096, upload-time = "2025-03-05T20:02:18.832Z" }, + { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332, upload-time = "2025-03-05T20:02:20.187Z" }, + { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152, upload-time = "2025-03-05T20:02:22.286Z" }, + { url = "https://files.pythonhosted.org/packages/74/45/c205c8480eafd114b428284840da0b1be9ffd0e4f87338dc95dc6ff961a1/websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", size = 182096, upload-time = "2025-03-05T20:02:24.368Z" }, + { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523, upload-time = "2025-03-05T20:02:25.669Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790, upload-time = "2025-03-05T20:02:26.99Z" }, + { url = "https://files.pythonhosted.org/packages/02/05/c68c5adbf679cf610ae2f74a9b871ae84564462955d991178f95a1ddb7dd/websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", size = 182165, upload-time = "2025-03-05T20:02:30.291Z" }, + { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160, upload-time = "2025-03-05T20:02:31.634Z" }, + { url = "https://files.pythonhosted.org/packages/ff/83/de1f7709376dc3ca9b7eeb4b9a07b4526b14876b6d372a4dc62312bebee0/websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", size = 176395, upload-time = "2025-03-05T20:02:33.017Z" }, + { url = "https://files.pythonhosted.org/packages/7d/71/abf2ebc3bbfa40f391ce1428c7168fb20582d0ff57019b69ea20fa698043/websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7", size = 176841, upload-time = "2025-03-05T20:02:34.498Z" }, + { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload-time = "2025-03-05T20:02:36.695Z" }, + { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload-time = "2025-03-05T20:02:37.985Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload-time = "2025-03-05T20:02:39.298Z" }, + { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload-time = "2025-03-05T20:02:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload-time = "2025-03-05T20:02:41.926Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload-time = "2025-03-05T20:02:43.304Z" }, + { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload-time = "2025-03-05T20:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload-time = "2025-03-05T20:02:50.14Z" }, + { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload-time = "2025-03-05T20:02:51.561Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload-time = "2025-03-05T20:02:53.814Z" }, + { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload-time = "2025-03-05T20:02:55.237Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" }, +] diff --git a/skills/mino/lib/__pycache__/api.cpython-312.pyc b/skills/mino/lib/__pycache__/api.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57c1fe7334e7c323f67dc86b9859c78ade3f5948 GIT binary patch literal 9100 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 literal 0 HcmV?d00001 diff --git a/skills/thebuilders-v2/LESSONS.md b/skills/thebuilders-v2/LESSONS.md new file mode 100644 index 000000000..7f0d8f682 --- /dev/null +++ b/skills/thebuilders-v2/LESSONS.md @@ -0,0 +1,197 @@ +# Lessons Learned - The Builders v2 + +Post-mortem from the OpenAI episode generation session (Jan 6, 2026). + +## Issues & Fixes + +### 1. Wrong Model Used +**Issue:** Used GPT-4o instead of GPT-5.2 as requested +**Result:** 47 turns instead of 120+ +**Fix:** Always confirm model before running. Add `-m` flag to CLI. + +### 2. Script Too Short in Single Pass +**Issue:** Even GPT-5.2 only generated 90 turns when asked for 120+ +**Result:** Episode too shallow (7 min instead of 25 min) +**Fix:** **Section-by-section generation**. LLMs follow length instructions better on smaller chunks with explicit turn targets. + +### 3. TTS Chunked by Size, Not by Speaker +**Issue:** Audio chunks alternated voices randomly instead of per speaker +**Result:** Sounded like a confused monologue +**Fix:** Parse script by ``/`` tags, assign consistent voice per speaker. + +### 4. v3 Style Guide Not Integrated +**Issue:** The Acquired Bible existed but wasn't in the prompts +**Result:** Generic dialogue, not Acquired-style discovery +**Fix:** Include the Bible in EVERY section prompt. The patterns matter: +- Interruptions ("Wait—", "Hold on—") +- Discovery moments ("That's insane", "Wait, really?") +- Distinct perspectives (Maya=technical, James=strategy) + +### 5. No Intro/Greeting +**Issue:** Jumped straight into hook with no "Welcome to..." +**Result:** Felt robotic, not like real hosts +**Fix:** Add INTRO section (8 turns) with: +- Welcome +- Casual banter +- "Today we're covering X" +- Tease the story + +### 6. Voices Too Similar +**Issue:** Used nova/onyx which sound somewhat similar +**Result:** Hard to distinguish hosts +**Fix:** Use more distinct voices: **alloy** (female) + **echo** (male) + +## What Works + +### Section-by-Section +Each section has explicit turn targets: +``` +INTRO: 8 turns +HOOK: 12 turns +ORIGIN: 20 turns +INFLECTION1: 18 turns +INFLECTION2: 18 turns +MESSY_MIDDLE: 14 turns +NOW: 12 turns +TAKEAWAYS: 10 turns +───────────────────── +Total: 112 turns +``` + +### Speaker-Aware TTS +```javascript +// WRONG - chunks by size +for (chunk of script.split(3500)) { + voice = i % 2 === 0 ? 'nova' : 'onyx'; +} + +// RIGHT - parses by speaker +for (turn of script.matchAll(/<(Person[12])>(.+?)<\/Person[12]>/)) { + voice = turn[1] === 'Person1' ? 'alloy' : 'echo'; +} +``` + +### Bible in Every Prompt +The `acquired-bible.md` template contains: +- Host personalities +- Conversation patterns +- Language to use +- What NOT to do + +Including it in every section prompt ensures consistency. + +## Pipeline Summary + +``` +1. Gemini Deep Research (~5 min) +2. Hook Generation (~15s) +3. Section Generation (7 sections × ~20s = ~2.5 min) +4. Speaker-Aware TTS (~45s for 112 turns) +5. FFmpeg Merge (~2s) +──────────────────────────────────── +Total: ~8-10 min for 20-25 min episode +``` + +### 7. Facts Repeated Across Sections +**Issue:** Same facts (hot dog $1.50, renewal rate 93.3%, etc.) repeated 10-20 times +**Costco example:** Hot dog mentioned 19×, renewal rate 20×, chicken 15× +**Root cause:** Each section generated independently with same research context +**Fix:** **Deduplication system** +- Extract key facts after each section +- Pass "DO NOT REPEAT" list to subsequent sections +- Track up to 100 facts across sections + +### 8. Process Dies Mid-Generation +**Issue:** Long-running generation killed by OOM or gateway timeout +**Result:** Lost 30+ minutes of work, had to restart +**Fix:** **Checkpoint system** +- Save each section immediately after generation +- Save state (usedFacts, prevContext) to JSON +- On restart, detect checkpoint and resume from last section +- Location: `/checkpoints/` + +## What Works + +### Checkpoint System +``` +/checkpoints/ +├── section-0.txt # INTRO +├── section-1.txt # HOOK +├── ... +└── state.json # { completedSections: 5, usedFacts: [...] } +``` + +If process dies at section 7, re-run same command → resumes from section 7. + +### Deduplication +``` +Section 0: Extract 17 facts → pass to Section 1 as "DO NOT USE" +Section 1: Extract 16 facts → 33 total blocked +Section 2: Extract 14 facts → 47 total blocked +... +``` + +Result: 100 unique facts tracked, no repetition. + +### Section-by-Section +Each section has explicit turn targets: +``` +INTRO: 8 turns +HOOK: 12 turns +ORIGIN: 20 turns +INFLECTION1: 18 turns +INFLECTION2: 18 turns +MESSY_MIDDLE: 14 turns +NOW: 12 turns +TAKEAWAYS: 10 turns +───────────────────── +Total: 112 turns +``` + +### Speaker-Aware TTS +```javascript +// WRONG - chunks by size +for (chunk of script.split(3500)) { + voice = i % 2 === 0 ? 'nova' : 'onyx'; +} + +// RIGHT - parses by speaker +for (turn of script.matchAll(/<(Person[12])>(.+?)<\/Person[12]>/)) { + voice = turn[1] === 'Person1' ? 'alloy' : 'echo'; +} +``` + +### Bible in Every Prompt +The `acquired-bible.md` template contains: +- Host personalities +- Conversation patterns +- Language to use +- What NOT to do + +Including it in every section prompt ensures consistency. + +## Pipeline Summary + +``` +1. Gemini Deep Research (~5 min) +2. Hook Generation (~15s) +3. Section Generation (11 sections × ~25s = ~4.5 min) [with checkpoints] +4. Speaker-Aware TTS (~2 min for 250+ turns) +5. FFmpeg Merge (~2s) +──────────────────────────────────── +Total: ~12-15 min for 45-60 min deep dive + ~8-10 min for 20 min quick dive +``` + +## Checklist for Future Episodes + +- [ ] Confirm model (gpt-5.2 or better) +- [ ] Run deep research first +- [ ] Generate section-by-section +- [ ] Include Bible in all prompts +- [ ] Parse by speaker tags for TTS +- [ ] Use alloy + echo voices +- [ ] Verify intro section exists +- [ ] Listen to first 30s to check voice distinction +- [ ] Verify no repeated facts (deduplication working) +- [ ] If process dies, just re-run same command (checkpoint resume) diff --git a/skills/thebuilders-v2/SKILL.md b/skills/thebuilders-v2/SKILL.md new file mode 100644 index 000000000..fc8447fda --- /dev/null +++ b/skills/thebuilders-v2/SKILL.md @@ -0,0 +1,111 @@ +# The Builders Podcast Generator v2 + +Generate Acquired-style podcast episodes with two distinct hosts. + +## Two Modes + +| Mode | Flag | Duration | Research | Turns | Use Case | +|------|------|----------|----------|-------|----------| +| **Quick Dive** | `--quick` | 15-20 min | 1 pass Gemini | ~110 | Fast turnaround | +| **Deep Dive** | `--deep` | 45-60 min | 5-layer + o3 synthesis | ~250 | True Acquired-style | + +## Quick Start + +```bash +cd /home/elie/github/clawdis/skills/thebuilders-v2 + +# Quick dive (15-20 min) - default +node scripts/generate.mjs "Costco" -o /tmp/costco + +# Deep dive (45-60 min) +node scripts/generate.mjs "Costco" --deep -o /tmp/costco-deep + +# Skip research (use existing) +node scripts/generate.mjs "Costco" --deep -o /tmp/costco --skip-research +``` + +## Quick Dive Mode + +Single research pass, 8 sections: +- INTRO (8 turns) +- HOOK (12 turns) +- ORIGIN (20 turns) +- INFLECTION_1 (18 turns) +- INFLECTION_2 (18 turns) +- MESSY_MIDDLE (14 turns) +- NOW (12 turns) +- TAKEAWAYS (10 turns) + +**Total: ~112 turns / 15-20 min** + +## Deep Dive Mode + +5-layer research + 11 sections: + +### Research Layers +1. **Overview** - Gemini Deep Research +2. **Founders** - Interview quotes, early stories +3. **Decisions** - Contemporary WSJ/NYT coverage +4. **Financials** - Revenue, margins, metrics +5. **Contrarian** - Failures, criticism, struggles + +### Research Synthesis (o3) +Extracts: +- 50 most surprising facts +- 10 best quotes with attribution +- 5 "Wait, really?" moments +- Key timeline with dates +- Contrarian takes + +### Sections +- INTRO (10 turns) +- HOOK (15 turns) +- ORIGIN (35 turns) - deep founder story +- EARLY_PRODUCT (25 turns) - how it actually worked +- INFLECTION_1 (25 turns) - first major decision +- SCALE (25 turns) - operational details +- INFLECTION_2 (25 turns) - second crisis +- COMPETITION (20 turns) +- CULTURE (20 turns) +- NOW (20 turns) +- TAKEAWAYS (15 turns) + +**Total: ~235 turns / 45-60 min** + +## The Hosts + +| Host | Voice | Perspective | +|------|-------|-------------| +| **Maya Chen** (Person1) | alloy | Technical - "How does this actually work?" | +| **James Porter** (Person2) | echo | Strategic - "For context... The lesson here is..." | + +## Output Files + +``` +output/ +├── research.md # Quick mode research +├── research-combined.md # Deep mode combined research +├── research-synthesis.md # Deep mode o3 synthesis +├── hooks.md # Hook options +├── script.txt # Full dialogue +├── audio/ # Individual turns +└── episode.mp3 # Final episode +``` + +## Time Estimates + +| Mode | Research | Script | TTS | Total | +|------|----------|--------|-----|-------| +| Quick | 5 min | 3 min | 1 min | ~10 min | +| Deep | 15 min | 10 min | 3 min | ~30 min | + +## Key Differences + +| Aspect | Quick | Deep | +|--------|-------|------| +| Research passes | 1 | 5 | +| Research synthesis | None | o3 extracts key facts | +| Sections | 8 | 11 | +| ORIGIN depth | 20 turns | 35 turns | +| Quotes required | Encouraged | Mandatory | +| Context per section | 10KB | 25KB | diff --git a/skills/thebuilders-v2/config/presets.yaml b/skills/thebuilders-v2/config/presets.yaml new file mode 100644 index 000000000..bd7ebce57 --- /dev/null +++ b/skills/thebuilders-v2/config/presets.yaml @@ -0,0 +1,59 @@ +# Episode Presets + +company_deep_dive: + description: "Full company history deep dive" + target_length: 25 # minutes + sections: + - hook + - origin + - inflection_1 + - inflection_2 + - messy_middle + - now + - takeaways + hook_style: story + citation_density: medium + min_turns: 120 + +quick_explainer: + description: "Quick overview of a topic" + target_length: 10 + sections: + - hook + - what + - why + - how + - takeaway + hook_style: question + citation_density: low + min_turns: 50 + +founder_story: + description: "Focus on founder journey" + target_length: 20 + sections: + - hook + - before + - genesis + - struggle + - breakthrough + - now + - lessons + hook_style: story + citation_density: medium + min_turns: 100 + +product_breakdown: + description: "Technical product deep dive" + target_length: 20 + sections: + - hook + - problem + - solution + - architecture + - evolution + - impact + - future + hook_style: data + citation_density: high + min_turns: 100 diff --git a/skills/thebuilders-v2/config/voices.yaml b/skills/thebuilders-v2/config/voices.yaml new file mode 100644 index 000000000..0e0d16c01 --- /dev/null +++ b/skills/thebuilders-v2/config/voices.yaml @@ -0,0 +1,47 @@ +# Host Voice Configuration + +maya: + tag: Person1 + role: Technical Host + tts_voice: nova # OpenAI voice + + personality: + background: "Former software engineer, B2B SaaS founder" + lens: "Technical, mechanical, architectural" + style: "Direct, skeptical of hype, loves clever solutions" + + signature_phrases: + - "Wait, slow down." + - "Show me the numbers." + - "I had to read this three times." + - "That's actually clever because..." + - "How does that actually work?" + - "Let's look at the architecture." + + never_says: + - "From a strategic perspective" + - "The market opportunity" + - "In terms of positioning" + +james: + tag: Person2 + role: Strategy Host + tts_voice: onyx # OpenAI voice + + personality: + background: "Former VC, business history student" + lens: "Strategy, markets, competitive dynamics" + style: "Synthesizer, pattern matcher, historical parallels" + + signature_phrases: + - "For context..." + - "This is the classic [X] playbook." + - "The lesson here is..." + - "What a story." + - "And this is where things get messy." + - "The endgame here is..." + + never_says: + - "Let me explain the architecture" + - "The API design" + - "From a technical standpoint" diff --git a/skills/thebuilders-v2/scripts/generate-sections.mjs b/skills/thebuilders-v2/scripts/generate-sections.mjs new file mode 100755 index 000000000..c5fbe35c8 --- /dev/null +++ b/skills/thebuilders-v2/scripts/generate-sections.mjs @@ -0,0 +1,271 @@ +#!/usr/bin/env node +/** + * Section-by-section podcast script generator + * Generates each section separately to ensure proper length + */ + +import { readFileSync, writeFileSync, mkdirSync } from 'fs'; +import { join, dirname } from 'path'; +import { fileURLToPath } from 'url'; +import { execSync } from 'child_process'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const OPENAI_API_KEY = process.env.OPENAI_API_KEY; + +// Section definitions with turn targets +const SECTIONS = [ + { id: 1, name: 'HOOK', turns: 15, minutes: '3-4', description: 'Opening hook, establish central question, create curiosity' }, + { id: 2, name: 'ORIGIN', turns: 25, minutes: '6-7', description: 'Founders, genesis, early bet, market context, human element' }, + { id: 3, name: 'INFLECTION_1', turns: 20, minutes: '5-6', description: 'First major decision point, alternatives, stakes, outcome' }, + { id: 4, name: 'INFLECTION_2', turns: 20, minutes: '5-6', description: 'Second pivot, new challenge, adaptation, insight' }, + { id: 5, name: 'MESSY_MIDDLE', turns: 15, minutes: '3-4', description: 'Near-death moments, internal conflicts, survival' }, + { id: 6, name: 'NOW', turns: 15, minutes: '3-4', description: 'Current position, competition, open questions' }, + { id: 7, name: 'TAKEAWAYS', turns: 12, minutes: '2-3', description: 'Key lessons, frameworks, final thought' }, +]; + +const TOTAL_TURNS = SECTIONS.reduce((sum, s) => sum + s.turns, 0); + +const log = (msg) => console.log(`[${new Date().toISOString().slice(11,19)}] ${msg}`); + +async function llm(prompt, model = 'gpt-5.2') { + const response = await fetch('https://api.openai.com/v1/chat/completions', { + method: 'POST', + headers: { + 'Authorization': `Bearer ${OPENAI_API_KEY}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + model, + messages: [{ role: 'user', content: prompt }], + max_completion_tokens: 8000, + temperature: 0.7, + }), + }); + + if (!response.ok) { + const error = await response.text(); + throw new Error(`API error: ${response.status} - ${error}`); + } + + const data = await response.json(); + return data.choices[0].message.content; +} + +function buildSectionPrompt(section, research, hook, previousSections) { + const hostsInfo = ` +## The Hosts + +**Maya Chen (Person1):** +- Former software engineer, B2B SaaS founder +- Lens: "How does this actually work?" - technical, mechanical +- Skeptical of hype, wants specifics and numbers +- Phrases: "Wait, slow down.", "Show me the numbers.", "That's actually clever because..." + +**James Porter (Person2):** +- Former VC, business history student +- Lens: "What's the business model?" - strategy, markets, competitive dynamics +- Synthesizer, pattern matcher, historical parallels +- Phrases: "For context...", "This is the classic [X] playbook.", "The lesson here is..." +`; + + const formatRules = ` +## Format Rules +- Use and XML tags for each speaker +- Each turn: 2-5 sentences (natural conversation, not monologues) +- Include discovery moments: "Wait, really?", "I had no idea!" +- Use SPECIFIC numbers, dates, dollar amounts from research +- Both hosts should react naturally and build on each other +`; + + const previousContext = previousSections.length > 0 + ? `\n## Previous Sections (for context, don't repeat):\n${previousSections.join('\n\n')}\n` + : ''; + + const sectionSpecific = { + HOOK: `Open with this hook and build on it:\n"${hook}"\n\nEstablish why this story matters. Create curiosity about what's coming.`, + ORIGIN: `Cover the founding story. Who are the founders? What sparked this? What was their early bet? Make them human and relatable.`, + INFLECTION_1: `Cover the FIRST major decision/pivot point. What choice did they face? What alternatives existed? What did they risk? How did it play out?`, + INFLECTION_2: `Cover the SECOND major inflection point. What new challenge emerged? How did they adapt? What insight did they gain?`, + MESSY_MIDDLE: `Cover the struggles. What almost killed them? What internal conflicts existed? Don't glorify - show real struggle.`, + NOW: `Cover current state. Where are they now? Key metrics? Competitive position? What questions remain open?`, + TAKEAWAYS: `Wrap up with lessons learned. What's the key framework? What would you do differently? End with a memorable final thought that ties back to the hook.`, + }; + + return `# Generate Section ${section.id}: ${section.name} + +${hostsInfo} + +## Your Task +Generate EXACTLY ${section.turns} dialogue turns for the ${section.name} section. +Target duration: ${section.minutes} minutes when read aloud. + +## Section Goal +${section.description} + +## Specific Instructions +${sectionSpecific[section.name]} + +${formatRules} + +${previousContext} + +## Research Material +${research} + +--- + +Generate EXACTLY ${section.turns} dialogue turns. Start with then or . +Count your turns carefully - you MUST hit ${section.turns} turns.`; +} + +async function generateSection(section, research, hook, previousSections) { + log(`Generating Section ${section.id}: ${section.name} (target: ${section.turns} turns)...`); + + const prompt = buildSectionPrompt(section, research, hook, previousSections); + const startTime = Date.now(); + + const result = await llm(prompt); + + const elapsed = ((Date.now() - startTime) / 1000).toFixed(1); + const turns = (result.match(//g) || []).length; + + log(`Section ${section.id} complete: ${turns} turns in ${elapsed}s`); + + return { section, result, turns }; +} + +async function main() { + const args = process.argv.slice(2); + const outputDir = args.includes('-o') ? args[args.indexOf('-o') + 1] : './output'; + + console.log(` +╔════════════════════════════════════════════════════════════╗ +║ Section-by-Section Podcast Generator ║ +║ Target: ${TOTAL_TURNS} dialogue turns ║ +╚════════════════════════════════════════════════════════════╝ +`); + + // Load research and hook + const research = readFileSync(join(outputDir, '02-research.md'), 'utf-8'); + const hooksFile = readFileSync(join(outputDir, '03-hooks.md'), 'utf-8'); + const hookMatch = hooksFile.match(/## Story Hook\n\n> "([^"]+)"/); + const hook = hookMatch ? hookMatch[1] : ''; + + log(`Loaded research (${(research.length/1024).toFixed(1)}KB) and hook`); + log(`Hook: "${hook.slice(0, 60)}..."`); + + // Generate sections sequentially + const sections = []; + const previousSections = []; + let totalTurns = 0; + + for (const section of SECTIONS) { + const { result, turns } = await generateSection(section, research, hook, previousSections); + sections.push(result); + previousSections.push(result.slice(0, 500) + '...'); // Keep context manageable + totalTurns += turns; + } + + // Combine all sections + const fullScript = sections.join('\n\n'); + writeFileSync(join(outputDir, '06-script-final.txt'), fullScript); + + log(`\n✅ Script complete: ${totalTurns} total turns`); + log(`Saved to ${join(outputDir, '06-script-final.txt')}`); + + // Generate audio + log('\nGenerating audio...'); + + // Chunk the script + const chunksDir = join(outputDir, 'chunks'); + mkdirSync(chunksDir, { recursive: true }); + + const chunks = []; + let currentChunk = ''; + for (const line of fullScript.split('\n')) { + if (currentChunk.length + line.length > 3500 && currentChunk.length > 1000) { + if (line.startsWith(' { + const num = String(i + 1).padStart(3, '0'); + writeFileSync(join(chunksDir, `chunk-${num}.txt`), chunk); + }); + + // Generate TTS in parallel + const ttsStart = Date.now(); + const audioPromises = chunks.map(async (chunk, i) => { + const num = String(i + 1).padStart(3, '0'); + const text = chunk + .replace(//g, '') + .replace(//g, '') + .replace(//g, '') + .trim() + .slice(0, 4096); + + const outPath = join(chunksDir, `chunk-${num}.mp3`); + + const res = await fetch('https://api.openai.com/v1/audio/speech', { + method: 'POST', + headers: { + 'Authorization': `Bearer ${OPENAI_API_KEY}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + model: 'tts-1', + input: text, + voice: i % 2 === 0 ? 'nova' : 'onyx', + }), + }); + + if (!res.ok) throw new Error(`TTS failed for chunk ${num}`); + + const buffer = await res.arrayBuffer(); + writeFileSync(outPath, Buffer.from(buffer)); + log(`Chunk ${num} audio done`); + return outPath; + }); + + const audioPaths = await Promise.all(audioPromises); + log(`TTS complete in ${((Date.now() - ttsStart) / 1000).toFixed(1)}s`); + + // Merge with ffmpeg + const listFile = join(chunksDir, 'files.txt'); + writeFileSync(listFile, audioPaths.map(p => `file '${p}'`).join('\n')); + + const episodePath = join(outputDir, 'episode.mp3'); + execSync(`ffmpeg -y -f concat -safe 0 -i "${listFile}" -c copy "${episodePath}" 2>/dev/null`); + + // Get duration + const duration = execSync(`ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "${episodePath}"`, { encoding: 'utf-8' }).trim(); + const minutes = (parseFloat(duration) / 60).toFixed(1); + + console.log(` +╔════════════════════════════════════════════════════════════╗ +║ Generation Complete ║ +╠════════════════════════════════════════════════════════════╣ +║ Total turns: ${String(totalTurns).padEnd(44)}║ +║ Duration: ${String(minutes + ' minutes').padEnd(47)}║ +║ Chunks: ${String(chunks.length).padEnd(49)}║ +╚════════════════════════════════════════════════════════════╝ + +Output: ${episodePath} +`); +} + +main().catch(err => { + console.error('Error:', err.message); + process.exit(1); +}); diff --git a/skills/thebuilders-v2/scripts/generate.mjs b/skills/thebuilders-v2/scripts/generate.mjs new file mode 100755 index 000000000..2f93e1c41 --- /dev/null +++ b/skills/thebuilders-v2/scripts/generate.mjs @@ -0,0 +1,639 @@ +#!/usr/bin/env node +/** + * The Builders Podcast Generator v2 + * + * Two modes: + * --quick : 15-20 min episode, single research pass + * --deep : 45-60 min episode, multi-layer research + enhancement + */ + +import { readFileSync, writeFileSync, mkdirSync, readdirSync, existsSync, rmSync } from 'fs'; +import { join, dirname } from 'path'; +import { fileURLToPath } from 'url'; +import { execSync } from 'child_process'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const SKILL_DIR = join(__dirname, '..'); +const OPENAI_API_KEY = process.env.OPENAI_API_KEY; + +// Load the Acquired Bible +const BIBLE = readFileSync(join(SKILL_DIR, 'templates/acquired-bible.md'), 'utf-8'); + +// Section definitions - QUICK mode +const SECTIONS_QUICK = [ + { id: 0, name: 'INTRO', turns: 8, description: 'Welcome, casual banter, introduce the company, tease why this story is fascinating' }, + { id: 1, name: 'HOOK', turns: 12, description: 'Open with surprising fact or tension. Central question. Stakes.' }, + { id: 2, name: 'ORIGIN', turns: 20, description: 'Founders as humans. Genesis moment. Early bet. Market context.' }, + { id: 3, name: 'INFLECTION_1', turns: 18, description: 'First major decision. Alternatives. Stakes. What they risked.' }, + { id: 4, name: 'INFLECTION_2', turns: 18, description: 'Second pivot. New challenge. How they adapted.' }, + { id: 5, name: 'MESSY_MIDDLE', turns: 14, description: 'Near-death. Internal conflicts. Real struggle, not glorified.' }, + { id: 6, name: 'NOW', turns: 12, description: 'Current state. Metrics. Competition. Open questions.' }, + { id: 7, name: 'TAKEAWAYS', turns: 10, description: 'Key lessons. Frameworks. Final thought tying back to hook.' }, +]; + +// Section definitions - DEEP mode (more turns, more sections) +const SECTIONS_DEEP = [ + { id: 0, name: 'INTRO', turns: 10, description: 'Welcome, what excited them about this research, why this company matters now' }, + { id: 1, name: 'HOOK', turns: 15, description: 'Vivid opening scene. The moment that defines the company. Stakes made visceral.' }, + { id: 2, name: 'ORIGIN', turns: 35, description: 'Deep founder story - actual quotes, specific moments, human struggles. Market context of the era. What the world looked like.' }, + { id: 3, name: 'EARLY_PRODUCT', turns: 25, description: 'First product/service. How it actually worked mechanically. Early customers. The insight that made it work.' }, + { id: 4, name: 'INFLECTION_1', turns: 25, description: 'First major decision. Board meeting details. What alternatives existed. Quotes from people who were there.' }, + { id: 5, name: 'SCALE', turns: 25, description: 'How they scaled. Operational details. What broke. How they fixed it. Specific numbers.' }, + { id: 6, name: 'INFLECTION_2', turns: 25, description: 'Second pivot or crisis. The moment it almost fell apart. How they survived.' }, + { id: 7, name: 'COMPETITION', turns: 20, description: 'Competitive landscape. Who they beat and how. Who almost beat them.' }, + { id: 8, name: 'CULTURE', turns: 20, description: 'Internal culture. Leadership philosophy. Quotes from employees. What makes them different.' }, + { id: 9, name: 'NOW', turns: 20, description: 'Current state with specific metrics. Recent moves. Open questions. What could go wrong.' }, + { id: 10, name: 'TAKEAWAYS', turns: 15, description: 'Key frameworks. What other companies can learn. Final thought tying back to hook.' }, +]; + +const VOICES = { + Person1: 'alloy', // Maya + Person2: 'echo', // James +}; + +const log = (msg) => console.log(`[${new Date().toISOString().slice(11,19)}] ${msg}`); + +// ============ LLM CALLS ============ + +async function llm(prompt, model = 'gpt-5.2', maxTokens = 8000) { + const response = await fetch('https://api.openai.com/v1/chat/completions', { + method: 'POST', + headers: { + 'Authorization': `Bearer ${OPENAI_API_KEY}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + model, + messages: [{ role: 'user', content: prompt }], + max_completion_tokens: maxTokens, + temperature: 0.8, + }), + }); + + if (!response.ok) { + const error = await response.text(); + throw new Error(`API error: ${response.status} - ${error}`); + } + + const data = await response.json(); + return data.choices[0].message.content; +} + +async function llmO3(prompt) { + // Use o3 for reasoning-heavy tasks + const response = await fetch('https://api.openai.com/v1/chat/completions', { + method: 'POST', + headers: { + 'Authorization': `Bearer ${OPENAI_API_KEY}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + model: 'o3', + messages: [{ role: 'user', content: prompt }], + max_completion_tokens: 16000, + }), + }); + + if (!response.ok) { + const error = await response.text(); + throw new Error(`o3 API error: ${response.status} - ${error}`); + } + + const data = await response.json(); + return data.choices[0].message.content; +} + +// ============ RESEARCH ============ + +async function runGeminiResearch(topic) { + log('Running Gemini Deep Research...'); + const start = Date.now(); + + const result = execSync( + `cd /home/elie/github/clawdis/skills/deepresearch && ./scripts/deepresearch.sh "${topic}"`, + { encoding: 'utf-8', maxBuffer: 50 * 1024 * 1024, timeout: 600000 } + ); + + const elapsed = ((Date.now() - start) / 1000).toFixed(1); + log(`Gemini research complete in ${elapsed}s`); + + return result; +} + +async function runBraveSearch(query, count = 5) { + try { + const result = execSync( + `node /home/elie/github/clawdis/skills/brave-search/scripts/search.mjs "${query}" -n ${count} --content 2>/dev/null`, + { encoding: 'utf-8', maxBuffer: 10 * 1024 * 1024, timeout: 60000 } + ); + return result; + } catch (e) { + return ''; + } +} + +async function runExaSearch(query) { + try { + const result = execSync( + `node /home/elie/github/clawdis/skills/researcher/scripts/research.mjs "${query}" 2>/dev/null`, + { encoding: 'utf-8', maxBuffer: 10 * 1024 * 1024, timeout: 120000 } + ); + return result; + } catch (e) { + return ''; + } +} + +async function multiLayerResearch(topic, company, outputDir) { + log('Starting 5-layer deep research...'); + const research = {}; + + // Layer 1: Overview (Gemini) + log(' Layer 1/5: Overview (Gemini)...'); + research.overview = await runGeminiResearch(topic); + writeFileSync(join(outputDir, 'research-1-overview.md'), research.overview); + + // Layer 2: Founder stories + log(' Layer 2/5: Founder interviews...'); + research.founders = await runBraveSearch(`"${company}" founder interview quotes early days story`, 8); + writeFileSync(join(outputDir, 'research-2-founders.md'), research.founders); + + // Layer 3: Key decisions (contemporary coverage) + log(' Layer 3/5: Contemporary coverage...'); + research.decisions = await runBraveSearch(`"${company}" site:wsj.com OR site:nytimes.com OR site:forbes.com history`, 8); + writeFileSync(join(outputDir, 'research-3-decisions.md'), research.decisions); + + // Layer 4: Financial/operational details + log(' Layer 4/5: Financial details...'); + research.financials = await runBraveSearch(`"${company}" revenue profit margin business model analysis`, 5); + writeFileSync(join(outputDir, 'research-4-financials.md'), research.financials); + + // Layer 5: Contrarian/struggles + log(' Layer 5/5: Struggles and criticism...'); + research.contrarian = await runBraveSearch(`"${company}" almost failed crisis problems criticism`, 5); + writeFileSync(join(outputDir, 'research-5-contrarian.md'), research.contrarian); + + // Combine all research + const combined = `# RESEARCH COMPILATION: ${company} + +## PART 1: OVERVIEW +${research.overview} + +## PART 2: FOUNDER STORIES & INTERVIEWS +${research.founders} + +## PART 3: CONTEMPORARY COVERAGE & KEY DECISIONS +${research.decisions} + +## PART 4: FINANCIAL & OPERATIONAL DETAILS +${research.financials} + +## PART 5: STRUGGLES, CRISES & CRITICISM +${research.contrarian} +`; + + writeFileSync(join(outputDir, 'research-combined.md'), combined); + log('All research layers complete'); + + return combined; +} + +async function synthesizeResearch(research, company, outputDir) { + log('Synthesizing research with o3...'); + + const prompt = `You are a research analyst preparing materials for a deep-dive podcast about ${company}. + +From this research, extract: + +1. **50 MOST SURPRISING FACTS** - specific numbers, dates, details that would make someone say "Wait, really?" + +2. **10 BEST QUOTES** - actual quotes from founders, employees, or articles WITH attribution + Format: "Quote here" — Person Name, Source, Year + +3. **5 "WAIT REALLY?" MOMENTS** - the most counterintuitive or shocking facts + +4. **KEY TIMELINE** - 15-20 most important dates with specific events + +5. **NARRATIVE THREADS** - the 3-4 main story arcs that make this company interesting + +6. **CONTRARIAN TAKES** - what critics say, what almost went wrong, the messy parts + +7. **NUMBERS THAT MATTER** - specific metrics that tell the story (revenue, margins, users, etc.) + +Be SPECIFIC. Include actual numbers, names, dates. No generic statements. + +RESEARCH: +${research.slice(0, 100000)}`; + + const synthesis = await llmO3(prompt); + writeFileSync(join(outputDir, 'research-synthesis.md'), synthesis); + + log('Research synthesis complete'); + return synthesis; +} + +// ============ SCRIPT GENERATION ============ + +function buildSectionPrompt(section, research, synthesis, topic, hook, prevContext, isDeep, usedFacts = []) { + const contextSize = isDeep ? 25000 : 10000; + + const introPrompt = section.name === 'INTRO' ? ` +## INTRO REQUIREMENTS +- Start with "Welcome back to The Builders..." +- Maya introduces herself, then James +- Brief friendly banter about what excited them in the research +- Name the company: "Today we're diving into ${topic}" +- Tease 2-3 surprising things they'll cover +- End with natural transition to the hook +` : ''; + + const hookLine = section.name === 'HOOK' ? ` +## OPENING HOOK TO BUILD ON +"${hook}" +` : ''; + + const synthesisSection = synthesis ? ` +## KEY FACTS & QUOTES TO USE +${synthesis.slice(0, 15000)} +` : ''; + + // DEDUPLICATION: List facts already used in previous sections + const usedFactsSection = usedFacts.length > 0 ? ` +## ⛔ FACTS ALREADY USED - DO NOT REPEAT THESE +The following facts, quotes, and statistics have already been mentioned in earlier sections. +DO NOT use them again. Find NEW facts from the research. + +${usedFacts.map((f, i) => `${i+1}. ${f}`).join('\n')} + +** IMPORTANT: Using any fact from the above list is a critical error. Use DIFFERENT facts.** +` : ''; + + return `# Generate Section ${section.id}: ${section.name} + +${BIBLE} + +## YOUR TASK +Write EXACTLY ${section.turns} dialogue turns for the ${section.name} section. +This should feel like two friends discovering a story together, NOT a lecture. + +## SECTION GOAL +${section.description} + +${introPrompt} +${hookLine} + +${usedFactsSection} + +## FORMAT RULES +- Use (Maya) and (James) XML tags +- Each turn: 2-5 sentences - real conversation, not speeches +- Include AT LEAST 3 interruptions ("Wait—", "Hold on—", "Back up—") +- Include AT LEAST 3 genuine reactions ("That's insane", "Wait, really?", "I had no idea") +- USE SPECIFIC QUOTES from the research with attribution +- USE SPECIFIC NUMBERS and dates +- Maya asks technical "how does this work" questions +- James provides strategic context and patterns +- They BUILD on each other, not just take turns +- **DO NOT REPEAT** any facts from earlier sections + +${synthesisSection} + +## RESEARCH +${research.slice(0, contextSize)} + +${prevContext ? `## PREVIOUS CONTEXT\n${prevContext}\n` : ''} + +--- +Generate EXACTLY ${section.turns} turns. Start with +Include at least 3 NEW specific facts/quotes from the research (not used before). Make it feel like genuine discovery.`; +} + +// Extract key facts from a section for deduplication +async function extractFactsFromSection(sectionText) { + const prompt = `Extract the KEY FACTS mentioned in this podcast section. List each unique fact as a short phrase. + +Focus on: +- Specific numbers (dollars, percentages, counts) +- Specific dates and years +- Direct quotes with attribution +- Named events or milestones +- Specific products, prices, or metrics + +Return ONLY a JSON array of strings, each being a short fact (10-20 words max). +Example: ["$1.50 hot dog price unchanged since 1985", "93.3% renewal rate in US/Canada"] + +Section: +${sectionText}`; + + try { + const result = await llm(prompt, 'gpt-4o-mini', 2000); + const match = result.match(/\[[\s\S]*\]/); + if (match) { + return JSON.parse(match[0]); + } + } catch (e) { + // Fallback: extract numbers and quotes manually + } + + // Fallback extraction + const facts = []; + // Extract quotes + const quotes = sectionText.match(/"[^"]+"\s*—[^<]+/g) || []; + facts.push(...quotes.slice(0, 5).map(q => q.slice(0, 100))); + + // Extract numbers with context + const numbers = sectionText.match(/\$[\d,.]+ (?:million|billion|percent|%)|[\d,]+% |[\d,]+ (?:SKU|warehouse|employee|member|year)/gi) || []; + facts.push(...[...new Set(numbers)].slice(0, 10)); + + return facts; +} + +// ============ TTS ============ + +async function generateTTS(turns, outputDir) { + const audioDir = join(outputDir, 'audio'); + if (existsSync(audioDir)) rmSync(audioDir, { recursive: true }); + mkdirSync(audioDir, { recursive: true }); + + log(`Generating TTS for ${turns.length} turns...`); + const start = Date.now(); + + // Process in batches of 15 + for (let i = 0; i < turns.length; i += 15) { + const batch = turns.slice(i, i + 15); + const promises = batch.map(async (turn, j) => { + const idx = i + j; + const num = String(idx + 1).padStart(4, '0'); + const voice = VOICES[turn.speaker]; + const outPath = join(audioDir, `turn-${num}.mp3`); + + const res = await fetch('https://api.openai.com/v1/audio/speech', { + method: 'POST', + headers: { + 'Authorization': `Bearer ${OPENAI_API_KEY}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + model: 'tts-1-hd', + input: turn.text.slice(0, 4096), + voice: voice, + }), + }); + + if (!res.ok) return null; + const buffer = await res.arrayBuffer(); + writeFileSync(outPath, Buffer.from(buffer)); + return outPath; + }); + + await Promise.all(promises); + log(` ${Math.min(i + 15, turns.length)}/${turns.length} turns`); + } + + const elapsed = ((Date.now() - start) / 1000).toFixed(1); + log(`TTS complete in ${elapsed}s`); + + // Merge with ffmpeg + const files = readdirSync(audioDir).filter(f => f.endsWith('.mp3')).sort(); + const listPath = join(audioDir, 'files.txt'); + writeFileSync(listPath, files.map(f => `file '${join(audioDir, f)}'`).join('\n')); + + const episodePath = join(outputDir, 'episode.mp3'); + execSync(`ffmpeg -y -f concat -safe 0 -i "${listPath}" -c copy "${episodePath}" 2>/dev/null`); + + const duration = execSync( + `ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "${episodePath}"`, + { encoding: 'utf-8' } + ).trim(); + + return { path: episodePath, duration: parseFloat(duration) }; +} + +// ============ MAIN ============ + +async function main() { + const args = process.argv.slice(2); + + if (args.length === 0 || args.includes('--help')) { + console.log(` +Usage: node generate.mjs "" [options] + +Modes: + --quick 15-20 min episode, single research pass (default) + --deep 45-60 min episode, multi-layer research + synthesis + +Options: + -o, --output Output directory (default: ./output) + -m, --model LLM model (default: gpt-5.2) + --skip-research Skip research phase (use existing) + --skip-tts Skip TTS generation + --help Show this help + +Features: + - Auto-resume: If process dies, re-run same command to resume from checkpoint + - Deduplication: Tracks facts across sections to prevent repetition + - Checkpoints saved to: /checkpoints/ + +Examples: + node generate.mjs "Costco" --quick -o /tmp/costco + node generate.mjs "OpenAI" --deep -o /tmp/openai + + # Resume interrupted generation (just re-run same command): + node generate.mjs "OpenAI" --deep -o /tmp/openai +`); + process.exit(0); + } + + const topic = args[0]; + const outputDir = args.includes('-o') ? args[args.indexOf('-o') + 1] : './output'; + const model = args.includes('-m') ? args[args.indexOf('-m') + 1] : 'gpt-5.2'; + const isDeep = args.includes('--deep'); + const skipResearch = args.includes('--skip-research'); + const skipTTS = args.includes('--skip-tts'); + + // Extract company name from topic + const company = topic.split(':')[0].split(' ')[0]; + + const SECTIONS = isDeep ? SECTIONS_DEEP : SECTIONS_QUICK; + const targetTurns = SECTIONS.reduce((sum, s) => sum + s.turns, 0); + const targetDuration = isDeep ? '45-60' : '15-20'; + + mkdirSync(outputDir, { recursive: true }); + + console.log(` +╔════════════════════════════════════════════════════════════╗ +║ The Builders Podcast Generator ║ +║ Mode: ${isDeep ? 'DEEP DIVE (45-60 min)' : 'QUICK DIVE (15-20 min)'} ║ +║ Target: ${targetTurns} turns ║ +╚════════════════════════════════════════════════════════════╝ +`); + + log(`Topic: ${topic}`); + log(`Output: ${outputDir}`); + log(`Model: ${model}`); + + // ---- RESEARCH ---- + let research, synthesis = ''; + const researchPath = join(outputDir, isDeep ? 'research-combined.md' : 'research.md'); + const synthesisPath = join(outputDir, 'research-synthesis.md'); + + if (skipResearch && existsSync(researchPath)) { + log('Using existing research...'); + research = readFileSync(researchPath, 'utf-8'); + if (isDeep && existsSync(synthesisPath)) { + synthesis = readFileSync(synthesisPath, 'utf-8'); + } + } else if (isDeep) { + // Multi-layer research for deep dive + research = await multiLayerResearch(topic, company, outputDir); + synthesis = await synthesizeResearch(research, company, outputDir); + } else { + // Single pass for quick dive + research = await runGeminiResearch(topic); + writeFileSync(researchPath, research); + } + + // ---- GENERATE HOOK ---- + log('Generating hook...'); + const hookPrompt = `Based on this research about ${topic}, generate 3 compelling opening hooks: + +1. A SCENE hook - put us in a specific moment (boardroom, product launch, near-bankruptcy) +2. A DATA hook - a surprising statistic that reframes everything +3. A QUESTION hook - a provocative central question + +Each should be 2-3 sentences, vivid, specific. Mark the best one with [SELECTED]. + +${isDeep ? 'Use specific details from the research - names, dates, numbers.' : ''} + +Research: +${research.slice(0, 15000)}`; + + const hookResponse = await llm(hookPrompt, model); + writeFileSync(join(outputDir, 'hooks.md'), hookResponse); + + // Extract selected hook + const hookMatch = hookResponse.match(/\[SELECTED\][\s\S]*?[""]([^""]+)[""]/); + const hook = hookMatch ? hookMatch[1] : "This is a story that will change how you think about business."; + log(`Hook: "${hook.slice(0, 80)}..."`); + + // ---- GENERATE SECTIONS (with checkpointing) ---- + log(`Generating ${SECTIONS.length} script sections...`); + const allSections = []; + let prevContext = ''; + let totalTurns = 0; + let usedFacts = []; // Track facts across sections for deduplication + + // Checkpoint paths + const checkpointDir = join(outputDir, 'checkpoints'); + const checkpointState = join(checkpointDir, 'state.json'); + mkdirSync(checkpointDir, { recursive: true }); + + // Load existing checkpoint if resuming + let startSection = 0; + if (existsSync(checkpointState)) { + try { + const state = JSON.parse(readFileSync(checkpointState, 'utf-8')); + startSection = state.completedSections || 0; + usedFacts = state.usedFacts || []; + prevContext = state.prevContext || ''; + log(`📂 Resuming from checkpoint: section ${startSection}/${SECTIONS.length}`); + + // Load existing sections + for (let i = 0; i < startSection; i++) { + const sectionPath = join(checkpointDir, `section-${i}.txt`); + if (existsSync(sectionPath)) { + const content = readFileSync(sectionPath, 'utf-8'); + allSections.push(content); + totalTurns += (content.match(//g) || []).length; + } + } + log(` Loaded ${allSections.length} existing sections (${totalTurns} turns)`); + } catch (e) { + log('⚠️ Checkpoint corrupted, starting fresh'); + startSection = 0; + } + } + + for (const section of SECTIONS) { + // Skip already completed sections + if (section.id < startSection) { + continue; + } + + const start = Date.now(); + log(` Section ${section.id}: ${section.name} (target: ${section.turns})...`); + + const prompt = buildSectionPrompt( + section, research, synthesis, topic, hook, prevContext, isDeep, usedFacts + ); + const result = await llm(prompt, model, isDeep ? 12000 : 8000); + + const turns = (result.match(//g) || []).length; + const elapsed = ((Date.now() - start) / 1000).toFixed(1); + log(` → ${turns} turns in ${elapsed}s`); + + allSections.push(result); + prevContext = result.slice(0, isDeep ? 1500 : 800); + totalTurns += turns; + + // Save section checkpoint immediately + writeFileSync(join(checkpointDir, `section-${section.id}.txt`), result); + + // Extract facts from this section to prevent repetition in future sections + if (isDeep && section.id < SECTIONS.length - 1) { + log(` Extracting facts for deduplication...`); + const newFacts = await extractFactsFromSection(result); + usedFacts = [...usedFacts, ...newFacts].slice(-100); // Keep last 100 facts + log(` ${newFacts.length} facts tracked (${usedFacts.length} total)`); + } + + // Save checkpoint state after each section + writeFileSync(checkpointState, JSON.stringify({ + completedSections: section.id + 1, + usedFacts, + prevContext, + timestamp: new Date().toISOString() + }, null, 2)); + log(` 💾 Checkpoint saved`); + } + + // Combine script + const fullScript = allSections.join('\n\n'); + writeFileSync(join(outputDir, 'script.txt'), fullScript); + log(`Script complete: ${totalTurns} total turns`); + + // ---- TTS ---- + if (!skipTTS) { + // Parse turns + const turns = []; + const regex = /<(Person[12])>([\s\S]*?)<\/Person[12]>/g; + let match; + while ((match = regex.exec(fullScript)) !== null) { + turns.push({ speaker: match[1], text: match[2].trim() }); + } + + log(`Parsed ${turns.length} speaker turns`); + log(` Maya (Person1): ${turns.filter(t => t.speaker === 'Person1').length}`); + log(` James (Person2): ${turns.filter(t => t.speaker === 'Person2').length}`); + + const { path, duration } = await generateTTS(turns, outputDir); + + console.log(` +╔════════════════════════════════════════════════════════════╗ +║ Generation Complete ║ +╠════════════════════════════════════════════════════════════╣ +║ Mode: ${isDeep ? 'DEEP DIVE' : 'QUICK DIVE'} ║ +║ Total turns: ${String(totalTurns).padEnd(44)}║ +║ Duration: ${String((duration / 60).toFixed(1) + ' minutes').padEnd(47)}║ +║ Output: ${path.slice(-50).padEnd(49)}║ +╚════════════════════════════════════════════════════════════╝ +`); + } else { + log('TTS skipped'); + } +} + +main().catch(err => { + console.error('Error:', err.message); + process.exit(1); +}); diff --git a/skills/thebuilders-v2/scripts/generate.sh b/skills/thebuilders-v2/scripts/generate.sh new file mode 100755 index 000000000..69a677031 --- /dev/null +++ b/skills/thebuilders-v2/scripts/generate.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# The Builders Podcast Generator v2 +# Usage: ./generate.sh "Topic Name" [output_dir] + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SKILL_DIR="$(dirname "$SCRIPT_DIR")" + +TOPIC="${1:-}" +OUTPUT="${2:-./output}" + +if [ -z "$TOPIC" ]; then + echo "Usage: ./generate.sh \"Topic Name\" [output_dir]" + echo "" + echo "Example:" + echo " ./generate.sh \"OpenAI\" /tmp/openai-episode" + exit 1 +fi + +cd "$SKILL_DIR" +node scripts/generate.mjs "$TOPIC" -o "$OUTPUT" "$@" diff --git a/skills/thebuilders-v2/scripts/llm-helper.mjs b/skills/thebuilders-v2/scripts/llm-helper.mjs new file mode 100644 index 000000000..202ac9990 --- /dev/null +++ b/skills/thebuilders-v2/scripts/llm-helper.mjs @@ -0,0 +1,45 @@ +#!/usr/bin/env node +/** + * Simple LLM helper using OpenAI API directly + */ + +import { readFileSync } from 'fs'; + +const OPENAI_API_KEY = process.env.OPENAI_API_KEY; + +export async function llm(prompt, model = 'gpt-4o') { + const response = await fetch('https://api.openai.com/v1/chat/completions', { + method: 'POST', + headers: { + 'Authorization': `Bearer ${OPENAI_API_KEY}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + model, + messages: [{ role: 'user', content: prompt }], + max_tokens: 16000, + temperature: 0.7, + }), + }); + + if (!response.ok) { + const error = await response.text(); + throw new Error(`OpenAI API error: ${response.status} - ${error}`); + } + + const data = await response.json(); + return data.choices[0].message.content; +} + +// CLI mode +if (process.argv[1].endsWith('llm-helper.mjs')) { + const input = readFileSync(0, 'utf-8'); // stdin + const model = process.argv[2] || 'gpt-4o'; + + llm(input, model) + .then(result => console.log(result)) + .catch(err => { + console.error(err.message); + process.exit(1); + }); +} diff --git a/skills/thebuilders-v2/templates/acquired-bible.md b/skills/thebuilders-v2/templates/acquired-bible.md new file mode 100644 index 000000000..8fc85a019 --- /dev/null +++ b/skills/thebuilders-v2/templates/acquired-bible.md @@ -0,0 +1,78 @@ +# THE ACQUIRED FORMULA (v3 Style Guide) + +## The Hosts - MUST be distinct + +**Maya Chen (Person1):** +- Former engineer/founder - asks "how does this actually work?" +- SKEPTICAL of hype, wants mechanics and numbers +- Gets excited about clever technical solutions +- Catchphrases: "Wait, slow down.", "Show me the numbers.", "I had to read this three times to believe it.", "That's actually clever because..." + +**James Porter (Person2):** +- Former VC, business historian - analyzes strategy and competitive dynamics +- SYNTHESIZER - sees patterns, makes historical comparisons +- Catchphrases: "For context...", "This is the classic [X] playbook.", "The lesson here is...", "What a story.", "And this is where things get messy." + +## The Dynamic - THIS IS CRITICAL + +- **Discovery together** - both genuinely learning, real reactions +- **Interruptions** - they cut each other off with excitement +- **Different angles** - Maya goes technical, James goes strategic +- **Healthy disagreement** - they sometimes push back on each other +- **Build on each other** - not just taking turns monologuing + +## Conversation Patterns (use these!) + +``` +Maya: "Wait, I have to stop you there. Are you saying they literally..." +James: "Yes! They bet the entire company on this one chip." +Maya: "That's insane. Okay, walk me through how that actually worked." +``` + +``` +James: "For context, at that time the market was..." +Maya: "Hold on - I want to dig into something. The numbers here are wild." +James: "Go for it." +Maya: "So they had [specific stat]. Let that sink in." +James: "That's... actually that explains a lot about what happened next." +``` + +## Language They Use + +- "You would be amazed..." +- "I had to read this three times to believe it..." +- "Here's the thing nobody talks about..." +- "That's insane." +- "Wait, back up." +- "Walk me through..." +- "So THIS is why..." +- "And this is where things get messy." +- "Wait, really?" + +## What NOT to do + +- NO lecturing or monologuing (max 3-4 sentences per turn) +- NO dry recitation of facts +- NO agreeing with everything the other says +- NO identical speech patterns between hosts +- NO skipping the intro/greeting + +## Episode Structure + +0. **INTRO** (8 turns) - Welcome, banter, introduce topic, tease story +1. **HOOK** (12 turns) - Surprising fact/tension, central question, stakes +2. **ORIGIN** (20 turns) - Founders as humans, genesis, early bet, market context +3. **INFLECTION_1** (18 turns) - First major decision, alternatives, stakes +4. **INFLECTION_2** (18 turns) - Second pivot, new challenge, adaptation +5. **MESSY_MIDDLE** (14 turns) - Near-death, conflicts, real struggle +6. **NOW** (12 turns) - Current state, metrics, competition, open questions +7. **TAKEAWAYS** (10 turns) - Key lessons, frameworks, final thought + +**Total: ~112 turns / 20-25 minutes** + +## TTS Voice Mapping + +- **Maya (Person1)**: alloy (clear, energetic female) +- **James (Person2)**: echo (distinct male) +- Use TTS-1-HD for quality +- Parse by speaker tags, NOT by chunk size diff --git a/skills/thebuilders-v2/templates/hook-prompt.md b/skills/thebuilders-v2/templates/hook-prompt.md new file mode 100644 index 000000000..a7c794c4b --- /dev/null +++ b/skills/thebuilders-v2/templates/hook-prompt.md @@ -0,0 +1,79 @@ +# Hook Engineering + +Based on the research below, create 3 compelling episode hooks and analyze each. + +## Research Summary +{{RESEARCH_SUMMARY}} + +## Hook Types + +### 1. Data Hook +Opens with surprising statistics or numbers that create cognitive dissonance. + +**Formula:** [Small thing] → [Big outcome] or [Big thing] → [Unexpected small detail] + +**Example:** +> "In 2007, Nokia had 50% of the global phone market. By 2013, they sold their phone business for $7 billion—less than they'd spent on R&D in a single year." + +### 2. Story Hook +Opens with a specific dramatic moment that drops listener into action. + +**Formula:** Time + Place + Tension + Stakes + +**Example:** +> "It was 2 AM on a Friday when the email landed. 700 OpenAI employees had just signed a letter threatening to quit. The CEO they were defending had been fired 48 hours earlier." + +### 3. Question Hook +Opens with a provocative question that reframes how listener thinks about topic. + +**Formula:** Challenge assumption OR reveal hidden dynamic OR pose genuine mystery + +**Example:** +> "What happens when you build something so powerful that your own board tries to shut it down?" + +--- + +## Your Task + +Generate 3 hooks for this episode, one of each type. For each: + +```markdown +## [Hook Type] Hook + +> "[The actual hook - 2-4 sentences max]" + +**What makes it work:** +- [Specific strength] +- [Another strength] + +**Risk:** +- [Potential weakness] + +**Best for audience who:** +- [Audience type/mood this hook serves] + +**Score:** [X]/10 + +**Follow-up line (Person2's response):** +> "[Natural reaction that builds momentum]" +``` + +## After All Three + +```markdown +## Recommendation + +**Best hook:** [Type] +**Reasoning:** [Why this one wins] +**Backup:** [Second choice and when to use it] +``` + +## Quality Criteria + +A great hook: +- ✓ Creates immediate curiosity +- ✓ Promises value (listener knows what they'll learn) +- ✓ Is specific (names, numbers, dates) +- ✓ Is timeless (no "recently", "this week") +- ✓ Sets up the episode's central question +- ✓ Gives both hosts something to react to diff --git a/skills/thebuilders-v2/templates/outline-prompt.md b/skills/thebuilders-v2/templates/outline-prompt.md new file mode 100644 index 000000000..bfa86834b --- /dev/null +++ b/skills/thebuilders-v2/templates/outline-prompt.md @@ -0,0 +1,96 @@ +# Episode Outline Generator + +Create a structured outline for a podcast episode about: {{TOPIC}} + +## Output Format + +Generate the outline in this exact structure: + +```markdown +# Episode Outline: [Clear Title] + +## Central Question +[One sentence: What's the core question this episode answers?] + +## Hook Options + +### Data Hook +> "[Draft a hook using surprising statistics or numbers]" +Research needed: [What specific data to find] + +### Story Hook +> "[Draft a hook using a dramatic moment or scene]" +Research needed: [What specific story details to find] + +### Question Hook +> "[Draft a hook using a provocative question]" +Research needed: [What context needed to make this land] + +## Episode Arc + +### 1. Hook (3-4 min) +- Opening moment: [What grabs attention?] +- Central question setup: [What are we exploring?] +- Stakes: [Why should listener care?] + +### 2. Origin Story (5-7 min) +- Founders: [Who are they? What's their background?] +- Genesis moment: [What sparked this?] +- Early bet: [What was the initial hypothesis?] +- Human element: [What makes protagonists relatable?] + +### 3. Key Inflection #1 (4-5 min) +- The decision: [What choice did they face?] +- The alternatives: [What else could they have done?] +- The bet: [What did they risk?] +- The outcome: [What happened?] + +### 4. Key Inflection #2 (4-5 min) +- The challenge: [What new obstacle emerged?] +- The pivot: [How did they adapt?] +- The insight: [What did they learn?] + +### 5. The Messy Middle (3-4 min) +- Near-death moment: [What almost killed them?] +- Internal conflict: [What tensions existed?] +- Survival: [How did they make it through?] + +### 6. Where They Are Now (3-4 min) +- Current position: [Market position, key metrics] +- Competitive landscape: [Who else, why winning/losing] +- Open questions: [What's unresolved?] + +### 7. Takeaways (2-3 min) +- Key lesson #1: [Framework or principle] +- Key lesson #2: [What would we do differently?] +- Final thought: [Memorable closing] + +## Research Agenda + +### Must-Have Sources +- [ ] Founder interviews (podcasts, written) +- [ ] Funding announcements / SEC filings +- [ ] Key product launches +- [ ] Competitive context at each inflection + +### Nice-to-Have +- [ ] Internal memos or leaked documents +- [ ] Employee perspectives +- [ ] Customer case studies +- [ ] Analyst reports + +### Specific Questions to Answer +1. [Question that will make hook work] +2. [Question about origin story] +3. [Question about inflection point] +4. [Question about current state] +5. [Contrarian question - what's the counter-narrative?] +``` + +## Guidelines + +- Be SPECIFIC - name exact decisions, dates, people +- Identify GAPS - what do we need to research? +- Think DRAMA - where's the tension in this story? +- Consider BOTH hosts - where will Maya (technical) vs James (strategy) shine? +- Plan DISCOVERY - what can hosts "learn" from each other during episode? diff --git a/skills/thebuilders-v2/templates/research-prompt.md b/skills/thebuilders-v2/templates/research-prompt.md new file mode 100644 index 000000000..c3f3458d1 --- /dev/null +++ b/skills/thebuilders-v2/templates/research-prompt.md @@ -0,0 +1,144 @@ +# Targeted Research with Citations + +Research the following topic according to the outline provided. Track ALL sources. + +## Topic +{{TOPIC}} + +## Outline to Follow +{{OUTLINE}} + +--- + +## Output Format + +Structure your research EXACTLY as follows: + +```markdown +# Research Report: [Topic] + +Generated: [Date] +Sources: [Total count] + +--- + +## Executive Summary +[3-4 sentences: The story in brief, the key insight, why it matters] + +--- + +## Section 1: Origin Story + +### Key Facts +- **Founding:** [Specific date, location, founders] [1] +- **Initial capital:** $[Amount] from [Source] [2] +- **Original vision:** "[Quote or paraphrase]" [3] +- **First product:** [Description] [4] + +### Context +[2-3 sentences setting the scene - what was the market like? what problem existed?] + +### Human Element +[What makes the founders relatable? Early struggles? Quirks?] + +### Usable Quotes +> "[Exact quote]" — [Speaker], [Source] [5] + +--- + +## Section 2: Key Inflection #1 - [Name the Decision] + +### What Happened +- **Date:** [When] +- **Decision:** [What they chose to do] +- **Alternatives:** [What else they could have done] +- **Stakes:** [What they risked] + +### The Numbers +- [Specific metric before] → [Specific metric after] [6] + +### Why It Mattered +[2-3 sentences on consequences] + +### Usable Quotes +> "[Exact quote about this decision]" — [Speaker], [Source] [7] + +--- + +## Section 3: Key Inflection #2 - [Name the Decision] +[Same structure as above] + +--- + +## Section 4: The Messy Middle + +### Near-Death Moments +- [Crisis #1]: [What happened, how they survived] [8] +- [Crisis #2]: [What happened, how they survived] [9] + +### Internal Tensions +- [Conflict or disagreement that shaped company] [10] + +--- + +## Section 5: Current State + +### Position Today +- **Valuation/Revenue:** [Latest numbers] [11] +- **Market share:** [Position] [12] +- **Key metrics:** [What matters for this company] + +### Competitive Landscape +- **Main competitors:** [Who and their position] +- **Why winning/losing:** [Analysis] + +### Open Questions +- [Unresolved strategic question] +- [Unresolved technical question] + +--- + +## Contrarian Corner + +### The Counter-Narrative +[What's the bear case? What do critics say? What might go wrong?] + +### Underreported Angle +[What story isn't being told? What did you find that surprised you?] + +--- + +## Sources + +[1] [Author/Publication]. "[Title]". [Date]. [URL if available] +[2] ... +[3] ... +[Continue numbering all sources] + +--- + +## Research Gaps + +- [ ] [Question we couldn't answer] +- [ ] [Source we couldn't find] +- [ ] [Data point that would strengthen the episode] +``` + +## Citation Rules + +1. EVERY factual claim needs a citation number [X] +2. Use primary sources when possible (founder interviews, SEC filings, earnings calls) +3. Date your sources - prefer recent for current state, contemporary for historical +4. If a fact is disputed, note the disagreement +5. Distinguish between fact and analysis/opinion + +## Quality Checklist + +Before finishing, verify: +- [ ] Every section of the outline has corresponding research +- [ ] All claims are cited +- [ ] At least 2 usable quotes per major section +- [ ] Numbers are specific (not "millions" but "$4.2 million") +- [ ] Dates are specific (not "early 2020" but "February 2020") +- [ ] Counter-narrative is addressed +- [ ] Sources list is complete and formatted diff --git a/skills/thebuilders-v2/templates/review-prompt.md b/skills/thebuilders-v2/templates/review-prompt.md new file mode 100644 index 000000000..64b793f3c --- /dev/null +++ b/skills/thebuilders-v2/templates/review-prompt.md @@ -0,0 +1,101 @@ +# Script Review & Refinement + +Review the following podcast script section by section and suggest improvements. + +## Script to Review +{{SCRIPT}} + +--- + +## Review Each Section + +For each section, provide: + +```markdown +## Section [X]: [Name] + +### Quality Scores +- Hook effectiveness: [X]/10 +- Fact density: [X]/10 +- Natural dialogue: [X]/10 +- Voice consistency: [X]/10 +- Discovery moments: [X]/10 + +### What Works +- [Specific strength] +- [Another strength] + +### Issues Found +1. **[Issue type]**: [Specific problem] + - Line: "[Quote the problematic line]" + - Fix: "[Suggested replacement]" + - Why: [Explanation] + +2. **[Issue type]**: [Specific problem] + ... + +### Voice Check +- Maya in-character: [Yes/No] - [Note if any slip] +- James in-character: [Yes/No] - [Note if any slip] + +### Missing Elements +- [ ] [Something that should be added] +- [ ] [Another missing element] +``` + +## Common Issues to Check + +### Dialogue Issues +- Monologues (turns > 5 sentences) +- Missing reactions ("Wait, really?") +- Unnatural transitions +- Both hosts saying same thing + +### Voice Consistency +- Maya being too strategic +- James being too technical +- Missing signature phrases +- Tone shifts + +### Content Issues +- Unsourced claims +- Vague numbers ("millions" vs "$4.2M") +- Dated references +- Missing "so what?" + +### Engagement Issues +- No discovery moments +- No disagreements +- Predictable flow +- Weak transitions between sections + +--- + +## Final Assessment + +```markdown +## Overall Quality + +**Episode Grade:** [A/B/C] + +**Strengths:** +1. [Top strength] +2. [Another strength] + +**Critical Fixes Needed:** +1. [Must fix before TTS] +2. [Another must-fix] + +**Nice-to-Have Improvements:** +1. [Would improve but not critical] +2. [Another nice-to-have] + +**Estimated Duration:** [X] minutes + +**Ready for TTS:** [Yes / No - needs revision] +``` + +## Output + +After review, provide the complete REVISED script with all fixes applied. +Use the same format (section markers + Person tags). diff --git a/skills/thebuilders-v2/templates/script-prompt.md b/skills/thebuilders-v2/templates/script-prompt.md new file mode 100644 index 000000000..21512aa9f --- /dev/null +++ b/skills/thebuilders-v2/templates/script-prompt.md @@ -0,0 +1,157 @@ +# The Builders Podcast Script Generation v2 + +Generate a complete podcast script with section markers and citation integration. + +## The Hosts + +**Maya Chen (Person1):** +- Former software engineer, founded and sold a B2B SaaS startup +- Lens: "How does this actually work?" - technical, mechanical, architectural +- Skeptical of hype, wants specifics and numbers +- Phrases: "Wait, slow down.", "Show me the numbers.", "I had to read this three times.", "That's actually clever because..." +- NEVER says: "From a strategic perspective", "The market opportunity" + +**James Porter (Person2):** +- Former venture capitalist, studied business history +- Lens: "What's the business model?" - strategy, markets, competitive dynamics +- Synthesizer, pattern matcher, historical parallels +- Phrases: "For context...", "This is the classic [X] playbook.", "The lesson here is...", "What a story." +- NEVER says: "Let me explain the architecture", "The API design" + +## Citation Integration + +Hosts naturally reference sources: +- "According to their Series B deck..." +- "There's this great interview where [Founder] said..." +- "The SEC filing actually shows..." +- "I found this quote from [Year]..." + +## Episode Structure + +### SECTION 1: HOOK (Turns 1-15, ~3-4 min) + +Use this hook: +{{SELECTED_HOOK}} + +Guidelines: +- Open with the hook, let it land +- Person2 reacts with genuine surprise/curiosity +- Establish central question of episode +- Tease what's coming without spoiling +- End section with clear transition to origin + +### SECTION 2: ORIGIN STORY (Turns 16-45, ~6-7 min) + +Cover: +- Who are the founders? Make them human +- What was the genesis moment? +- What was the market context? +- What was their early bet/hypothesis? +- First signs of traction or failure + +Guidelines: +- Maya explores technical origins +- James provides market/strategy context +- Include specific dates, amounts, details +- At least one "I didn't know that" moment + +### SECTION 3: KEY INFLECTION #1 (Turns 46-70, ~5 min) + +Cover: +- What decision did they face? +- What alternatives existed? +- What did they risk? +- How did it play out? + +Guidelines: +- Build tension before revealing outcome +- Explore the "what if they'd done X instead?" +- Use specific numbers for before/after +- Include a quote from the time + +### SECTION 4: KEY INFLECTION #2 (Turns 71-90, ~4 min) + +Cover: +- New challenge or opportunity +- How they adapted/pivoted +- Key insight they gained + +Guidelines: +- Connect to first inflection +- Show evolution of thinking +- Maya: technical implications +- James: strategic implications + +### SECTION 5: MESSY MIDDLE (Turns 91-105, ~3 min) + +Cover: +- Near-death moment(s) +- Internal conflicts +- What almost broke them + +Guidelines: +- Don't glorify - show real struggle +- Include specific stakes ("6 months of runway") +- One host can play devil's advocate + +### SECTION 6: NOW (Turns 106-120, ~3 min) + +Cover: +- Current position and metrics +- Competitive landscape +- Open questions + +Guidelines: +- Timeless framing (position, not news) +- Acknowledge uncertainty about future +- Set up takeaways + +### SECTION 7: TAKEAWAYS (Turns 121-130, ~2-3 min) + +Cover: +- Key lesson(s) +- Framework or principle +- Final memorable thought + +Guidelines: +- Both hosts contribute insights +- Connect back to hook/central question +- End with forward-looking thought +- Final line should resonate + +## Format Rules + +1. Use `` and `` XML tags +2. Each turn: 2-5 sentences (conversation, not monologue) +3. Add section markers: `` +4. Include discovery moments in every section +5. NO news references - timeless only +6. Use SPECIFIC facts from research +7. Both hosts should learn during conversation +8. Minimum 130 turns total + +## Section Marker Format + +``` + +The email arrived at 2 AM... +... + + +Okay, so let's go back to the beginning... +... +``` + +## Research Material + +{{RESEARCH}} + +--- + +## Selected Hook + +{{HOOK}} + +--- + +Generate the complete script now. Start with `` followed by ``. diff --git a/skills/transcribe/lib/__pycache__/r2_upload.cpython-312.pyc b/skills/transcribe/lib/__pycache__/r2_upload.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41225b7a94849b99caeecb668ef138b56f07f8a2 GIT binary patch literal 5537 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 L1^OW>@Pz*hyoUBU literal 0 HcmV?d00001 diff --git a/skills/transcribe/lib/__pycache__/whisper.cpython-312.pyc b/skills/transcribe/lib/__pycache__/whisper.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e16acc7dfe32d441836ff3af4ccdbe1d6522b02 GIT binary patch literal 13459 zcmbt*ZE#apmf(B(c>0!XeORBiRS}i+#68tj%~b8y(CJP$p`k}Y^jLXA)q1L_txauht@x-V z(DP%@y-!b)-7@L)Jfr*0yZ794&$;*9bMHC#@*9mtNxaIKCT#6j4Owg}KIg2O*1ano zHcyLOrQwQWlm4Rt+Ihee3^Ax&(%?9tbJRFPdnd=ka-WACWtuN+ z%|UHBs6DKsft1(RoJDF|pV7`qLzC>80ILRuMi5uRgT`14zsIjbkIoYzA)gq__FXOm zfH7&|7Z0Pc68ibis4e~v)t1oG|3KSRh!W(xDK>Bh()_vcIRFD;GYGAL|+%>OR(c^my-)LHF_Afu18Lj&qW&JGN{A?Uex?_jzWT zQ!##eBH;Ch++LcKBQsk6OS?>PP4z~K-Y=> z<8HoXF%Y>%JVu@UytDOOV4P`Xd|sw?)EhcCd8T#5=a~YPZVjII`h3CG5bN;=M_BI} zrq$;?(>ldZvzCczP7k!**>5-Bt!yi6B)mogu`4_JM3ee;8JgNd4LiH@TwJ=b`-ZX~u=%PzH!h^igDJz2hbl@YAAZZfcL60l;@byiFTR!qt$b5=|Z z6jj;w^)IBiwx*KSKut9bRuQacAx#NbM#-=SETe(bW^LgRZwkX(vVik!fOQtPn!+e! zd)P9_nxMDXGL%?Qk4hjB9%Qkw)!N5ft?X(*5FceRqLK)Ckqk;nA_6N9>emS2&S6DF zxiW0!i`g}S64XO2;U^-_)e~oF=D31(B-y;2m5da%qO2P7bCyS-4f?7IX@oDZYgul; zO9EvIQN9AJTJf4!h!4cTrz}@nUc6<%6VVD<`MwCSz44n(G-Z0J$ ztGfgK5LmzFak6uahi2Fym>)@y z@ts|#KODuIhaegqCwkZ_fH=9^?e%*@Zg<$cR%Kg+0@(Zz!8jyfOVotEHdR_TL#>)C z?wZ?U^>J&mx_w4+S)Fz?+;!}YcPuw2H|<@qA57X0rtG~ll6!JX+GM+HYF;=SJGmGD zRAt&+zTi!o8&S1Yo#DO6e~HAlt<<#Nt!clncO=SBr1Y;P)UU1Dt71(_dvn6p689`i zR<`U-ZrPh??MhhoK~2qSWqmC4VdQEg=1-KrlyE)pnC+i8)rNt=Q)aHV6)&KDO6FkEaD0G z7AV;~fhU3*CKoXV1?!(E6`?}8?ZX9(KLim~Du|F^;EAykp@sY#`beMu5+IOJ^8xS-rA8qy z|E9Gc>psf%SyUBKjUh9*?x9Q0gJ!Z-P>Lq&x<@cyWA=3g@JW{nGDPJh;lI2AeftcPMgZ}c?CUD#HkTREUKX^qS`+VH=+r{1|D>%ex2a(c^+oqEXnq+(NDB5TK8=4eTzq^L$$3pApo z5iM;C!$KO>0;CRu6{9QgOzAG*;|2ZC_i0pLpo_&UNKK>^^sY9dr|Ygr==wry1!E7c zD_D|-Txp@5DWw}RKQ$Z3;_?!LI}$ZO@4MCw7<@)@eKtfyO6ev{&$)gY892-5v|jMiOu!j}f4Mf+)Dw0SolYTk;S{o*Bj5@;8=02Tmd(xv z#@_&`hi!1JsgK>o&YU-lKT&g&L1qo!y1h!Lv)4c3n*{o(pxMVW)3)pcR=g93k7YQQ{bRF8$!&*5E3oOj3SRch+v@$5KL!%`-U9FuME&al|o?Bt{j+OvlZ$N6Z16Cxm

30y2syt5%0#&O0LDie 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 JKn_;s{|~Fnz?J|2 literal 0 HcmV?d00001 diff --git a/skills/uv.lock b/skills/uv.lock new file mode 100644 index 000000000..dd2ee6799 --- /dev/null +++ b/skills/uv.lock @@ -0,0 +1,638 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "anyio" +version = "4.12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685, upload-time = "2026-01-06T11:45:21.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" }, +] + +[[package]] +name = "certifi" +version = "2026.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" }, +] + +[[package]] +name = "click" +version = "8.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "fastapi" +version = "0.128.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/08/8c8508db6c7b9aae8f7175046af41baad690771c9bcde676419965e338c7/fastapi-0.128.0.tar.gz", hash = "sha256:1cc179e1cef10a6be60ffe429f79b829dce99d8de32d7acb7e6c8dfdf7f2645a", size = 365682, upload-time = "2025-12-27T15:21:13.714Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/05/5cbb59154b093548acd0f4c7c474a118eda06da25aa75c616b72d8fcd92a/fastapi-0.128.0-py3-none-any.whl", hash = "sha256:aebd93f9716ee3b4f4fcfe13ffb7cf308d99c9f3ab5622d8877441072561582d", size = 103094, upload-time = "2025-12-27T15:21:12.154Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httptools" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/46/120a669232c7bdedb9d52d4aeae7e6c7dfe151e99dc70802e2fc7a5e1993/httptools-0.7.1.tar.gz", hash = "sha256:abd72556974f8e7c74a259655924a717a2365b236c882c3f6f8a45fe94703ac9", size = 258961, upload-time = "2025-10-10T03:55:08.559Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/08/17e07e8d89ab8f343c134616d72eebfe03798835058e2ab579dcc8353c06/httptools-0.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:474d3b7ab469fefcca3697a10d11a32ee2b9573250206ba1e50d5980910da657", size = 206521, upload-time = "2025-10-10T03:54:31.002Z" }, + { url = "https://files.pythonhosted.org/packages/aa/06/c9c1b41ff52f16aee526fd10fbda99fa4787938aa776858ddc4a1ea825ec/httptools-0.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3c3b7366bb6c7b96bd72d0dbe7f7d5eead261361f013be5f6d9590465ea1c70", size = 110375, upload-time = "2025-10-10T03:54:31.941Z" }, + { url = "https://files.pythonhosted.org/packages/cc/cc/10935db22fda0ee34c76f047590ca0a8bd9de531406a3ccb10a90e12ea21/httptools-0.7.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:379b479408b8747f47f3b253326183d7c009a3936518cdb70db58cffd369d9df", size = 456621, upload-time = "2025-10-10T03:54:33.176Z" }, + { url = "https://files.pythonhosted.org/packages/0e/84/875382b10d271b0c11aa5d414b44f92f8dd53e9b658aec338a79164fa548/httptools-0.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cad6b591a682dcc6cf1397c3900527f9affef1e55a06c4547264796bbd17cf5e", size = 454954, upload-time = "2025-10-10T03:54:34.226Z" }, + { url = "https://files.pythonhosted.org/packages/30/e1/44f89b280f7e46c0b1b2ccee5737d46b3bb13136383958f20b580a821ca0/httptools-0.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eb844698d11433d2139bbeeb56499102143beb582bd6c194e3ba69c22f25c274", size = 440175, upload-time = "2025-10-10T03:54:35.942Z" }, + { url = "https://files.pythonhosted.org/packages/6f/7e/b9287763159e700e335028bc1824359dc736fa9b829dacedace91a39b37e/httptools-0.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f65744d7a8bdb4bda5e1fa23e4ba16832860606fcc09d674d56e425e991539ec", size = 440310, upload-time = "2025-10-10T03:54:37.1Z" }, + { url = "https://files.pythonhosted.org/packages/b3/07/5b614f592868e07f5c94b1f301b5e14a21df4e8076215a3bccb830a687d8/httptools-0.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:135fbe974b3718eada677229312e97f3b31f8a9c8ffa3ae6f565bf808d5b6bcb", size = 86875, upload-time = "2025-10-10T03:54:38.421Z" }, + { url = "https://files.pythonhosted.org/packages/53/7f/403e5d787dc4942316e515e949b0c8a013d84078a915910e9f391ba9b3ed/httptools-0.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:38e0c83a2ea9746ebbd643bdfb521b9aa4a91703e2cd705c20443405d2fd16a5", size = 206280, upload-time = "2025-10-10T03:54:39.274Z" }, + { url = "https://files.pythonhosted.org/packages/2a/0d/7f3fd28e2ce311ccc998c388dd1c53b18120fda3b70ebb022b135dc9839b/httptools-0.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f25bbaf1235e27704f1a7b86cd3304eabc04f569c828101d94a0e605ef7205a5", size = 110004, upload-time = "2025-10-10T03:54:40.403Z" }, + { url = "https://files.pythonhosted.org/packages/84/a6/b3965e1e146ef5762870bbe76117876ceba51a201e18cc31f5703e454596/httptools-0.7.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c15f37ef679ab9ecc06bfc4e6e8628c32a8e4b305459de7cf6785acd57e4d03", size = 517655, upload-time = "2025-10-10T03:54:41.347Z" }, + { url = "https://files.pythonhosted.org/packages/11/7d/71fee6f1844e6fa378f2eddde6c3e41ce3a1fb4b2d81118dd544e3441ec0/httptools-0.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7fe6e96090df46b36ccfaf746f03034e5ab723162bc51b0a4cf58305324036f2", size = 511440, upload-time = "2025-10-10T03:54:42.452Z" }, + { url = "https://files.pythonhosted.org/packages/22/a5/079d216712a4f3ffa24af4a0381b108aa9c45b7a5cc6eb141f81726b1823/httptools-0.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f72fdbae2dbc6e68b8239defb48e6a5937b12218e6ffc2c7846cc37befa84362", size = 495186, upload-time = "2025-10-10T03:54:43.937Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9e/025ad7b65278745dee3bd0ebf9314934c4592560878308a6121f7f812084/httptools-0.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e99c7b90a29fd82fea9ef57943d501a16f3404d7b9ee81799d41639bdaae412c", size = 499192, upload-time = "2025-10-10T03:54:45.003Z" }, + { url = "https://files.pythonhosted.org/packages/6d/de/40a8f202b987d43afc4d54689600ff03ce65680ede2f31df348d7f368b8f/httptools-0.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:3e14f530fefa7499334a79b0cf7e7cd2992870eb893526fb097d51b4f2d0f321", size = 86694, upload-time = "2025-10-10T03:54:45.923Z" }, + { url = "https://files.pythonhosted.org/packages/09/8f/c77b1fcbfd262d422f12da02feb0d218fa228d52485b77b953832105bb90/httptools-0.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6babce6cfa2a99545c60bfef8bee0cc0545413cb0018f617c8059a30ad985de3", size = 202889, upload-time = "2025-10-10T03:54:47.089Z" }, + { url = "https://files.pythonhosted.org/packages/0a/1a/22887f53602feaa066354867bc49a68fc295c2293433177ee90870a7d517/httptools-0.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:601b7628de7504077dd3dcb3791c6b8694bbd967148a6d1f01806509254fb1ca", size = 108180, upload-time = "2025-10-10T03:54:48.052Z" }, + { url = "https://files.pythonhosted.org/packages/32/6a/6aaa91937f0010d288d3d124ca2946d48d60c3a5ee7ca62afe870e3ea011/httptools-0.7.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:04c6c0e6c5fb0739c5b8a9eb046d298650a0ff38cf42537fc372b28dc7e4472c", size = 478596, upload-time = "2025-10-10T03:54:48.919Z" }, + { url = "https://files.pythonhosted.org/packages/6d/70/023d7ce117993107be88d2cbca566a7c1323ccbaf0af7eabf2064fe356f6/httptools-0.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69d4f9705c405ae3ee83d6a12283dc9feba8cc6aaec671b412917e644ab4fa66", size = 473268, upload-time = "2025-10-10T03:54:49.993Z" }, + { url = "https://files.pythonhosted.org/packages/32/4d/9dd616c38da088e3f436e9a616e1d0cc66544b8cdac405cc4e81c8679fc7/httptools-0.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:44c8f4347d4b31269c8a9205d8a5ee2df5322b09bbbd30f8f862185bb6b05346", size = 455517, upload-time = "2025-10-10T03:54:51.066Z" }, + { url = "https://files.pythonhosted.org/packages/1d/3a/a6c595c310b7df958e739aae88724e24f9246a514d909547778d776799be/httptools-0.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:465275d76db4d554918aba40bf1cbebe324670f3dfc979eaffaa5d108e2ed650", size = 458337, upload-time = "2025-10-10T03:54:52.196Z" }, + { url = "https://files.pythonhosted.org/packages/fd/82/88e8d6d2c51edc1cc391b6e044c6c435b6aebe97b1abc33db1b0b24cd582/httptools-0.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:322d00c2068d125bd570f7bf78b2d367dad02b919d8581d7476d8b75b294e3e6", size = 85743, upload-time = "2025-10-10T03:54:53.448Z" }, + { url = "https://files.pythonhosted.org/packages/34/50/9d095fcbb6de2d523e027a2f304d4551855c2f46e0b82befd718b8b20056/httptools-0.7.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:c08fe65728b8d70b6923ce31e3956f859d5e1e8548e6f22ec520a962c6757270", size = 203619, upload-time = "2025-10-10T03:54:54.321Z" }, + { url = "https://files.pythonhosted.org/packages/07/f0/89720dc5139ae54b03f861b5e2c55a37dba9a5da7d51e1e824a1f343627f/httptools-0.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7aea2e3c3953521c3c51106ee11487a910d45586e351202474d45472db7d72d3", size = 108714, upload-time = "2025-10-10T03:54:55.163Z" }, + { url = "https://files.pythonhosted.org/packages/b3/cb/eea88506f191fb552c11787c23f9a405f4c7b0c5799bf73f2249cd4f5228/httptools-0.7.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0e68b8582f4ea9166be62926077a3334064d422cf08ab87d8b74664f8e9058e1", size = 472909, upload-time = "2025-10-10T03:54:56.056Z" }, + { url = "https://files.pythonhosted.org/packages/e0/4a/a548bdfae6369c0d078bab5769f7b66f17f1bfaa6fa28f81d6be6959066b/httptools-0.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df091cf961a3be783d6aebae963cc9b71e00d57fa6f149025075217bc6a55a7b", size = 470831, upload-time = "2025-10-10T03:54:57.219Z" }, + { url = "https://files.pythonhosted.org/packages/4d/31/14df99e1c43bd132eec921c2e7e11cda7852f65619bc0fc5bdc2d0cb126c/httptools-0.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f084813239e1eb403ddacd06a30de3d3e09a9b76e7894dcda2b22f8a726e9c60", size = 452631, upload-time = "2025-10-10T03:54:58.219Z" }, + { url = "https://files.pythonhosted.org/packages/22/d2/b7e131f7be8d854d48cb6d048113c30f9a46dca0c9a8b08fcb3fcd588cdc/httptools-0.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7347714368fb2b335e9063bc2b96f2f87a9ceffcd9758ac295f8bbcd3ffbc0ca", size = 452910, upload-time = "2025-10-10T03:54:59.366Z" }, + { url = "https://files.pythonhosted.org/packages/53/cf/878f3b91e4e6e011eff6d1fa9ca39f7eb17d19c9d7971b04873734112f30/httptools-0.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:cfabda2a5bb85aa2a904ce06d974a3f30fb36cc63d7feaddec05d2050acede96", size = 88205, upload-time = "2025-10-10T03:55:00.389Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "my-api" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "fastapi" }, + { name = "httpx" }, + { name = "uvicorn", extra = ["standard"] }, +] + +[package.optional-dependencies] +dev = [ + { name = "pytest" }, +] + +[package.metadata] +requires-dist = [ + { name = "fastapi", specifier = ">=0.110.0" }, + { name = "httpx", specifier = ">=0.27.0" }, + { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0.0" }, + { name = "uvicorn", extras = ["standard"], specifier = ">=0.29.0" }, +] +provides-extras = ["dev"] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pydantic" +version = "2.12.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.41.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", size = 2105873, upload-time = "2025-11-04T13:39:31.373Z" }, + { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826, upload-time = "2025-11-04T13:39:32.897Z" }, + { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869, upload-time = "2025-11-04T13:39:34.469Z" }, + { url = "https://files.pythonhosted.org/packages/6e/6a/30d94a9674a7fe4f4744052ed6c5e083424510be1e93da5bc47569d11810/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8", size = 2063890, upload-time = "2025-11-04T13:39:36.053Z" }, + { url = "https://files.pythonhosted.org/packages/50/be/76e5d46203fcb2750e542f32e6c371ffa9b8ad17364cf94bb0818dbfb50c/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e", size = 2229740, upload-time = "2025-11-04T13:39:37.753Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ee/fed784df0144793489f87db310a6bbf8118d7b630ed07aa180d6067e653a/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1", size = 2350021, upload-time = "2025-11-04T13:39:40.94Z" }, + { url = "https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", size = 2066378, upload-time = "2025-11-04T13:39:42.523Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3b/698cf8ae1d536a010e05121b4958b1257f0b5522085e335360e53a6b1c8b/pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b", size = 2175761, upload-time = "2025-11-04T13:39:44.553Z" }, + { url = "https://files.pythonhosted.org/packages/b8/ba/15d537423939553116dea94ce02f9c31be0fa9d0b806d427e0308ec17145/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", size = 2146303, upload-time = "2025-11-04T13:39:46.238Z" }, + { url = "https://files.pythonhosted.org/packages/58/7f/0de669bf37d206723795f9c90c82966726a2ab06c336deba4735b55af431/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594", size = 2340355, upload-time = "2025-11-04T13:39:48.002Z" }, + { url = "https://files.pythonhosted.org/packages/e5/de/e7482c435b83d7e3c3ee5ee4451f6e8973cff0eb6007d2872ce6383f6398/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", size = 2319875, upload-time = "2025-11-04T13:39:49.705Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e6/8c9e81bb6dd7560e33b9053351c29f30c8194b72f2d6932888581f503482/pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b", size = 1987549, upload-time = "2025-11-04T13:39:51.842Z" }, + { url = "https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe", size = 2011305, upload-time = "2025-11-04T13:39:53.485Z" }, + { url = "https://files.pythonhosted.org/packages/56/d8/0e271434e8efd03186c5386671328154ee349ff0354d83c74f5caaf096ed/pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f", size = 1972902, upload-time = "2025-11-04T13:39:56.488Z" }, + { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, + { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, + { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, + { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" }, + { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" }, + { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" }, + { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, + { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" }, + { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, + { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, + { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload-time = "2025-11-04T13:40:19.309Z" }, + { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload-time = "2025-11-04T13:40:21.548Z" }, + { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload-time = "2025-11-04T13:40:23.393Z" }, + { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403, upload-time = "2025-11-04T13:40:25.248Z" }, + { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload-time = "2025-11-04T13:40:27.099Z" }, + { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload-time = "2025-11-04T13:40:29.806Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258, upload-time = "2025-11-04T13:40:33.544Z" }, + { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917, upload-time = "2025-11-04T13:40:35.479Z" }, + { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186, upload-time = "2025-11-04T13:40:37.436Z" }, + { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164, upload-time = "2025-11-04T13:40:40.289Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146, upload-time = "2025-11-04T13:40:42.809Z" }, + { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788, upload-time = "2025-11-04T13:40:44.752Z" }, + { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133, upload-time = "2025-11-04T13:40:46.66Z" }, + { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852, upload-time = "2025-11-04T13:40:48.575Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", size = 1994679, upload-time = "2025-11-04T13:40:50.619Z" }, + { url = "https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", size = 2019766, upload-time = "2025-11-04T13:40:52.631Z" }, + { url = "https://files.pythonhosted.org/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", size = 1981005, upload-time = "2025-11-04T13:40:54.734Z" }, + { url = "https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", size = 2119622, upload-time = "2025-11-04T13:40:56.68Z" }, + { url = "https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", size = 1891725, upload-time = "2025-11-04T13:40:58.807Z" }, + { url = "https://files.pythonhosted.org/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", size = 1915040, upload-time = "2025-11-04T13:41:00.853Z" }, + { url = "https://files.pythonhosted.org/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", size = 2063691, upload-time = "2025-11-04T13:41:03.504Z" }, + { url = "https://files.pythonhosted.org/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", size = 2213897, upload-time = "2025-11-04T13:41:05.804Z" }, + { url = "https://files.pythonhosted.org/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", size = 2333302, upload-time = "2025-11-04T13:41:07.809Z" }, + { url = "https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", size = 2064877, upload-time = "2025-11-04T13:41:09.827Z" }, + { url = "https://files.pythonhosted.org/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", size = 2180680, upload-time = "2025-11-04T13:41:12.379Z" }, + { url = "https://files.pythonhosted.org/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", size = 2138960, upload-time = "2025-11-04T13:41:14.627Z" }, + { url = "https://files.pythonhosted.org/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", size = 2339102, upload-time = "2025-11-04T13:41:16.868Z" }, + { url = "https://files.pythonhosted.org/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", size = 2326039, upload-time = "2025-11-04T13:41:18.934Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", size = 1995126, upload-time = "2025-11-04T13:41:21.418Z" }, + { url = "https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", size = 2015489, upload-time = "2025-11-04T13:41:24.076Z" }, + { url = "https://files.pythonhosted.org/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", size = 1977288, upload-time = "2025-11-04T13:41:26.33Z" }, + { url = "https://files.pythonhosted.org/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", size = 2120255, upload-time = "2025-11-04T13:41:28.569Z" }, + { url = "https://files.pythonhosted.org/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", size = 1863760, upload-time = "2025-11-04T13:41:31.055Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", size = 1878092, upload-time = "2025-11-04T13:41:33.21Z" }, + { url = "https://files.pythonhosted.org/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", size = 2053385, upload-time = "2025-11-04T13:41:35.508Z" }, + { url = "https://files.pythonhosted.org/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", size = 2218832, upload-time = "2025-11-04T13:41:37.732Z" }, + { url = "https://files.pythonhosted.org/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", size = 2327585, upload-time = "2025-11-04T13:41:40Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", size = 2041078, upload-time = "2025-11-04T13:41:42.323Z" }, + { url = "https://files.pythonhosted.org/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", size = 2173914, upload-time = "2025-11-04T13:41:45.221Z" }, + { url = "https://files.pythonhosted.org/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", size = 2129560, upload-time = "2025-11-04T13:41:47.474Z" }, + { url = "https://files.pythonhosted.org/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", size = 2329244, upload-time = "2025-11-04T13:41:49.992Z" }, + { url = "https://files.pythonhosted.org/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", size = 2331955, upload-time = "2025-11-04T13:41:54.079Z" }, + { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906, upload-time = "2025-11-04T13:41:56.606Z" }, + { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607, upload-time = "2025-11-04T13:41:58.889Z" }, + { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" }, + { url = "https://files.pythonhosted.org/packages/11/72/90fda5ee3b97e51c494938a4a44c3a35a9c96c19bba12372fb9c634d6f57/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034", size = 2115441, upload-time = "2025-11-04T13:42:39.557Z" }, + { url = "https://files.pythonhosted.org/packages/1f/53/8942f884fa33f50794f119012dc6a1a02ac43a56407adaac20463df8e98f/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", size = 1930291, upload-time = "2025-11-04T13:42:42.169Z" }, + { url = "https://files.pythonhosted.org/packages/79/c8/ecb9ed9cd942bce09fc888ee960b52654fbdbede4ba6c2d6e0d3b1d8b49c/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", size = 1948632, upload-time = "2025-11-04T13:42:44.564Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1b/687711069de7efa6af934e74f601e2a4307365e8fdc404703afc453eab26/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", size = 2138905, upload-time = "2025-11-04T13:42:47.156Z" }, + { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, + { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, + { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, + { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, + { url = "https://files.pythonhosted.org/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", size = 2101980, upload-time = "2025-11-04T13:43:25.97Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865, upload-time = "2025-11-04T13:43:28.763Z" }, + { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256, upload-time = "2025-11-04T13:43:31.71Z" }, + { url = "https://files.pythonhosted.org/packages/83/d9/8412d7f06f616bbc053d30cb4e5f76786af3221462ad5eee1f202021eb4e/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1", size = 2174762, upload-time = "2025-11-04T13:43:34.744Z" }, + { url = "https://files.pythonhosted.org/packages/55/4c/162d906b8e3ba3a99354e20faa1b49a85206c47de97a639510a0e673f5da/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", size = 2143141, upload-time = "2025-11-04T13:43:37.701Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f2/f11dd73284122713f5f89fc940f370d035fa8e1e078d446b3313955157fe/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770", size = 2330317, upload-time = "2025-11-04T13:43:40.406Z" }, + { url = "https://files.pythonhosted.org/packages/88/9d/b06ca6acfe4abb296110fb1273a4d848a0bfb2ff65f3ee92127b3244e16b/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", size = 2316992, upload-time = "2025-11-04T13:43:43.602Z" }, + { url = "https://files.pythonhosted.org/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", size = 2145302, upload-time = "2025-11-04T13:43:46.64Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +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" } +wheels = [ + { 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" }, +] + +[[package]] +name = "pytest" +version = "9.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" }, +] + +[[package]] +name = "python-dotenv" +version = "1.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f0/26/19cadc79a718c5edbec86fd4919a6b6d3f681039a2f6d66d14be94e75fb9/python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6", size = 44221, upload-time = "2025-10-26T15:12:10.434Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/1b/a298b06749107c305e1fe0f814c6c74aea7b2f1e10989cb30f544a1b3253/python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61", size = 21230, upload-time = "2025-10-26T15:12:09.109Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "starlette" +version = "0.50.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/b8/73a0e6a6e079a9d9cfa64113d771e421640b6f679a52eeb9b32f72d871a1/starlette-0.50.0.tar.gz", hash = "sha256:a2a17b22203254bcbc2e1f926d2d55f3f9497f769416b3190768befe598fa3ca", size = 2646985, upload-time = "2025-11-01T15:25:27.516Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/52/1064f510b141bd54025f9b55105e26d1fa970b9be67ad766380a3c9b74b0/starlette-0.50.0-py3-none-any.whl", hash = "sha256:9e5391843ec9b6e472eed1365a78c8098cfceb7a74bfd4d6b1c0c0095efb3bca", size = 74033, upload-time = "2025-11-01T15:25:25.461Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +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" } +wheels = [ + { 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" }, +] + +[[package]] +name = "uvicorn" +version = "0.40.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c3/d1/8f3c683c9561a4e6689dd3b1d345c815f10f86acd044ee1fb9a4dcd0b8c5/uvicorn-0.40.0.tar.gz", hash = "sha256:839676675e87e73694518b5574fd0f24c9d97b46bea16df7b8c05ea1a51071ea", size = 81761, upload-time = "2025-12-21T14:16:22.45Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/d8/2083a1daa7439a66f3a48589a57d576aa117726762618f6bb09fe3798796/uvicorn-0.40.0-py3-none-any.whl", hash = "sha256:c6c8f55bc8bf13eb6fa9ff87ad62308bbbc33d0b67f84293151efe87e0d5f2ee", size = 68502, upload-time = "2025-12-21T14:16:21.041Z" }, +] + +[package.optional-dependencies] +standard = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "httptools" }, + { name = "python-dotenv" }, + { name = "pyyaml" }, + { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, + { name = "watchfiles" }, + { name = "websockets" }, +] + +[[package]] +name = "uvloop" +version = "0.22.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/06/f0/18d39dbd1971d6d62c4629cc7fa67f74821b0dc1f5a77af43719de7936a7/uvloop-0.22.1.tar.gz", hash = "sha256:6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f", size = 2443250, upload-time = "2025-10-16T22:17:19.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/d5/69900f7883235562f1f50d8184bb7dd84a2fb61e9ec63f3782546fdbd057/uvloop-0.22.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c60ebcd36f7b240b30788554b6f0782454826a0ed765d8430652621b5de674b9", size = 1352420, upload-time = "2025-10-16T22:16:21.187Z" }, + { url = "https://files.pythonhosted.org/packages/a8/73/c4e271b3bce59724e291465cc936c37758886a4868787da0278b3b56b905/uvloop-0.22.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b7f102bf3cb1995cfeaee9321105e8f5da76fdb104cdad8986f85461a1b7b77", size = 748677, upload-time = "2025-10-16T22:16:22.558Z" }, + { url = "https://files.pythonhosted.org/packages/86/94/9fb7fad2f824d25f8ecac0d70b94d0d48107ad5ece03769a9c543444f78a/uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53c85520781d84a4b8b230e24a5af5b0778efdb39142b424990ff1ef7c48ba21", size = 3753819, upload-time = "2025-10-16T22:16:23.903Z" }, + { url = "https://files.pythonhosted.org/packages/74/4f/256aca690709e9b008b7108bc85fba619a2bc37c6d80743d18abad16ee09/uvloop-0.22.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56a2d1fae65fd82197cb8c53c367310b3eabe1bbb9fb5a04d28e3e3520e4f702", size = 3804529, upload-time = "2025-10-16T22:16:25.246Z" }, + { url = "https://files.pythonhosted.org/packages/7f/74/03c05ae4737e871923d21a76fe28b6aad57f5c03b6e6bfcfa5ad616013e4/uvloop-0.22.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40631b049d5972c6755b06d0bfe8233b1bd9a8a6392d9d1c45c10b6f9e9b2733", size = 3621267, upload-time = "2025-10-16T22:16:26.819Z" }, + { url = "https://files.pythonhosted.org/packages/75/be/f8e590fe61d18b4a92070905497aec4c0e64ae1761498cad09023f3f4b3e/uvloop-0.22.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:535cc37b3a04f6cd2c1ef65fa1d370c9a35b6695df735fcff5427323f2cd5473", size = 3723105, upload-time = "2025-10-16T22:16:28.252Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ff/7f72e8170be527b4977b033239a83a68d5c881cc4775fca255c677f7ac5d/uvloop-0.22.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fe94b4564e865d968414598eea1a6de60adba0c040ba4ed05ac1300de402cd42", size = 1359936, upload-time = "2025-10-16T22:16:29.436Z" }, + { url = "https://files.pythonhosted.org/packages/c3/c6/e5d433f88fd54d81ef4be58b2b7b0cea13c442454a1db703a1eea0db1a59/uvloop-0.22.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:51eb9bd88391483410daad430813d982010f9c9c89512321f5b60e2cddbdddd6", size = 752769, upload-time = "2025-10-16T22:16:30.493Z" }, + { url = "https://files.pythonhosted.org/packages/24/68/a6ac446820273e71aa762fa21cdcc09861edd3536ff47c5cd3b7afb10eeb/uvloop-0.22.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:700e674a166ca5778255e0e1dc4e9d79ab2acc57b9171b79e65feba7184b3370", size = 4317413, upload-time = "2025-10-16T22:16:31.644Z" }, + { url = "https://files.pythonhosted.org/packages/5f/6f/e62b4dfc7ad6518e7eff2516f680d02a0f6eb62c0c212e152ca708a0085e/uvloop-0.22.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b5b1ac819a3f946d3b2ee07f09149578ae76066d70b44df3fa990add49a82e4", size = 4426307, upload-time = "2025-10-16T22:16:32.917Z" }, + { url = "https://files.pythonhosted.org/packages/90/60/97362554ac21e20e81bcef1150cb2a7e4ffdaf8ea1e5b2e8bf7a053caa18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e047cc068570bac9866237739607d1313b9253c3051ad84738cbb095be0537b2", size = 4131970, upload-time = "2025-10-16T22:16:34.015Z" }, + { url = "https://files.pythonhosted.org/packages/99/39/6b3f7d234ba3964c428a6e40006340f53ba37993f46ed6e111c6e9141d18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:512fec6815e2dd45161054592441ef76c830eddaad55c8aa30952e6fe1ed07c0", size = 4296343, upload-time = "2025-10-16T22:16:35.149Z" }, + { url = "https://files.pythonhosted.org/packages/89/8c/182a2a593195bfd39842ea68ebc084e20c850806117213f5a299dfc513d9/uvloop-0.22.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:561577354eb94200d75aca23fbde86ee11be36b00e52a4eaf8f50fb0c86b7705", size = 1358611, upload-time = "2025-10-16T22:16:36.833Z" }, + { url = "https://files.pythonhosted.org/packages/d2/14/e301ee96a6dc95224b6f1162cd3312f6d1217be3907b79173b06785f2fe7/uvloop-0.22.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cdf5192ab3e674ca26da2eada35b288d2fa49fdd0f357a19f0e7c4e7d5077c8", size = 751811, upload-time = "2025-10-16T22:16:38.275Z" }, + { url = "https://files.pythonhosted.org/packages/b7/02/654426ce265ac19e2980bfd9ea6590ca96a56f10c76e63801a2df01c0486/uvloop-0.22.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e2ea3d6190a2968f4a14a23019d3b16870dd2190cd69c8180f7c632d21de68d", size = 4288562, upload-time = "2025-10-16T22:16:39.375Z" }, + { url = "https://files.pythonhosted.org/packages/15/c0/0be24758891ef825f2065cd5db8741aaddabe3e248ee6acc5e8a80f04005/uvloop-0.22.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0530a5fbad9c9e4ee3f2b33b148c6a64d47bbad8000ea63704fa8260f4cf728e", size = 4366890, upload-time = "2025-10-16T22:16:40.547Z" }, + { url = "https://files.pythonhosted.org/packages/d2/53/8369e5219a5855869bcee5f4d317f6da0e2c669aecf0ef7d371e3d084449/uvloop-0.22.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bc5ef13bbc10b5335792360623cc378d52d7e62c2de64660616478c32cd0598e", size = 4119472, upload-time = "2025-10-16T22:16:41.694Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ba/d69adbe699b768f6b29a5eec7b47dd610bd17a69de51b251126a801369ea/uvloop-0.22.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1f38ec5e3f18c8a10ded09742f7fb8de0108796eb673f30ce7762ce1b8550cad", size = 4239051, upload-time = "2025-10-16T22:16:43.224Z" }, + { url = "https://files.pythonhosted.org/packages/90/cd/b62bdeaa429758aee8de8b00ac0dd26593a9de93d302bff3d21439e9791d/uvloop-0.22.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3879b88423ec7e97cd4eba2a443aa26ed4e59b45e6b76aabf13fe2f27023a142", size = 1362067, upload-time = "2025-10-16T22:16:44.503Z" }, + { url = "https://files.pythonhosted.org/packages/0d/f8/a132124dfda0777e489ca86732e85e69afcd1ff7686647000050ba670689/uvloop-0.22.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4baa86acedf1d62115c1dc6ad1e17134476688f08c6efd8a2ab076e815665c74", size = 752423, upload-time = "2025-10-16T22:16:45.968Z" }, + { url = "https://files.pythonhosted.org/packages/a3/94/94af78c156f88da4b3a733773ad5ba0b164393e357cc4bd0ab2e2677a7d6/uvloop-0.22.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:297c27d8003520596236bdb2335e6b3f649480bd09e00d1e3a99144b691d2a35", size = 4272437, upload-time = "2025-10-16T22:16:47.451Z" }, + { url = "https://files.pythonhosted.org/packages/b5/35/60249e9fd07b32c665192cec7af29e06c7cd96fa1d08b84f012a56a0b38e/uvloop-0.22.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1955d5a1dd43198244d47664a5858082a3239766a839b2102a269aaff7a4e25", size = 4292101, upload-time = "2025-10-16T22:16:49.318Z" }, + { url = "https://files.pythonhosted.org/packages/02/62/67d382dfcb25d0a98ce73c11ed1a6fba5037a1a1d533dcbb7cab033a2636/uvloop-0.22.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b31dc2fccbd42adc73bc4e7cdbae4fc5086cf378979e53ca5d0301838c5682c6", size = 4114158, upload-time = "2025-10-16T22:16:50.517Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/f1171b4a882a5d13c8b7576f348acfe6074d72eaf52cccef752f748d4a9f/uvloop-0.22.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:93f617675b2d03af4e72a5333ef89450dfaa5321303ede6e67ba9c9d26878079", size = 4177360, upload-time = "2025-10-16T22:16:52.646Z" }, + { url = "https://files.pythonhosted.org/packages/79/7b/b01414f31546caf0919da80ad57cbfe24c56b151d12af68cee1b04922ca8/uvloop-0.22.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:37554f70528f60cad66945b885eb01f1bb514f132d92b6eeed1c90fd54ed6289", size = 1454790, upload-time = "2025-10-16T22:16:54.355Z" }, + { url = "https://files.pythonhosted.org/packages/d4/31/0bb232318dd838cad3fa8fb0c68c8b40e1145b32025581975e18b11fab40/uvloop-0.22.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b76324e2dc033a0b2f435f33eb88ff9913c156ef78e153fb210e03c13da746b3", size = 796783, upload-time = "2025-10-16T22:16:55.906Z" }, + { url = "https://files.pythonhosted.org/packages/42/38/c9b09f3271a7a723a5de69f8e237ab8e7803183131bc57c890db0b6bb872/uvloop-0.22.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:badb4d8e58ee08dad957002027830d5c3b06aea446a6a3744483c2b3b745345c", size = 4647548, upload-time = "2025-10-16T22:16:57.008Z" }, + { url = "https://files.pythonhosted.org/packages/c1/37/945b4ca0ac27e3dc4952642d4c900edd030b3da6c9634875af6e13ae80e5/uvloop-0.22.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b91328c72635f6f9e0282e4a57da7470c7350ab1c9f48546c0f2866205349d21", size = 4467065, upload-time = "2025-10-16T22:16:58.206Z" }, + { url = "https://files.pythonhosted.org/packages/97/cc/48d232f33d60e2e2e0b42f4e73455b146b76ebe216487e862700457fbf3c/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:daf620c2995d193449393d6c62131b3fbd40a63bf7b307a1527856ace637fe88", size = 4328384, upload-time = "2025-10-16T22:16:59.36Z" }, + { url = "https://files.pythonhosted.org/packages/e4/16/c1fd27e9549f3c4baf1dc9c20c456cd2f822dbf8de9f463824b0c0357e06/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6cde23eeda1a25c75b2e07d39970f3374105d5eafbaab2a4482be82f272d5a5e", size = 4296730, upload-time = "2025-10-16T22:17:00.744Z" }, +] + +[[package]] +name = "watchfiles" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c2/c9/8869df9b2a2d6c59d79220a4db37679e74f807c559ffe5265e08b227a210/watchfiles-1.1.1.tar.gz", hash = "sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2", size = 94440, upload-time = "2025-10-14T15:06:21.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/f8/2c5f479fb531ce2f0564eda479faecf253d886b1ab3630a39b7bf7362d46/watchfiles-1.1.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f57b396167a2565a4e8b5e56a5a1c537571733992b226f4f1197d79e94cf0ae5", size = 406529, upload-time = "2025-10-14T15:04:32.899Z" }, + { url = "https://files.pythonhosted.org/packages/fe/cd/f515660b1f32f65df671ddf6f85bfaca621aee177712874dc30a97397977/watchfiles-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:421e29339983e1bebc281fab40d812742268ad057db4aee8c4d2bce0af43b741", size = 394384, upload-time = "2025-10-14T15:04:33.761Z" }, + { url = "https://files.pythonhosted.org/packages/7b/c3/28b7dc99733eab43fca2d10f55c86e03bd6ab11ca31b802abac26b23d161/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e43d39a741e972bab5d8100b5cdacf69db64e34eb19b6e9af162bccf63c5cc6", size = 448789, upload-time = "2025-10-14T15:04:34.679Z" }, + { url = "https://files.pythonhosted.org/packages/4a/24/33e71113b320030011c8e4316ccca04194bf0cbbaeee207f00cbc7d6b9f5/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f537afb3276d12814082a2e9b242bdcf416c2e8fd9f799a737990a1dbe906e5b", size = 460521, upload-time = "2025-10-14T15:04:35.963Z" }, + { url = "https://files.pythonhosted.org/packages/f4/c3/3c9a55f255aa57b91579ae9e98c88704955fa9dac3e5614fb378291155df/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2cd9e04277e756a2e2d2543d65d1e2166d6fd4c9b183f8808634fda23f17b14", size = 488722, upload-time = "2025-10-14T15:04:37.091Z" }, + { url = "https://files.pythonhosted.org/packages/49/36/506447b73eb46c120169dc1717fe2eff07c234bb3232a7200b5f5bd816e9/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f3f58818dc0b07f7d9aa7fe9eb1037aecb9700e63e1f6acfed13e9fef648f5d", size = 596088, upload-time = "2025-10-14T15:04:38.39Z" }, + { url = "https://files.pythonhosted.org/packages/82/ab/5f39e752a9838ec4d52e9b87c1e80f1ee3ccdbe92e183c15b6577ab9de16/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb9f66367023ae783551042d31b1d7fd422e8289eedd91f26754a66f44d5cff", size = 472923, upload-time = "2025-10-14T15:04:39.666Z" }, + { url = "https://files.pythonhosted.org/packages/af/b9/a419292f05e302dea372fa7e6fda5178a92998411f8581b9830d28fb9edb/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aebfd0861a83e6c3d1110b78ad54704486555246e542be3e2bb94195eabb2606", size = 456080, upload-time = "2025-10-14T15:04:40.643Z" }, + { url = "https://files.pythonhosted.org/packages/b0/c3/d5932fd62bde1a30c36e10c409dc5d54506726f08cb3e1d8d0ba5e2bc8db/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5fac835b4ab3c6487b5dbad78c4b3724e26bcc468e886f8ba8cc4306f68f6701", size = 629432, upload-time = "2025-10-14T15:04:41.789Z" }, + { url = "https://files.pythonhosted.org/packages/f7/77/16bddd9779fafb795f1a94319dc965209c5641db5bf1edbbccace6d1b3c0/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:399600947b170270e80134ac854e21b3ccdefa11a9529a3decc1327088180f10", size = 623046, upload-time = "2025-10-14T15:04:42.718Z" }, + { url = "https://files.pythonhosted.org/packages/46/ef/f2ecb9a0f342b4bfad13a2787155c6ee7ce792140eac63a34676a2feeef2/watchfiles-1.1.1-cp311-cp311-win32.whl", hash = "sha256:de6da501c883f58ad50db3a32ad397b09ad29865b5f26f64c24d3e3281685849", size = 271473, upload-time = "2025-10-14T15:04:43.624Z" }, + { url = "https://files.pythonhosted.org/packages/94/bc/f42d71125f19731ea435c3948cad148d31a64fccde3867e5ba4edee901f9/watchfiles-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:35c53bd62a0b885bf653ebf6b700d1bf05debb78ad9292cf2a942b23513dc4c4", size = 287598, upload-time = "2025-10-14T15:04:44.516Z" }, + { url = "https://files.pythonhosted.org/packages/57/c9/a30f897351f95bbbfb6abcadafbaca711ce1162f4db95fc908c98a9165f3/watchfiles-1.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:57ca5281a8b5e27593cb7d82c2ac927ad88a96ed406aa446f6344e4328208e9e", size = 277210, upload-time = "2025-10-14T15:04:45.883Z" }, + { url = "https://files.pythonhosted.org/packages/74/d5/f039e7e3c639d9b1d09b07ea412a6806d38123f0508e5f9b48a87b0a76cc/watchfiles-1.1.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8c89f9f2f740a6b7dcc753140dd5e1ab9215966f7a3530d0c0705c83b401bd7d", size = 404745, upload-time = "2025-10-14T15:04:46.731Z" }, + { url = "https://files.pythonhosted.org/packages/a5/96/a881a13aa1349827490dab2d363c8039527060cfcc2c92cc6d13d1b1049e/watchfiles-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd404be08018c37350f0d6e34676bd1e2889990117a2b90070b3007f172d0610", size = 391769, upload-time = "2025-10-14T15:04:48.003Z" }, + { url = "https://files.pythonhosted.org/packages/4b/5b/d3b460364aeb8da471c1989238ea0e56bec24b6042a68046adf3d9ddb01c/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8526e8f916bb5b9a0a777c8317c23ce65de259422bba5b31325a6fa6029d33af", size = 449374, upload-time = "2025-10-14T15:04:49.179Z" }, + { url = "https://files.pythonhosted.org/packages/b9/44/5769cb62d4ed055cb17417c0a109a92f007114a4e07f30812a73a4efdb11/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2edc3553362b1c38d9f06242416a5d8e9fe235c204a4072e988ce2e5bb1f69f6", size = 459485, upload-time = "2025-10-14T15:04:50.155Z" }, + { url = "https://files.pythonhosted.org/packages/19/0c/286b6301ded2eccd4ffd0041a1b726afda999926cf720aab63adb68a1e36/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30f7da3fb3f2844259cba4720c3fc7138eb0f7b659c38f3bfa65084c7fc7abce", size = 488813, upload-time = "2025-10-14T15:04:51.059Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2b/8530ed41112dd4a22f4dcfdb5ccf6a1baad1ff6eed8dc5a5f09e7e8c41c7/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8979280bdafff686ba5e4d8f97840f929a87ed9cdf133cbbd42f7766774d2aa", size = 594816, upload-time = "2025-10-14T15:04:52.031Z" }, + { url = "https://files.pythonhosted.org/packages/ce/d2/f5f9fb49489f184f18470d4f99f4e862a4b3e9ac2865688eb2099e3d837a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcc5c24523771db3a294c77d94771abcfcb82a0e0ee8efd910c37c59ec1b31bb", size = 475186, upload-time = "2025-10-14T15:04:53.064Z" }, + { url = "https://files.pythonhosted.org/packages/cf/68/5707da262a119fb06fbe214d82dd1fe4a6f4af32d2d14de368d0349eb52a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db5d7ae38ff20153d542460752ff397fcf5c96090c1230803713cf3147a6803", size = 456812, upload-time = "2025-10-14T15:04:55.174Z" }, + { url = "https://files.pythonhosted.org/packages/66/ab/3cbb8756323e8f9b6f9acb9ef4ec26d42b2109bce830cc1f3468df20511d/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:28475ddbde92df1874b6c5c8aaeb24ad5be47a11f87cde5a28ef3835932e3e94", size = 630196, upload-time = "2025-10-14T15:04:56.22Z" }, + { url = "https://files.pythonhosted.org/packages/78/46/7152ec29b8335f80167928944a94955015a345440f524d2dfe63fc2f437b/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:36193ed342f5b9842edd3532729a2ad55c4160ffcfa3700e0d54be496b70dd43", size = 622657, upload-time = "2025-10-14T15:04:57.521Z" }, + { url = "https://files.pythonhosted.org/packages/0a/bf/95895e78dd75efe9a7f31733607f384b42eb5feb54bd2eb6ed57cc2e94f4/watchfiles-1.1.1-cp312-cp312-win32.whl", hash = "sha256:859e43a1951717cc8de7f4c77674a6d389b106361585951d9e69572823f311d9", size = 272042, upload-time = "2025-10-14T15:04:59.046Z" }, + { url = "https://files.pythonhosted.org/packages/87/0a/90eb755f568de2688cb220171c4191df932232c20946966c27a59c400850/watchfiles-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:91d4c9a823a8c987cce8fa2690923b069966dabb196dd8d137ea2cede885fde9", size = 288410, upload-time = "2025-10-14T15:05:00.081Z" }, + { url = "https://files.pythonhosted.org/packages/36/76/f322701530586922fbd6723c4f91ace21364924822a8772c549483abed13/watchfiles-1.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:a625815d4a2bdca61953dbba5a39d60164451ef34c88d751f6c368c3ea73d404", size = 278209, upload-time = "2025-10-14T15:05:01.168Z" }, + { url = "https://files.pythonhosted.org/packages/bb/f4/f750b29225fe77139f7ae5de89d4949f5a99f934c65a1f1c0b248f26f747/watchfiles-1.1.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:130e4876309e8686a5e37dba7d5e9bc77e6ed908266996ca26572437a5271e18", size = 404321, upload-time = "2025-10-14T15:05:02.063Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f9/f07a295cde762644aa4c4bb0f88921d2d141af45e735b965fb2e87858328/watchfiles-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f3bde70f157f84ece3765b42b4a52c6ac1a50334903c6eaf765362f6ccca88a", size = 391783, upload-time = "2025-10-14T15:05:03.052Z" }, + { url = "https://files.pythonhosted.org/packages/bc/11/fc2502457e0bea39a5c958d86d2cb69e407a4d00b85735ca724bfa6e0d1a/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e0b1fe858430fc0251737ef3824c54027bedb8c37c38114488b8e131cf8219", size = 449279, upload-time = "2025-10-14T15:05:04.004Z" }, + { url = "https://files.pythonhosted.org/packages/e3/1f/d66bc15ea0b728df3ed96a539c777acfcad0eb78555ad9efcaa1274688f0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f27db948078f3823a6bb3b465180db8ebecf26dd5dae6f6180bd87383b6b4428", size = 459405, upload-time = "2025-10-14T15:05:04.942Z" }, + { url = "https://files.pythonhosted.org/packages/be/90/9f4a65c0aec3ccf032703e6db02d89a157462fbb2cf20dd415128251cac0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:059098c3a429f62fc98e8ec62b982230ef2c8df68c79e826e37b895bc359a9c0", size = 488976, upload-time = "2025-10-14T15:05:05.905Z" }, + { url = "https://files.pythonhosted.org/packages/37/57/ee347af605d867f712be7029bb94c8c071732a4b44792e3176fa3c612d39/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfb5862016acc9b869bb57284e6cb35fdf8e22fe59f7548858e2f971d045f150", size = 595506, upload-time = "2025-10-14T15:05:06.906Z" }, + { url = "https://files.pythonhosted.org/packages/a8/78/cc5ab0b86c122047f75e8fc471c67a04dee395daf847d3e59381996c8707/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:319b27255aacd9923b8a276bb14d21a5f7ff82564c744235fc5eae58d95422ae", size = 474936, upload-time = "2025-10-14T15:05:07.906Z" }, + { url = "https://files.pythonhosted.org/packages/62/da/def65b170a3815af7bd40a3e7010bf6ab53089ef1b75d05dd5385b87cf08/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c755367e51db90e75b19454b680903631d41f9e3607fbd941d296a020c2d752d", size = 456147, upload-time = "2025-10-14T15:05:09.138Z" }, + { url = "https://files.pythonhosted.org/packages/57/99/da6573ba71166e82d288d4df0839128004c67d2778d3b566c138695f5c0b/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c22c776292a23bfc7237a98f791b9ad3144b02116ff10d820829ce62dff46d0b", size = 630007, upload-time = "2025-10-14T15:05:10.117Z" }, + { url = "https://files.pythonhosted.org/packages/a8/51/7439c4dd39511368849eb1e53279cd3454b4a4dbace80bab88feeb83c6b5/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3a476189be23c3686bc2f4321dd501cb329c0a0469e77b7b534ee10129ae6374", size = 622280, upload-time = "2025-10-14T15:05:11.146Z" }, + { url = "https://files.pythonhosted.org/packages/95/9c/8ed97d4bba5db6fdcdb2b298d3898f2dd5c20f6b73aee04eabe56c59677e/watchfiles-1.1.1-cp313-cp313-win32.whl", hash = "sha256:bf0a91bfb5574a2f7fc223cf95eeea79abfefa404bf1ea5e339c0c1560ae99a0", size = 272056, upload-time = "2025-10-14T15:05:12.156Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f3/c14e28429f744a260d8ceae18bf58c1d5fa56b50d006a7a9f80e1882cb0d/watchfiles-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:52e06553899e11e8074503c8e716d574adeeb7e68913115c4b3653c53f9bae42", size = 288162, upload-time = "2025-10-14T15:05:13.208Z" }, + { url = "https://files.pythonhosted.org/packages/dc/61/fe0e56c40d5cd29523e398d31153218718c5786b5e636d9ae8ae79453d27/watchfiles-1.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:ac3cc5759570cd02662b15fbcd9d917f7ecd47efe0d6b40474eafd246f91ea18", size = 277909, upload-time = "2025-10-14T15:05:14.49Z" }, + { url = "https://files.pythonhosted.org/packages/79/42/e0a7d749626f1e28c7108a99fb9bf524b501bbbeb9b261ceecde644d5a07/watchfiles-1.1.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:563b116874a9a7ce6f96f87cd0b94f7faf92d08d0021e837796f0a14318ef8da", size = 403389, upload-time = "2025-10-14T15:05:15.777Z" }, + { url = "https://files.pythonhosted.org/packages/15/49/08732f90ce0fbbc13913f9f215c689cfc9ced345fb1bcd8829a50007cc8d/watchfiles-1.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3ad9fe1dae4ab4212d8c91e80b832425e24f421703b5a42ef2e4a1e215aff051", size = 389964, upload-time = "2025-10-14T15:05:16.85Z" }, + { url = "https://files.pythonhosted.org/packages/27/0d/7c315d4bd5f2538910491a0393c56bf70d333d51bc5b34bee8e68e8cea19/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce70f96a46b894b36eba678f153f052967a0d06d5b5a19b336ab0dbbd029f73e", size = 448114, upload-time = "2025-10-14T15:05:17.876Z" }, + { url = "https://files.pythonhosted.org/packages/c3/24/9e096de47a4d11bc4df41e9d1e61776393eac4cb6eb11b3e23315b78b2cc/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cb467c999c2eff23a6417e58d75e5828716f42ed8289fe6b77a7e5a91036ca70", size = 460264, upload-time = "2025-10-14T15:05:18.962Z" }, + { url = "https://files.pythonhosted.org/packages/cc/0f/e8dea6375f1d3ba5fcb0b3583e2b493e77379834c74fd5a22d66d85d6540/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:836398932192dae4146c8f6f737d74baeac8b70ce14831a239bdb1ca882fc261", size = 487877, upload-time = "2025-10-14T15:05:20.094Z" }, + { url = "https://files.pythonhosted.org/packages/ac/5b/df24cfc6424a12deb41503b64d42fbea6b8cb357ec62ca84a5a3476f654a/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:743185e7372b7bc7c389e1badcc606931a827112fbbd37f14c537320fca08620", size = 595176, upload-time = "2025-10-14T15:05:21.134Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b5/853b6757f7347de4e9b37e8cc3289283fb983cba1ab4d2d7144694871d9c/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afaeff7696e0ad9f02cbb8f56365ff4686ab205fcf9c4c5b6fdfaaa16549dd04", size = 473577, upload-time = "2025-10-14T15:05:22.306Z" }, + { url = "https://files.pythonhosted.org/packages/e1/f7/0a4467be0a56e80447c8529c9fce5b38eab4f513cb3d9bf82e7392a5696b/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7eb7da0eb23aa2ba036d4f616d46906013a68caf61b7fdbe42fc8b25132e77", size = 455425, upload-time = "2025-10-14T15:05:23.348Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e0/82583485ea00137ddf69bc84a2db88bd92ab4a6e3c405e5fb878ead8d0e7/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:831a62658609f0e5c64178211c942ace999517f5770fe9436be4c2faeba0c0ef", size = 628826, upload-time = "2025-10-14T15:05:24.398Z" }, + { url = "https://files.pythonhosted.org/packages/28/9a/a785356fccf9fae84c0cc90570f11702ae9571036fb25932f1242c82191c/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f9a2ae5c91cecc9edd47e041a930490c31c3afb1f5e6d71de3dc671bfaca02bf", size = 622208, upload-time = "2025-10-14T15:05:25.45Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f4/0872229324ef69b2c3edec35e84bd57a1289e7d3fe74588048ed8947a323/watchfiles-1.1.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:d1715143123baeeaeadec0528bb7441103979a1d5f6fd0e1f915383fea7ea6d5", size = 404315, upload-time = "2025-10-14T15:05:26.501Z" }, + { url = "https://files.pythonhosted.org/packages/7b/22/16d5331eaed1cb107b873f6ae1b69e9ced582fcf0c59a50cd84f403b1c32/watchfiles-1.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:39574d6370c4579d7f5d0ad940ce5b20db0e4117444e39b6d8f99db5676c52fd", size = 390869, upload-time = "2025-10-14T15:05:27.649Z" }, + { url = "https://files.pythonhosted.org/packages/b2/7e/5643bfff5acb6539b18483128fdc0ef2cccc94a5b8fbda130c823e8ed636/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7365b92c2e69ee952902e8f70f3ba6360d0d596d9299d55d7d386df84b6941fb", size = 449919, upload-time = "2025-10-14T15:05:28.701Z" }, + { url = "https://files.pythonhosted.org/packages/51/2e/c410993ba5025a9f9357c376f48976ef0e1b1aefb73b97a5ae01a5972755/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bfff9740c69c0e4ed32416f013f3c45e2ae42ccedd1167ef2d805c000b6c71a5", size = 460845, upload-time = "2025-10-14T15:05:30.064Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a4/2df3b404469122e8680f0fcd06079317e48db58a2da2950fb45020947734/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b27cf2eb1dda37b2089e3907d8ea92922b673c0c427886d4edc6b94d8dfe5db3", size = 489027, upload-time = "2025-10-14T15:05:31.064Z" }, + { url = "https://files.pythonhosted.org/packages/ea/84/4587ba5b1f267167ee715b7f66e6382cca6938e0a4b870adad93e44747e6/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:526e86aced14a65a5b0ec50827c745597c782ff46b571dbfe46192ab9e0b3c33", size = 595615, upload-time = "2025-10-14T15:05:32.074Z" }, + { url = "https://files.pythonhosted.org/packages/6a/0f/c6988c91d06e93cd0bb3d4a808bcf32375ca1904609835c3031799e3ecae/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04e78dd0b6352db95507fd8cb46f39d185cf8c74e4cf1e4fbad1d3df96faf510", size = 474836, upload-time = "2025-10-14T15:05:33.209Z" }, + { url = "https://files.pythonhosted.org/packages/b4/36/ded8aebea91919485b7bbabbd14f5f359326cb5ec218cd67074d1e426d74/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c85794a4cfa094714fb9c08d4a218375b2b95b8ed1666e8677c349906246c05", size = 455099, upload-time = "2025-10-14T15:05:34.189Z" }, + { url = "https://files.pythonhosted.org/packages/98/e0/8c9bdba88af756a2fce230dd365fab2baf927ba42cd47521ee7498fd5211/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:74d5012b7630714b66be7b7b7a78855ef7ad58e8650c73afc4c076a1f480a8d6", size = 630626, upload-time = "2025-10-14T15:05:35.216Z" }, + { url = "https://files.pythonhosted.org/packages/2a/84/a95db05354bf2d19e438520d92a8ca475e578c647f78f53197f5a2f17aaf/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:8fbe85cb3201c7d380d3d0b90e63d520f15d6afe217165d7f98c9c649654db81", size = 622519, upload-time = "2025-10-14T15:05:36.259Z" }, + { url = "https://files.pythonhosted.org/packages/1d/ce/d8acdc8de545de995c339be67711e474c77d643555a9bb74a9334252bd55/watchfiles-1.1.1-cp314-cp314-win32.whl", hash = "sha256:3fa0b59c92278b5a7800d3ee7733da9d096d4aabcfabb9a928918bd276ef9b9b", size = 272078, upload-time = "2025-10-14T15:05:37.63Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c9/a74487f72d0451524be827e8edec251da0cc1fcf111646a511ae752e1a3d/watchfiles-1.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:c2047d0b6cea13b3316bdbafbfa0c4228ae593d995030fda39089d36e64fc03a", size = 287664, upload-time = "2025-10-14T15:05:38.95Z" }, + { url = "https://files.pythonhosted.org/packages/df/b8/8ac000702cdd496cdce998c6f4ee0ca1f15977bba51bdf07d872ebdfc34c/watchfiles-1.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:842178b126593addc05acf6fce960d28bc5fae7afbaa2c6c1b3a7b9460e5be02", size = 277154, upload-time = "2025-10-14T15:05:39.954Z" }, + { url = "https://files.pythonhosted.org/packages/47/a8/e3af2184707c29f0f14b1963c0aace6529f9d1b8582d5b99f31bbf42f59e/watchfiles-1.1.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:88863fbbc1a7312972f1c511f202eb30866370ebb8493aef2812b9ff28156a21", size = 403820, upload-time = "2025-10-14T15:05:40.932Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ec/e47e307c2f4bd75f9f9e8afbe3876679b18e1bcec449beca132a1c5ffb2d/watchfiles-1.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:55c7475190662e202c08c6c0f4d9e345a29367438cf8e8037f3155e10a88d5a5", size = 390510, upload-time = "2025-10-14T15:05:41.945Z" }, + { url = "https://files.pythonhosted.org/packages/d5/a0/ad235642118090f66e7b2f18fd5c42082418404a79205cdfca50b6309c13/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f53fa183d53a1d7a8852277c92b967ae99c2d4dcee2bfacff8868e6e30b15f7", size = 448408, upload-time = "2025-10-14T15:05:43.385Z" }, + { url = "https://files.pythonhosted.org/packages/df/85/97fa10fd5ff3332ae17e7e40e20784e419e28521549780869f1413742e9d/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6aae418a8b323732fa89721d86f39ec8f092fc2af67f4217a2b07fd3e93c6101", size = 458968, upload-time = "2025-10-14T15:05:44.404Z" }, + { url = "https://files.pythonhosted.org/packages/47/c2/9059c2e8966ea5ce678166617a7f75ecba6164375f3b288e50a40dc6d489/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f096076119da54a6080e8920cbdaac3dbee667eb91dcc5e5b78840b87415bd44", size = 488096, upload-time = "2025-10-14T15:05:45.398Z" }, + { url = "https://files.pythonhosted.org/packages/94/44/d90a9ec8ac309bc26db808a13e7bfc0e4e78b6fc051078a554e132e80160/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00485f441d183717038ed2e887a7c868154f216877653121068107b227a2f64c", size = 596040, upload-time = "2025-10-14T15:05:46.502Z" }, + { url = "https://files.pythonhosted.org/packages/95/68/4e3479b20ca305cfc561db3ed207a8a1c745ee32bf24f2026a129d0ddb6e/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a55f3e9e493158d7bfdb60a1165035f1cf7d320914e7b7ea83fe22c6023b58fc", size = 473847, upload-time = "2025-10-14T15:05:47.484Z" }, + { url = "https://files.pythonhosted.org/packages/4f/55/2af26693fd15165c4ff7857e38330e1b61ab8c37d15dc79118cdba115b7a/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c91ed27800188c2ae96d16e3149f199d62f86c7af5f5f4d2c61a3ed8cd3666c", size = 455072, upload-time = "2025-10-14T15:05:48.928Z" }, + { url = "https://files.pythonhosted.org/packages/66/1d/d0d200b10c9311ec25d2273f8aad8c3ef7cc7ea11808022501811208a750/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:311ff15a0bae3714ffb603e6ba6dbfba4065ab60865d15a6ec544133bdb21099", size = 629104, upload-time = "2025-10-14T15:05:49.908Z" }, + { url = "https://files.pythonhosted.org/packages/e3/bd/fa9bb053192491b3867ba07d2343d9f2252e00811567d30ae8d0f78136fe/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a916a2932da8f8ab582f242c065f5c81bed3462849ca79ee357dd9551b0e9b01", size = 622112, upload-time = "2025-10-14T15:05:50.941Z" }, + { url = "https://files.pythonhosted.org/packages/d3/8e/e500f8b0b77be4ff753ac94dc06b33d8f0d839377fee1b78e8c8d8f031bf/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:db476ab59b6765134de1d4fe96a1a9c96ddf091683599be0f26147ea1b2e4b88", size = 408250, upload-time = "2025-10-14T15:06:10.264Z" }, + { url = "https://files.pythonhosted.org/packages/bd/95/615e72cd27b85b61eec764a5ca51bd94d40b5adea5ff47567d9ebc4d275a/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89eef07eee5e9d1fda06e38822ad167a044153457e6fd997f8a858ab7564a336", size = 396117, upload-time = "2025-10-14T15:06:11.28Z" }, + { url = "https://files.pythonhosted.org/packages/c9/81/e7fe958ce8a7fb5c73cc9fb07f5aeaf755e6aa72498c57d760af760c91f8/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce19e06cbda693e9e7686358af9cd6f5d61312ab8b00488bc36f5aabbaf77e24", size = 450493, upload-time = "2025-10-14T15:06:12.321Z" }, + { url = "https://files.pythonhosted.org/packages/6e/d4/ed38dd3b1767193de971e694aa544356e63353c33a85d948166b5ff58b9e/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e6f39af2eab0118338902798b5aa6664f46ff66bc0280de76fca67a7f262a49", size = 457546, upload-time = "2025-10-14T15:06:13.372Z" }, +] + +[[package]] +name = "websockets" +version = "15.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/32/18fcd5919c293a398db67443acd33fde142f283853076049824fc58e6f75/websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", size = 175423, upload-time = "2025-03-05T20:01:56.276Z" }, + { url = "https://files.pythonhosted.org/packages/76/70/ba1ad96b07869275ef42e2ce21f07a5b0148936688c2baf7e4a1f60d5058/websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", size = 173082, upload-time = "2025-03-05T20:01:57.563Z" }, + { url = "https://files.pythonhosted.org/packages/86/f2/10b55821dd40eb696ce4704a87d57774696f9451108cff0d2824c97e0f97/websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", size = 173330, upload-time = "2025-03-05T20:01:59.063Z" }, + { url = "https://files.pythonhosted.org/packages/a5/90/1c37ae8b8a113d3daf1065222b6af61cc44102da95388ac0018fcb7d93d9/websockets-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562", size = 182878, upload-time = "2025-03-05T20:02:00.305Z" }, + { url = "https://files.pythonhosted.org/packages/8e/8d/96e8e288b2a41dffafb78e8904ea7367ee4f891dafc2ab8d87e2124cb3d3/websockets-15.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792", size = 181883, upload-time = "2025-03-05T20:02:03.148Z" }, + { url = "https://files.pythonhosted.org/packages/93/1f/5d6dbf551766308f6f50f8baf8e9860be6182911e8106da7a7f73785f4c4/websockets-15.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413", size = 182252, upload-time = "2025-03-05T20:02:05.29Z" }, + { url = "https://files.pythonhosted.org/packages/d4/78/2d4fed9123e6620cbf1706c0de8a1632e1a28e7774d94346d7de1bba2ca3/websockets-15.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8", size = 182521, upload-time = "2025-03-05T20:02:07.458Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3b/66d4c1b444dd1a9823c4a81f50231b921bab54eee2f69e70319b4e21f1ca/websockets-15.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3", size = 181958, upload-time = "2025-03-05T20:02:09.842Z" }, + { url = "https://files.pythonhosted.org/packages/08/ff/e9eed2ee5fed6f76fdd6032ca5cd38c57ca9661430bb3d5fb2872dc8703c/websockets-15.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf", size = 181918, upload-time = "2025-03-05T20:02:11.968Z" }, + { url = "https://files.pythonhosted.org/packages/d8/75/994634a49b7e12532be6a42103597b71098fd25900f7437d6055ed39930a/websockets-15.0.1-cp311-cp311-win32.whl", hash = "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85", size = 176388, upload-time = "2025-03-05T20:02:13.32Z" }, + { url = "https://files.pythonhosted.org/packages/98/93/e36c73f78400a65f5e236cd376713c34182e6663f6889cd45a4a04d8f203/websockets-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065", size = 176828, upload-time = "2025-03-05T20:02:14.585Z" }, + { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437, upload-time = "2025-03-05T20:02:16.706Z" }, + { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096, upload-time = "2025-03-05T20:02:18.832Z" }, + { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332, upload-time = "2025-03-05T20:02:20.187Z" }, + { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152, upload-time = "2025-03-05T20:02:22.286Z" }, + { url = "https://files.pythonhosted.org/packages/74/45/c205c8480eafd114b428284840da0b1be9ffd0e4f87338dc95dc6ff961a1/websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", size = 182096, upload-time = "2025-03-05T20:02:24.368Z" }, + { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523, upload-time = "2025-03-05T20:02:25.669Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790, upload-time = "2025-03-05T20:02:26.99Z" }, + { url = "https://files.pythonhosted.org/packages/02/05/c68c5adbf679cf610ae2f74a9b871ae84564462955d991178f95a1ddb7dd/websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", size = 182165, upload-time = "2025-03-05T20:02:30.291Z" }, + { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160, upload-time = "2025-03-05T20:02:31.634Z" }, + { url = "https://files.pythonhosted.org/packages/ff/83/de1f7709376dc3ca9b7eeb4b9a07b4526b14876b6d372a4dc62312bebee0/websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", size = 176395, upload-time = "2025-03-05T20:02:33.017Z" }, + { url = "https://files.pythonhosted.org/packages/7d/71/abf2ebc3bbfa40f391ce1428c7168fb20582d0ff57019b69ea20fa698043/websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7", size = 176841, upload-time = "2025-03-05T20:02:34.498Z" }, + { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload-time = "2025-03-05T20:02:36.695Z" }, + { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload-time = "2025-03-05T20:02:37.985Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload-time = "2025-03-05T20:02:39.298Z" }, + { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload-time = "2025-03-05T20:02:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload-time = "2025-03-05T20:02:41.926Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload-time = "2025-03-05T20:02:43.304Z" }, + { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload-time = "2025-03-05T20:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload-time = "2025-03-05T20:02:50.14Z" }, + { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload-time = "2025-03-05T20:02:51.561Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload-time = "2025-03-05T20:02:53.814Z" }, + { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload-time = "2025-03-05T20:02:55.237Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" }, +] diff --git a/skills/whoopskill/SKILL.md b/skills/whoopskill/SKILL.md new file mode 100644 index 000000000..5965ac25c --- /dev/null +++ b/skills/whoopskill/SKILL.md @@ -0,0 +1,102 @@ +--- +name: whoopskill +description: WHOOP health data CLI - sleep, recovery, strain, workouts via OAuth2. +homepage: https://github.com/koala73/whoopskill +metadata: {"clawdbot":{"emoji":"💪","requires":{"bins":["whoopskill"],"env":["WHOOP_CLIENT_ID","WHOOP_CLIENT_SECRET","WHOOP_REDIRECT_URI"]}}} +--- + +# whoopskill + +CLI for fetching WHOOP health data (sleep, recovery, strain, workouts). + +## Setup + +1. Create a WHOOP developer app at https://developer.whoop.com +2. Set environment variables: + ```bash + export WHOOP_CLIENT_ID=your_client_id + export WHOOP_CLIENT_SECRET=your_client_secret + export WHOOP_REDIRECT_URI=https://your-callback-url + ``` +3. Install: `npm install -g whoopskill` +4. Login: `whoopskill auth login` + +## Commands + +### Authentication +```bash +whoopskill auth login # OAuth login flow +whoopskill auth logout # Clear tokens +whoopskill auth status # Check token status (shows expiry) +whoopskill auth refresh # Proactively refresh token (for cron jobs) +``` + +### Data Fetching +```bash +whoopskill sleep --pretty --limit 7 # Last 7 sleep records +whoopskill recovery --pretty # Today's recovery +whoopskill workout --pretty --limit 5 # Recent workouts +whoopskill cycle --pretty # Current cycle (strain) +whoopskill summary # One-liner snapshot +whoopskill profile # User profile +whoopskill body # Body measurements +``` + +### Options +- `-d, --date ` — Specific date +- `-l, --limit ` — Max results (default: 25) +- `-a, --all` — Fetch all pages +- `-p, --pretty` — Human-readable output + +## Token Refresh (Important!) + +WHOOP access tokens expire in **1 hour**. The CLI auto-refreshes when making API calls, but if you don't use it for a while, the **refresh token can also expire** (typically 7-30 days). + +### Best Practice: Keep Tokens Fresh +Set up a cron job to refresh tokens regularly: + +```bash +# Every 30 minutes - runs an API call which triggers auto-refresh +*/30 * * * * WHOOP_CLIENT_ID=xxx WHOOP_CLIENT_SECRET=yyy whoopskill cycle --limit 1 > /dev/null 2>&1 +``` + +Or use the explicit refresh command: +```bash +*/30 * * * * WHOOP_CLIENT_ID=xxx WHOOP_CLIENT_SECRET=yyy whoopskill auth refresh > /dev/null 2>&1 +``` + +### If Refresh Token Expires +You'll need to re-authenticate: +```bash +whoopskill auth login +``` + +## Example Outputs + +### Summary +``` +2026-01-07 | Recovery: 68% | Sleep: 74% | Strain: 6.8 | Workouts: 1 +``` + +### Sleep (pretty) +``` +Date: 2026-01-07 +Performance: 74% +Duration: 6h 16m +Efficiency: 86% +Stages: + - Light: 3h 7m + - Deep: 1h 28m + - REM: 1h 41m +Disturbances: 2 +``` + +## Token Storage + +Tokens are stored in `~/.whoop-cli/tokens.json` with 600 permissions. + +## Troubleshooting + +**"Missing WHOOP_CLIENT_ID..."** — Set env vars before running +**"Token refresh failed"** — Refresh token expired, run `whoopskill auth login` +**Empty data** — WHOOP API may be delayed; data syncs from device periodically diff --git a/src/agents/pi-embedded-runner.ts b/src/agents/pi-embedded-runner.ts index ad4eafd57..cc850848e 100644 --- a/src/agents/pi-embedded-runner.ts +++ b/src/agents/pi-embedded-runner.ts @@ -758,6 +758,7 @@ export async function compactEmbeddedPiSession(params: { enqueue?: typeof enqueueCommand; extraSystemPrompt?: string; ownerNumbers?: string[]; + serveBaseUrl?: string; }): Promise { const sessionLane = resolveSessionLane( params.sessionKey?.trim() || params.sessionId, diff --git a/src/agents/pi-tools.ts b/src/agents/pi-tools.ts index f78d9e248..5efac526b 100644 --- a/src/agents/pi-tools.ts +++ b/src/agents/pi-tools.ts @@ -508,6 +508,7 @@ export function createClawdbotCodingTools(options?: { sessionKey?: string; agentDir?: string; config?: ClawdbotConfig; + serveBaseUrl?: string; }): AnyAgentTool[] { const bashToolName = "bash"; const sandbox = options?.sandbox?.enabled ? options.sandbox : undefined; diff --git a/src/agents/tools/serve-tool.ts b/src/agents/tools/serve-tool.ts index 05bec1d7f..3d1c2619e 100644 --- a/src/agents/tools/serve-tool.ts +++ b/src/agents/tools/serve-tool.ts @@ -57,7 +57,7 @@ export function createServeTool(opts?: { baseUrl?: string }): AnyAgentTool { const baseUrl = await resolveServeBaseUrl(opts?.baseUrl); const result = serveCreate( - { path: filePath, slug, title, description, ttl, ogImage }, + { path: filePath, slug: slug || "file", title: title || "", description: description || "", ttl, ogImage }, baseUrl, ); return jsonResult(result); From da2323f80ebc7d4047d97aebf137dae9f2db479c Mon Sep 17 00:00:00 2001 From: Elie Habib Date: Thu, 8 Jan 2026 06:43:31 +0000 Subject: [PATCH 3/5] docs: add gateway restart guide --- docs/gateway/restart.md | 174 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 docs/gateway/restart.md diff --git a/docs/gateway/restart.md b/docs/gateway/restart.md new file mode 100644 index 000000000..ab06fcca8 --- /dev/null +++ b/docs/gateway/restart.md @@ -0,0 +1,174 @@ +# Restarting the Clawdbot Gateway + +This guide covers how to properly restart the Clawdbot gateway service on different platforms. + +## Linux (systemd) + +The gateway runs as a systemd user service on Linux servers. + +### Quick Restart + +```bash +systemctl --user restart clawdbot-gateway.service +``` + +### Full Reload (after code updates) + +When you update the codebase (git pull, rebase, etc.), follow these steps: + +```bash +# 1. Stop the service +systemctl --user stop clawdbot-gateway.service + +# 2. Kill any stray gateway processes +pkill -f "gateway.*18789" + +# 3. Reload systemd configuration (if service file changed) +systemctl --user daemon-reload + +# 4. Start the service +systemctl --user start clawdbot-gateway.service + +# 5. Verify it's running +systemctl --user status clawdbot-gateway.service +``` + +### Reinstall Service (after major updates) + +If the gateway command changed or you're having persistent issues: + +```bash +# Uninstall old service +pnpm clawdbot daemon uninstall + +# Reinstall with latest configuration +pnpm clawdbot daemon install + +# Reload and start +systemctl --user daemon-reload +systemctl --user start clawdbot-gateway.service +``` + +### Check Logs + +```bash +# Follow live logs +journalctl --user -u clawdbot-gateway.service -f + +# View recent logs +journalctl --user -u clawdbot-gateway.service -n 50 + +# View logs since last boot +journalctl --user -u clawdbot-gateway.service --boot +``` + +### Common Issues + +**Port already in use:** +```bash +# Find process using port 18789 +lsof -i :18789 + +# Kill specific process +kill -9 +``` + +**Service keeps restarting:** +```bash +# Check for error details +journalctl --user -u clawdbot-gateway.service --since "5 minutes ago" | grep -i error + +# Verify service file is correct +cat ~/.config/systemd/user/clawdbot-gateway.service +``` + +## macOS (launchd) + +Use the macOS menu app or restart script: + +```bash +./scripts/restart-mac.sh +``` + +Or manually: + +```bash +# Stop service +launchctl unload ~/Library/LaunchAgents/dev.steipete.clawdbot.gateway.plist + +# Start service +launchctl load ~/Library/LaunchAgents/dev.steipete.clawdbot.gateway.plist +``` + +## Using Clawdbot CLI + +Cross-platform daemon management: + +```bash +# Stop gateway +pnpm clawdbot daemon stop + +# Start gateway +pnpm clawdbot daemon start + +# Check status +pnpm clawdbot daemon status +``` + +## After Configuration Changes + +After modifying `~/.clawdbot/clawdbot.json` or auth profiles: + +```bash +# Restart to reload configuration +systemctl --user restart clawdbot-gateway.service + +# Or use CLI +pnpm clawdbot daemon stop && pnpm clawdbot daemon start +``` + +The gateway will automatically reload: +- Auth profiles +- Model fallback configuration +- Gateway settings (port, bind, etc.) +- Provider configurations + +## Verifying Gateway Health + +```bash +# Check gateway is responding +pnpm clawdbot health + +# List auth providers +pnpm clawdbot providers list + +# Test agent connection +pnpm clawdbot agent --message "hello" --local +``` + +## Troubleshooting + +**Gateway won't start:** +1. Check for port conflicts: `lsof -i :18789` +2. Verify configuration: `pnpm clawdbot doctor` +3. Check logs for errors +4. Try reinstalling the service + +**Changes not taking effect:** +- Configuration changes require restart +- Code changes require rebuild: `pnpm build` +- Service file changes require daemon-reload + +**Multiple gateways running:** +```bash +# List all gateway processes +ps aux | grep gateway + +# Kill all gateway processes +pkill -f "gateway.*18789" + +# Clean start +systemctl --user stop clawdbot-gateway.service +pkill -f "gateway.*18789" +systemctl --user start clawdbot-gateway.service +``` From 3026367c1bea967be2e55eafd55560d8cef0523e Mon Sep 17 00:00:00 2001 From: Elie Habib Date: Thu, 8 Jan 2026 17:22:35 +0000 Subject: [PATCH 4/5] feat(whatsapp): add configurable media max size - Add whatsapp.mediaMaxMb config option (default: 50MB) - Increases default from previous 5MB hardcoded limit - Allows receiving larger documents/media files - Per-account override via whatsapp.accounts.*.mediaMaxMb Fixes # (if applicable) --- src/config/types.ts | 3 +++ src/config/zod-schema.ts | 2 ++ src/web/inbound.ts | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/src/config/types.ts b/src/config/types.ts index 8cfdae2e6..60cf46af1 100644 --- a/src/config/types.ts +++ b/src/config/types.ts @@ -131,6 +131,8 @@ export type WhatsAppConfig = { groupPolicy?: GroupPolicy; /** Outbound text chunk size (chars). Default: 4000. */ textChunkLimit?: number; + /** Maximum media file size in MB. Default: 50. */ + mediaMaxMb?: number; /** Disable block streaming for this account. */ blockStreaming?: boolean; /** Merge streamed block replies before sending. */ @@ -160,6 +162,7 @@ export type WhatsAppAccountConfig = { groupAllowFrom?: string[]; groupPolicy?: GroupPolicy; textChunkLimit?: number; + mediaMaxMb?: number; blockStreaming?: boolean; /** Merge streamed block replies before sending. */ blockStreamingCoalesce?: BlockStreamingCoalesceConfig; diff --git a/src/config/zod-schema.ts b/src/config/zod-schema.ts index ae655eb41..7c5d0fd7d 100644 --- a/src/config/zod-schema.ts +++ b/src/config/zod-schema.ts @@ -1227,6 +1227,7 @@ export const ClawdbotSchema = z.object({ groupAllowFrom: z.array(z.string()).optional(), groupPolicy: GroupPolicySchema.optional().default("open"), textChunkLimit: z.number().int().positive().optional(), + mediaMaxMb: z.number().int().positive().optional(), blockStreaming: z.boolean().optional(), blockStreamingCoalesce: BlockStreamingCoalesceSchema.optional(), groups: z @@ -1262,6 +1263,7 @@ export const ClawdbotSchema = z.object({ groupAllowFrom: z.array(z.string()).optional(), groupPolicy: GroupPolicySchema.optional().default("open"), textChunkLimit: z.number().int().positive().optional(), + mediaMaxMb: z.number().int().positive().optional().default(50), blockStreaming: z.boolean().optional(), blockStreamingCoalesce: BlockStreamingCoalesceSchema.optional(), actions: z diff --git a/src/web/inbound.ts b/src/web/inbound.ts index b8f129de1..4df694bdb 100644 --- a/src/web/inbound.ts +++ b/src/web/inbound.ts @@ -83,6 +83,7 @@ export async function monitorWebInbox(options: { accountId: string; authDir: string; onMessage: (msg: WebInboundMessage) => Promise; + mediaMaxMb?: number; }) { const inboundLogger = getChildLogger({ module: "web-inbound" }); const inboundConsoleLog = createSubsystemLogger( @@ -375,9 +376,12 @@ export async function monitorWebInbox(options: { try { const inboundMedia = await downloadInboundMedia(msg, sock); if (inboundMedia) { + const maxBytes = (options.mediaMaxMb ?? 50) * 1024 * 1024; const saved = await saveMediaBuffer( inboundMedia.buffer, inboundMedia.mimetype, + "inbound", + maxBytes, ); mediaPath = saved.path; mediaType = inboundMedia.mimetype; From 87f432880a73e501db7db515fedf0cb6a926676c Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 9 Jan 2026 19:51:35 +0100 Subject: [PATCH 5/5] fix: honor whatsapp mediaMaxMb (#505) (thanks @koala73) --- CHANGELOG.md | 1 + docs/gateway/configuration.md | 3 +- docs/gateway/restart.md | 174 ----- docs/providers/whatsapp.md | 7 +- .../lib/__pycache__/__init__.cpython-312.pyc | Bin 771 -> 0 bytes .../lib/__pycache__/api.cpython-312.pyc | Bin 25346 -> 0 bytes .../lib/__pycache__/session.cpython-312.pyc | Bin 7368 -> 0 bytes .../lib/__pycache__/types.cpython-312.pyc | Bin 4424 -> 0 bytes .../__pycache__/classifier.cpython-312.pyc | Bin 12709 -> 0 bytes .../lib/__pycache__/extractor.cpython-312.pyc | Bin 8404 -> 0 bytes .../lib/__pycache__/fetcher.cpython-312.pyc | Bin 7068 -> 0 bytes .../lib/__pycache__/generator.cpython-312.pyc | Bin 13640 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 224 -> 0 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 218 -> 0 bytes .../__pycache__/google_places.cpython-312.pyc | Bin 12051 -> 0 bytes .../__pycache__/google_places.cpython-314.pyc | Bin 14487 -> 0 bytes .../__pycache__/main.cpython-312.pyc | Bin 3039 -> 0 bytes .../__pycache__/main.cpython-314.pyc | Bin 3794 -> 0 bytes .../__pycache__/schemas.cpython-312.pyc | Bin 5619 -> 0 bytes .../__pycache__/schemas.cpython-314.pyc | Bin 6290 -> 0 bytes skills/local-places/uv.lock | 638 ----------------- .../mino/lib/__pycache__/api.cpython-312.pyc | Bin 9100 -> 0 bytes skills/thebuilders-v2/LESSONS.md | 197 ------ skills/thebuilders-v2/SKILL.md | 111 --- skills/thebuilders-v2/config/presets.yaml | 59 -- skills/thebuilders-v2/config/voices.yaml | 47 -- .../scripts/generate-sections.mjs | 271 -------- skills/thebuilders-v2/scripts/generate.mjs | 639 ------------------ skills/thebuilders-v2/scripts/generate.sh | 22 - skills/thebuilders-v2/scripts/llm-helper.mjs | 45 -- .../templates/acquired-bible.md | 78 --- .../thebuilders-v2/templates/hook-prompt.md | 79 --- .../templates/outline-prompt.md | 96 --- .../templates/research-prompt.md | 144 ---- .../thebuilders-v2/templates/review-prompt.md | 101 --- .../thebuilders-v2/templates/script-prompt.md | 157 ----- .../lib/__pycache__/r2_upload.cpython-312.pyc | Bin 5537 -> 0 bytes .../lib/__pycache__/whisper.cpython-312.pyc | Bin 13459 -> 0 bytes skills/uv.lock | 638 ----------------- skills/whoopskill/SKILL.md | 102 --- src/agents/pi-embedded-helpers.ts | 5 +- src/agents/pi-embedded-runner.ts | 6 +- src/agents/pi-tools.ts | 1 - src/agents/tools/serve-tool.ts | 97 --- src/gateway/serve.ts | 366 ---------- src/gateway/server-http.ts | 4 - src/gateway/server.ts | 12 - src/web/accounts.ts | 2 + src/web/auto-reply.ts | 2 + src/web/inbound.media.test.ts | 68 +- src/web/inbound.ts | 6 +- 51 files changed, 89 insertions(+), 4089 deletions(-) delete mode 100644 docs/gateway/restart.md delete mode 100644 skills/barrys/lib/__pycache__/__init__.cpython-312.pyc delete mode 100644 skills/barrys/lib/__pycache__/api.cpython-312.pyc delete mode 100644 skills/barrys/lib/__pycache__/session.cpython-312.pyc delete mode 100644 skills/barrys/lib/__pycache__/types.cpython-312.pyc delete mode 100644 skills/bookmark-brain/lib/__pycache__/classifier.cpython-312.pyc delete mode 100644 skills/bookmark-brain/lib/__pycache__/extractor.cpython-312.pyc delete mode 100644 skills/bookmark-brain/lib/__pycache__/fetcher.cpython-312.pyc delete mode 100644 skills/bookmark-brain/lib/__pycache__/generator.cpython-312.pyc delete mode 100644 skills/local-places/src/local_places/__pycache__/__init__.cpython-312.pyc delete mode 100644 skills/local-places/src/local_places/__pycache__/__init__.cpython-314.pyc delete mode 100644 skills/local-places/src/local_places/__pycache__/google_places.cpython-312.pyc delete mode 100644 skills/local-places/src/local_places/__pycache__/google_places.cpython-314.pyc delete mode 100644 skills/local-places/src/local_places/__pycache__/main.cpython-312.pyc delete mode 100644 skills/local-places/src/local_places/__pycache__/main.cpython-314.pyc delete mode 100644 skills/local-places/src/local_places/__pycache__/schemas.cpython-312.pyc delete mode 100644 skills/local-places/src/local_places/__pycache__/schemas.cpython-314.pyc delete mode 100644 skills/local-places/uv.lock delete mode 100644 skills/mino/lib/__pycache__/api.cpython-312.pyc delete mode 100644 skills/thebuilders-v2/LESSONS.md delete mode 100644 skills/thebuilders-v2/SKILL.md delete mode 100644 skills/thebuilders-v2/config/presets.yaml delete mode 100644 skills/thebuilders-v2/config/voices.yaml delete mode 100755 skills/thebuilders-v2/scripts/generate-sections.mjs delete mode 100755 skills/thebuilders-v2/scripts/generate.mjs delete mode 100755 skills/thebuilders-v2/scripts/generate.sh delete mode 100644 skills/thebuilders-v2/scripts/llm-helper.mjs delete mode 100644 skills/thebuilders-v2/templates/acquired-bible.md delete mode 100644 skills/thebuilders-v2/templates/hook-prompt.md delete mode 100644 skills/thebuilders-v2/templates/outline-prompt.md delete mode 100644 skills/thebuilders-v2/templates/research-prompt.md delete mode 100644 skills/thebuilders-v2/templates/review-prompt.md delete mode 100644 skills/thebuilders-v2/templates/script-prompt.md delete mode 100644 skills/transcribe/lib/__pycache__/r2_upload.cpython-312.pyc delete mode 100644 skills/transcribe/lib/__pycache__/whisper.cpython-312.pyc delete mode 100644 skills/uv.lock delete mode 100644 skills/whoopskill/SKILL.md delete mode 100644 src/agents/tools/serve-tool.ts delete mode 100644 src/gateway/serve.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 90128e027..e730c7957 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ - Doctor: repair gateway service entrypoint when switching between npm and git installs; add Docker e2e coverage. — thanks @steipete - Daemon: align generated systemd unit with docs for network-online + restart delay. (#479) — thanks @azade-c - Daemon: add KillMode=process to systemd units to avoid podman restart hangs. (#541) — thanks @ogulcancelik +- WhatsApp: make inbound media size cap configurable (default 50 MB). (#505) — thanks @koala73 - Doctor: run legacy state migrations in non-interactive mode without prompts. - Cron: parse Telegram topic targets for isolated delivery. (#478) — thanks @nachoiacovino - Outbound: default Telegram account selection for config-only tokens; remove heartbeat-specific accountId handling. (follow-up #516) — thanks @YuriNachos diff --git a/docs/gateway/configuration.md b/docs/gateway/configuration.md index f3f5e8ee5..da70fd387 100644 --- a/docs/gateway/configuration.md +++ b/docs/gateway/configuration.md @@ -265,7 +265,8 @@ For groups, use `whatsapp.groupPolicy` + `whatsapp.groupAllowFrom`. whatsapp: { dmPolicy: "pairing", // pairing | allowlist | open | disabled allowFrom: ["+15555550123", "+447700900123"], - textChunkLimit: 4000 // optional outbound chunk size (chars) + textChunkLimit: 4000, // optional outbound chunk size (chars) + mediaMaxMb: 50 // optional inbound media cap (MB) } } ``` diff --git a/docs/gateway/restart.md b/docs/gateway/restart.md deleted file mode 100644 index ab06fcca8..000000000 --- a/docs/gateway/restart.md +++ /dev/null @@ -1,174 +0,0 @@ -# Restarting the Clawdbot Gateway - -This guide covers how to properly restart the Clawdbot gateway service on different platforms. - -## Linux (systemd) - -The gateway runs as a systemd user service on Linux servers. - -### Quick Restart - -```bash -systemctl --user restart clawdbot-gateway.service -``` - -### Full Reload (after code updates) - -When you update the codebase (git pull, rebase, etc.), follow these steps: - -```bash -# 1. Stop the service -systemctl --user stop clawdbot-gateway.service - -# 2. Kill any stray gateway processes -pkill -f "gateway.*18789" - -# 3. Reload systemd configuration (if service file changed) -systemctl --user daemon-reload - -# 4. Start the service -systemctl --user start clawdbot-gateway.service - -# 5. Verify it's running -systemctl --user status clawdbot-gateway.service -``` - -### Reinstall Service (after major updates) - -If the gateway command changed or you're having persistent issues: - -```bash -# Uninstall old service -pnpm clawdbot daemon uninstall - -# Reinstall with latest configuration -pnpm clawdbot daemon install - -# Reload and start -systemctl --user daemon-reload -systemctl --user start clawdbot-gateway.service -``` - -### Check Logs - -```bash -# Follow live logs -journalctl --user -u clawdbot-gateway.service -f - -# View recent logs -journalctl --user -u clawdbot-gateway.service -n 50 - -# View logs since last boot -journalctl --user -u clawdbot-gateway.service --boot -``` - -### Common Issues - -**Port already in use:** -```bash -# Find process using port 18789 -lsof -i :18789 - -# Kill specific process -kill -9 -``` - -**Service keeps restarting:** -```bash -# Check for error details -journalctl --user -u clawdbot-gateway.service --since "5 minutes ago" | grep -i error - -# Verify service file is correct -cat ~/.config/systemd/user/clawdbot-gateway.service -``` - -## macOS (launchd) - -Use the macOS menu app or restart script: - -```bash -./scripts/restart-mac.sh -``` - -Or manually: - -```bash -# Stop service -launchctl unload ~/Library/LaunchAgents/dev.steipete.clawdbot.gateway.plist - -# Start service -launchctl load ~/Library/LaunchAgents/dev.steipete.clawdbot.gateway.plist -``` - -## Using Clawdbot CLI - -Cross-platform daemon management: - -```bash -# Stop gateway -pnpm clawdbot daemon stop - -# Start gateway -pnpm clawdbot daemon start - -# Check status -pnpm clawdbot daemon status -``` - -## After Configuration Changes - -After modifying `~/.clawdbot/clawdbot.json` or auth profiles: - -```bash -# Restart to reload configuration -systemctl --user restart clawdbot-gateway.service - -# Or use CLI -pnpm clawdbot daemon stop && pnpm clawdbot daemon start -``` - -The gateway will automatically reload: -- Auth profiles -- Model fallback configuration -- Gateway settings (port, bind, etc.) -- Provider configurations - -## Verifying Gateway Health - -```bash -# Check gateway is responding -pnpm clawdbot health - -# List auth providers -pnpm clawdbot providers list - -# Test agent connection -pnpm clawdbot agent --message "hello" --local -``` - -## Troubleshooting - -**Gateway won't start:** -1. Check for port conflicts: `lsof -i :18789` -2. Verify configuration: `pnpm clawdbot doctor` -3. Check logs for errors -4. Try reinstalling the service - -**Changes not taking effect:** -- Configuration changes require restart -- Code changes require rebuild: `pnpm build` -- Service file changes require daemon-reload - -**Multiple gateways running:** -```bash -# List all gateway processes -ps aux | grep gateway - -# Kill all gateway processes -pkill -f "gateway.*18789" - -# Clean start -systemctl --user stop clawdbot-gateway.service -pkill -f "gateway.*18789" -systemctl --user start clawdbot-gateway.service -``` diff --git a/docs/providers/whatsapp.md b/docs/providers/whatsapp.md index faf42418c..9321bdeab 100644 --- a/docs/providers/whatsapp.md +++ b/docs/providers/whatsapp.md @@ -151,7 +151,8 @@ Behavior: ## Limits - Outbound text is chunked to `whatsapp.textChunkLimit` (default 4000). -- Media items are capped by `agents.defaults.mediaMaxMb` (default 5 MB). +- Inbound media saves are capped by `whatsapp.mediaMaxMb` (default 50 MB). +- Outbound media items are capped by `agents.defaults.mediaMaxMb` (default 5 MB). ## Outbound send (text + media) - Uses active web listener; error if gateway not running. @@ -166,7 +167,7 @@ Behavior: - Gateway: `send` params include `gifPlayback: true` ## Media limits + optimization -- Default cap: 5 MB (per media item). +- Default outbound cap: 5 MB (per media item). - Override: `agents.defaults.mediaMaxMb`. - Images are auto-optimized to JPEG under cap (resize + quality sweep). - Oversize media => error; media reply falls back to text warning. @@ -187,7 +188,9 @@ Behavior: - `whatsapp.dmPolicy` (DM policy: pairing/allowlist/open/disabled). - `whatsapp.selfChatMode` (same-phone setup; suppress pairing replies for outbound DMs). - `whatsapp.allowFrom` (DM allowlist). +- `whatsapp.mediaMaxMb` (inbound media save cap). - `whatsapp.accounts..*` (per-account settings + optional `authDir`). +- `whatsapp.accounts..mediaMaxMb` (per-account inbound media cap). - `whatsapp.groupAllowFrom` (group sender allowlist). - `whatsapp.groupPolicy` (group policy). - `whatsapp.groups` (group allowlist + mention gating defaults; use `"*"` to allow all) diff --git a/skills/barrys/lib/__pycache__/__init__.cpython-312.pyc b/skills/barrys/lib/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 8219e3cf4b6d361f18a194eac18156dffc1c0c4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 771 zcmY+C&5qMB5XYVLBW=^PO&3;t2&obW6s@#5azRLK*-9%SK(u@D#Y!8KT5C5^oPf%W zr{K;E(c7;~j6CP8_GKXJ0p2^JL_I&ZY4$@XJ%r0z%zJc@Cv~TQktv?@8 zf-p*~#O9W;v2DS+#%rRE>!N`hqKTWr!H#I*mT2R)iPw2YxY!k4+!Y@7L=X2wANR!o z4}_0>F~mc0fDbH`qNMT3!nd}~zZP21(8%rmTgp*Ny4) zlH>(_LkqfD(V(pkpPkIcXVHR0r?Ul_jiYEXo<5%||G)kDtCtJqY3=81lfI_1;-&IV zHburcO{P4SQn^u~8YLfB$Nk(ojY<%56@iDfFkL z>2Ks15k{R6Yt(^a=oWKM$Y*q^U3C38TxWuYlrtKptXx;iaK+xszV+MX8obsd-rd8F~PW?9x(^zb{ncV#=4eT4vn4y-hO0WR+N LuKmF&?&|#C^7PK! diff --git a/skills/barrys/lib/__pycache__/api.cpython-312.pyc b/skills/barrys/lib/__pycache__/api.cpython-312.pyc deleted file mode 100644 index dda3aa224fc39dcfeb603f9c2d0e135b16760701..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25346 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 WQP1ZKyVi1-*E)7sls_@^aQ_b#2u4!? diff --git a/skills/barrys/lib/__pycache__/session.cpython-312.pyc b/skills/barrys/lib/__pycache__/session.cpython-312.pyc deleted file mode 100644 index e6cfb0fa3ebfcddd7ae15b2072d9af6ec9f4b5cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7368 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 E4{0MM!~g&Q diff --git a/skills/barrys/lib/__pycache__/types.cpython-312.pyc b/skills/barrys/lib/__pycache__/types.cpython-312.pyc deleted file mode 100644 index 3c5b2a6baf0f97250c4c9ac165ebd6a8bc92db14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4424 zcmb_fO>Y~=8J;DV-(QkQNtPVNv;{nUyW)scOvx@#l)yfmnP+x5 z^UV9jza|n<0-w5BGWWuS{1ZFJpMcjmG894{lNDl+5-}9RXDJn5$){l3Z}}@~Nv#A* zfl9CxgfX=gG6JRW1~GzvR!R{gw4s!uMz|DPCr0E?N-1tcO9>jJ$st&tri|FT@V!n- zJyh+C#c_=KeB=%>5?>P|`K{00%eU?qDfN163fP`AY@f&W0^4_nO?zw_*vuI=-{I+ViiqG?+0r@B`GvY@az}&~O@}hw65)F_$F!@uwKcinI5mDNpI^l#`Kq^| zS#_+5Ewj45W;zpPyOL*=Q}!jzn^l88m?*DRzWV@v=6yeaQ09fQEPS`;85jrIQs=K- zznP26@3$nrE%AoLpGmwf@g0e8N}SyC&tIF8%_(e7V)MqE1(CTuH$T0yxU4PB-C0?j zUeb!6+*=ky-J|om2LaJNqH_R!kSjq zD^$}&RMRT9QMa%i*R(I{y5%u`?l6(kG`(829UZTO!<^Ldxrz(RbK1gf)&m<5ez*_T z3oRA|cuI}{$&WYl8+L`}sb$jqy6J4xSMzY+n}*5r{Jv>f+`H7gWv=F3ed01?!qpgw4(E5D0{ODKD)XQubCdpUM*Y?*yzeHP9S?VhF z_Dj8SOzJAf0-dp-Yz2S~by{I;H6kEsvRK}rD5NoqHZ8)^v_W{Gf}vBPI%b86s5^=h zi>O%ziR)#@W+H6VnbcUsOs;L}remQ)q_7qK;R4A|p81pqaZy*qbX(ZtSz3q9$bdo2l)=5?(mJWB!V72T{tk`c*Tos~CqP7O^ubBsQynXDl@ukuMIW$H48ci>PA z;pg!1F#ymd)wfe{y|FjbR5LBv&kQ!z!B+3dt>atgEA@&P*SU4b9hgZ1o^MH|u*#8f zPDVGF5rG*|BZPCjd2WpJ=OQ8j`TRcUu|#>@LW8N7%aCkDr~;_3(*n!EYx81=(J$&I zq-4z#m{W_EF@?x;i=;Pf%Ph}xv2KTw=7d4bwJuy$W)?Pstyu&Wp-b6c;26RjJbVfO zEe?a7G`q3!?Yp~^`?GuRHP!Lfl{XI5k$tDBzR`MnYP+!e;r{ZIiNlfWhnXAC)G608 zajo<9euZUr>20W2Wp@Ng8jTPDn{=3yd>I$gZ9J@;^OclObH&(uqP2oHU&X>v?&@!;(Zkf}L3mW|E0^r@7!lGm!!B#uNde^s zYw0yIxJcJQ7XkH|U8Brtux047PZ7F&Y5~U(kmP#+-;jT(*IRDkD#K5rAM4eoI_w4a z3;XH4g{C^v>KopFYwuc9z0?}K2+^t0RI{hN4#!^~-Tv_5#x8$Uf#UahAkp?If!Ck- ze<1L6F-UfJ6|=a0u{j zbPd3Wj3T1vxayyoF3xEyON(p}XD2_MUR=1XeX=w+zwr57Q6v@@=9f>py~l6KVfnXc z;Dw>ieAMG{r`4C)PW=!heWTk+$h5nG?F7i!fAN6yilNN|GSIqm z^?+n{H}?5nrAe-~#&ZW`X#eID{~xBBBnNYSv48vg%4nMafY`oRTXy4;2rI*F0^kwY z9gsvs>2DJNkHGE)Z>bC}mFX;%X}e1W@eKfvz;2&>BcR-B69A9EZjU5XCEF$d9)aDY SB>I%GHUW^t_daMz+xQPwcl3+^ diff --git a/skills/bookmark-brain/lib/__pycache__/classifier.cpython-312.pyc b/skills/bookmark-brain/lib/__pycache__/classifier.cpython-312.pyc deleted file mode 100644 index c0fd55a826e486af78eea8ab9428d483d43db1ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12709 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 diff --git a/skills/bookmark-brain/lib/__pycache__/extractor.cpython-312.pyc b/skills/bookmark-brain/lib/__pycache__/extractor.cpython-312.pyc deleted file mode 100644 index 4368940e68b07e9b8ac692a3dcdb2e54006fe54e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8404 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 diff --git a/skills/local-places/src/local_places/__pycache__/__init__.cpython-312.pyc b/skills/local-places/src/local_places/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 7311f39763545ad462614d53267929b4508164b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224 zcmX@j%ge<81U#2xGYx?BV-N=h7@>^Md_cx@h7^W$#wdmq#wf;0CQasB-0|^csYS(^ z`FZj2RjdYjhI$5mnoPIYu*uC& oDa}c>D`E#44RT|#AdvXL%*e=igIl6Qzk&S*pJ*d@5i3v>05!2ZJpcdz diff --git a/skills/local-places/src/local_places/__pycache__/__init__.cpython-314.pyc b/skills/local-places/src/local_places/__pycache__/__init__.cpython-314.pyc deleted file mode 100644 index 0a17848a45a0a0a69ee91bccfa284ee891b61154..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 218 zcmdPqD`4)G4d|7Hy zab|vAe0&wFfu5nBfuAPRE%x~M#GIV?_#!5twv`N@L8jbt(hn^Ls?{$pNzE)sElJf6 zD9X=DO)e?c&&f|t%!x0^NlZ=!N*5)g3dF}}=4F<|$LkeT-r}&y%}*)KNwq6t2O0@- eU9ljL_`uA_$asTWqC>xd{RW?C6L%3SP!s^PnmC#O diff --git a/skills/local-places/src/local_places/__pycache__/google_places.cpython-312.pyc b/skills/local-places/src/local_places/__pycache__/google_places.cpython-312.pyc deleted file mode 100644 index a1237f3af20dd295cd9aac213195c91d900d39f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12051 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𔴣^if{SeGuq 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 diff --git a/skills/local-places/src/local_places/__pycache__/main.cpython-314.pyc b/skills/local-places/src/local_places/__pycache__/main.cpython-314.pyc deleted file mode 100644 index ec25ea963898a29f2683c4326f45dd7e40a66f44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3794 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 MhI9WdK*Iy&ziCDDU;qFB diff --git a/skills/local-places/src/local_places/__pycache__/schemas.cpython-314.pyc b/skills/local-places/src/local_places/__pycache__/schemas.cpython-314.pyc deleted file mode 100644 index 997365113e659c699612730d083c819b91f73a2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6290 zcmb_g-ES1v6~FVf-{1a#V1w5mm@EN14G>7uLX+@ef?1LYm_qSRhTX9}VZXR@H`J)A zR%#?xNhA3oQvFE!(2|#`4}FN#KIBhuv{r3Ksj8|{E8g6C)vCOt=iHfHk6{T&=}2?t z-gD2~nR|Zc{O*}~Ar=i0IF9`NviYYlA%DY8`%s*Quqg_J)Jcx0!dWsUFkuMW;#qM@ zV$zh%Vp>z+P-O>O_%3C z7j1Fgu*ITbD|5w)&TOg31q_kwgI|C1%{LFGLBJgWO)KjqL(}Y#rj;s%S`ph3O}kms zi|$BV)87F|~iRvN^z&u>|pka-H zxI^wI`>@aHH;Nr75D&*8&tYqzEr1Y+^%97udbBC; zyWc;seDl*A^{IxjCJ#H);Y{27ix|NnY|5NcI(KK7l_;u$KAQDI zUI;moQ&iv4Hn{{;Ka2;s4+ZdH5PBhxwV;MOSrh{LP}C?N4I@zEj+E*5xMca_aHUYLkC0%S|+&18`O@S>COc&d@+RGBE0GRjL{?lfWK@wyiCW@xT zerz#1oBnA!TPZ`j5)nlWE5GPB3=(8Jki_6 zp^{nFD1=mb-kshov(EI9DmC+lRx~~^idIIXdtm~b-%>Qn^K9W^2wtW=mH&pZc&kDS zd32oXJR(CI;1D*`(5RCck`s@8NJs&6gXA4yK~M!%R3%lM6k)OQ10*$D0b;Bf6mPM8 z)L=DQ<}nDt?VGF6lFlrge}rN z1iUjNW^bRlP%bW}0l+lkmo}}mRjXDjlo^GIG%#NJCMs<2~W3hG2`Qon_}*6V`w~P?Ebc+w(F7itQSGl z$%c$9>-cdpZG6 zYX3p@QDv^|(pBprGP1V&^BSsx+`VrBoU8~l3W0`EVLEN%)M*#1dWf*%I9+i>l zF}QFa+6vEF+i#XRz?KXndFGc#mX3U8H2f>6slS9%5Hl;g&o@)ql}L6y-rI=$_g{X}b5^hr zh>uez1g-DHLTW8~xDZB@ZttLpdSWs|GtIQ4qeJd}CC3=K|di*0uy&y{+(#DSNxeTZgs_fGF1FxJPN%p*p=Cb0e-j?4NV$7&^wM z15N{uGD{|-FQ6h+)#qVvs@yQ#%|6mKqlMfJ4~)5Tpmq6HXC33q>sVzXYFdGW2)>t4h3_mEDqG0$lwt<`l0I;2MM; zFJ8eisD_~zac2psQRv0oURaGoFTs0B7EvX@G-XHL#xJFJYo(G-7wKE@Vs?OkJZWYj z>i{6*SDfvKLW3HX^)TvuBDT>Bw85n~Gn8dc%@_h0+a_VpUcrku%JY8&?CB_qIEYNN zE3Evp<02YeLU9?zk5F7i!RO&qbi)>jn4&lVrsw*=0n7-A-;TA@ z%&NkF0^@dySNC3=W^F$}0p+{pLKH6>KVjOViQ<2qvXVD>a z#>ja6!qU|>dE8ky8f{y*4-{|+n+TU@-4~ulR-BL&Af%8gcL>Q#Uw#O4{LT&9{cV0x z4XaZ8z;L;UV)5Zb?-toG@CoM>iqJbefRUEX1iLzhGl-6+Jm@%YbPKEZ&;$iqw0|5t zx98sQ>T?I`=a+yo4j?<+y!+0*msXP#$PR1rgyS^4ZJX01P{1K9Q{<4M~6FG05?<@a=RA1dD$71kvR91UtxGH*||LW(fDw21bjt%M+qEyF}`X$8V~@4pFL_>2AzTlh3w diff --git a/skills/local-places/uv.lock b/skills/local-places/uv.lock deleted file mode 100644 index dd2ee6799..000000000 --- a/skills/local-places/uv.lock +++ /dev/null @@ -1,638 +0,0 @@ -version = 1 -revision = 3 -requires-python = ">=3.11" - -[[package]] -name = "annotated-doc" -version = "0.0.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, -] - -[[package]] -name = "annotated-types" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, -] - -[[package]] -name = "anyio" -version = "4.12.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "idna" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685, upload-time = "2026-01-06T11:45:21.246Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" }, -] - -[[package]] -name = "certifi" -version = "2026.1.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" }, -] - -[[package]] -name = "click" -version = "8.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, -] - -[[package]] -name = "colorama" -version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, -] - -[[package]] -name = "fastapi" -version = "0.128.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "annotated-doc" }, - { name = "pydantic" }, - { name = "starlette" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/52/08/8c8508db6c7b9aae8f7175046af41baad690771c9bcde676419965e338c7/fastapi-0.128.0.tar.gz", hash = "sha256:1cc179e1cef10a6be60ffe429f79b829dce99d8de32d7acb7e6c8dfdf7f2645a", size = 365682, upload-time = "2025-12-27T15:21:13.714Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/05/5cbb59154b093548acd0f4c7c474a118eda06da25aa75c616b72d8fcd92a/fastapi-0.128.0-py3-none-any.whl", hash = "sha256:aebd93f9716ee3b4f4fcfe13ffb7cf308d99c9f3ab5622d8877441072561582d", size = 103094, upload-time = "2025-12-27T15:21:12.154Z" }, -] - -[[package]] -name = "h11" -version = "0.16.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, -] - -[[package]] -name = "httpcore" -version = "1.0.9" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, -] - -[[package]] -name = "httptools" -version = "0.7.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b5/46/120a669232c7bdedb9d52d4aeae7e6c7dfe151e99dc70802e2fc7a5e1993/httptools-0.7.1.tar.gz", hash = "sha256:abd72556974f8e7c74a259655924a717a2365b236c882c3f6f8a45fe94703ac9", size = 258961, upload-time = "2025-10-10T03:55:08.559Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/08/17e07e8d89ab8f343c134616d72eebfe03798835058e2ab579dcc8353c06/httptools-0.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:474d3b7ab469fefcca3697a10d11a32ee2b9573250206ba1e50d5980910da657", size = 206521, upload-time = "2025-10-10T03:54:31.002Z" }, - { url = "https://files.pythonhosted.org/packages/aa/06/c9c1b41ff52f16aee526fd10fbda99fa4787938aa776858ddc4a1ea825ec/httptools-0.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3c3b7366bb6c7b96bd72d0dbe7f7d5eead261361f013be5f6d9590465ea1c70", size = 110375, upload-time = "2025-10-10T03:54:31.941Z" }, - { url = "https://files.pythonhosted.org/packages/cc/cc/10935db22fda0ee34c76f047590ca0a8bd9de531406a3ccb10a90e12ea21/httptools-0.7.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:379b479408b8747f47f3b253326183d7c009a3936518cdb70db58cffd369d9df", size = 456621, upload-time = "2025-10-10T03:54:33.176Z" }, - { url = "https://files.pythonhosted.org/packages/0e/84/875382b10d271b0c11aa5d414b44f92f8dd53e9b658aec338a79164fa548/httptools-0.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cad6b591a682dcc6cf1397c3900527f9affef1e55a06c4547264796bbd17cf5e", size = 454954, upload-time = "2025-10-10T03:54:34.226Z" }, - { url = "https://files.pythonhosted.org/packages/30/e1/44f89b280f7e46c0b1b2ccee5737d46b3bb13136383958f20b580a821ca0/httptools-0.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eb844698d11433d2139bbeeb56499102143beb582bd6c194e3ba69c22f25c274", size = 440175, upload-time = "2025-10-10T03:54:35.942Z" }, - { url = "https://files.pythonhosted.org/packages/6f/7e/b9287763159e700e335028bc1824359dc736fa9b829dacedace91a39b37e/httptools-0.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f65744d7a8bdb4bda5e1fa23e4ba16832860606fcc09d674d56e425e991539ec", size = 440310, upload-time = "2025-10-10T03:54:37.1Z" }, - { url = "https://files.pythonhosted.org/packages/b3/07/5b614f592868e07f5c94b1f301b5e14a21df4e8076215a3bccb830a687d8/httptools-0.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:135fbe974b3718eada677229312e97f3b31f8a9c8ffa3ae6f565bf808d5b6bcb", size = 86875, upload-time = "2025-10-10T03:54:38.421Z" }, - { url = "https://files.pythonhosted.org/packages/53/7f/403e5d787dc4942316e515e949b0c8a013d84078a915910e9f391ba9b3ed/httptools-0.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:38e0c83a2ea9746ebbd643bdfb521b9aa4a91703e2cd705c20443405d2fd16a5", size = 206280, upload-time = "2025-10-10T03:54:39.274Z" }, - { url = "https://files.pythonhosted.org/packages/2a/0d/7f3fd28e2ce311ccc998c388dd1c53b18120fda3b70ebb022b135dc9839b/httptools-0.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f25bbaf1235e27704f1a7b86cd3304eabc04f569c828101d94a0e605ef7205a5", size = 110004, upload-time = "2025-10-10T03:54:40.403Z" }, - { url = "https://files.pythonhosted.org/packages/84/a6/b3965e1e146ef5762870bbe76117876ceba51a201e18cc31f5703e454596/httptools-0.7.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c15f37ef679ab9ecc06bfc4e6e8628c32a8e4b305459de7cf6785acd57e4d03", size = 517655, upload-time = "2025-10-10T03:54:41.347Z" }, - { url = "https://files.pythonhosted.org/packages/11/7d/71fee6f1844e6fa378f2eddde6c3e41ce3a1fb4b2d81118dd544e3441ec0/httptools-0.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7fe6e96090df46b36ccfaf746f03034e5ab723162bc51b0a4cf58305324036f2", size = 511440, upload-time = "2025-10-10T03:54:42.452Z" }, - { url = "https://files.pythonhosted.org/packages/22/a5/079d216712a4f3ffa24af4a0381b108aa9c45b7a5cc6eb141f81726b1823/httptools-0.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f72fdbae2dbc6e68b8239defb48e6a5937b12218e6ffc2c7846cc37befa84362", size = 495186, upload-time = "2025-10-10T03:54:43.937Z" }, - { url = "https://files.pythonhosted.org/packages/e9/9e/025ad7b65278745dee3bd0ebf9314934c4592560878308a6121f7f812084/httptools-0.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e99c7b90a29fd82fea9ef57943d501a16f3404d7b9ee81799d41639bdaae412c", size = 499192, upload-time = "2025-10-10T03:54:45.003Z" }, - { url = "https://files.pythonhosted.org/packages/6d/de/40a8f202b987d43afc4d54689600ff03ce65680ede2f31df348d7f368b8f/httptools-0.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:3e14f530fefa7499334a79b0cf7e7cd2992870eb893526fb097d51b4f2d0f321", size = 86694, upload-time = "2025-10-10T03:54:45.923Z" }, - { url = "https://files.pythonhosted.org/packages/09/8f/c77b1fcbfd262d422f12da02feb0d218fa228d52485b77b953832105bb90/httptools-0.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6babce6cfa2a99545c60bfef8bee0cc0545413cb0018f617c8059a30ad985de3", size = 202889, upload-time = "2025-10-10T03:54:47.089Z" }, - { url = "https://files.pythonhosted.org/packages/0a/1a/22887f53602feaa066354867bc49a68fc295c2293433177ee90870a7d517/httptools-0.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:601b7628de7504077dd3dcb3791c6b8694bbd967148a6d1f01806509254fb1ca", size = 108180, upload-time = "2025-10-10T03:54:48.052Z" }, - { url = "https://files.pythonhosted.org/packages/32/6a/6aaa91937f0010d288d3d124ca2946d48d60c3a5ee7ca62afe870e3ea011/httptools-0.7.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:04c6c0e6c5fb0739c5b8a9eb046d298650a0ff38cf42537fc372b28dc7e4472c", size = 478596, upload-time = "2025-10-10T03:54:48.919Z" }, - { url = "https://files.pythonhosted.org/packages/6d/70/023d7ce117993107be88d2cbca566a7c1323ccbaf0af7eabf2064fe356f6/httptools-0.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69d4f9705c405ae3ee83d6a12283dc9feba8cc6aaec671b412917e644ab4fa66", size = 473268, upload-time = "2025-10-10T03:54:49.993Z" }, - { url = "https://files.pythonhosted.org/packages/32/4d/9dd616c38da088e3f436e9a616e1d0cc66544b8cdac405cc4e81c8679fc7/httptools-0.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:44c8f4347d4b31269c8a9205d8a5ee2df5322b09bbbd30f8f862185bb6b05346", size = 455517, upload-time = "2025-10-10T03:54:51.066Z" }, - { url = "https://files.pythonhosted.org/packages/1d/3a/a6c595c310b7df958e739aae88724e24f9246a514d909547778d776799be/httptools-0.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:465275d76db4d554918aba40bf1cbebe324670f3dfc979eaffaa5d108e2ed650", size = 458337, upload-time = "2025-10-10T03:54:52.196Z" }, - { url = "https://files.pythonhosted.org/packages/fd/82/88e8d6d2c51edc1cc391b6e044c6c435b6aebe97b1abc33db1b0b24cd582/httptools-0.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:322d00c2068d125bd570f7bf78b2d367dad02b919d8581d7476d8b75b294e3e6", size = 85743, upload-time = "2025-10-10T03:54:53.448Z" }, - { url = "https://files.pythonhosted.org/packages/34/50/9d095fcbb6de2d523e027a2f304d4551855c2f46e0b82befd718b8b20056/httptools-0.7.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:c08fe65728b8d70b6923ce31e3956f859d5e1e8548e6f22ec520a962c6757270", size = 203619, upload-time = "2025-10-10T03:54:54.321Z" }, - { url = "https://files.pythonhosted.org/packages/07/f0/89720dc5139ae54b03f861b5e2c55a37dba9a5da7d51e1e824a1f343627f/httptools-0.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7aea2e3c3953521c3c51106ee11487a910d45586e351202474d45472db7d72d3", size = 108714, upload-time = "2025-10-10T03:54:55.163Z" }, - { url = "https://files.pythonhosted.org/packages/b3/cb/eea88506f191fb552c11787c23f9a405f4c7b0c5799bf73f2249cd4f5228/httptools-0.7.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0e68b8582f4ea9166be62926077a3334064d422cf08ab87d8b74664f8e9058e1", size = 472909, upload-time = "2025-10-10T03:54:56.056Z" }, - { url = "https://files.pythonhosted.org/packages/e0/4a/a548bdfae6369c0d078bab5769f7b66f17f1bfaa6fa28f81d6be6959066b/httptools-0.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df091cf961a3be783d6aebae963cc9b71e00d57fa6f149025075217bc6a55a7b", size = 470831, upload-time = "2025-10-10T03:54:57.219Z" }, - { url = "https://files.pythonhosted.org/packages/4d/31/14df99e1c43bd132eec921c2e7e11cda7852f65619bc0fc5bdc2d0cb126c/httptools-0.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f084813239e1eb403ddacd06a30de3d3e09a9b76e7894dcda2b22f8a726e9c60", size = 452631, upload-time = "2025-10-10T03:54:58.219Z" }, - { url = "https://files.pythonhosted.org/packages/22/d2/b7e131f7be8d854d48cb6d048113c30f9a46dca0c9a8b08fcb3fcd588cdc/httptools-0.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7347714368fb2b335e9063bc2b96f2f87a9ceffcd9758ac295f8bbcd3ffbc0ca", size = 452910, upload-time = "2025-10-10T03:54:59.366Z" }, - { url = "https://files.pythonhosted.org/packages/53/cf/878f3b91e4e6e011eff6d1fa9ca39f7eb17d19c9d7971b04873734112f30/httptools-0.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:cfabda2a5bb85aa2a904ce06d974a3f30fb36cc63d7feaddec05d2050acede96", size = 88205, upload-time = "2025-10-10T03:55:00.389Z" }, -] - -[[package]] -name = "httpx" -version = "0.28.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "certifi" }, - { name = "httpcore" }, - { name = "idna" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, -] - -[[package]] -name = "idna" -version = "3.11" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, -] - -[[package]] -name = "iniconfig" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, -] - -[[package]] -name = "my-api" -version = "0.1.0" -source = { editable = "." } -dependencies = [ - { name = "fastapi" }, - { name = "httpx" }, - { name = "uvicorn", extra = ["standard"] }, -] - -[package.optional-dependencies] -dev = [ - { name = "pytest" }, -] - -[package.metadata] -requires-dist = [ - { name = "fastapi", specifier = ">=0.110.0" }, - { name = "httpx", specifier = ">=0.27.0" }, - { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0.0" }, - { name = "uvicorn", extras = ["standard"], specifier = ">=0.29.0" }, -] -provides-extras = ["dev"] - -[[package]] -name = "packaging" -version = "25.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, -] - -[[package]] -name = "pluggy" -version = "1.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, -] - -[[package]] -name = "pydantic" -version = "2.12.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "annotated-types" }, - { name = "pydantic-core" }, - { name = "typing-extensions" }, - { name = "typing-inspection" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, -] - -[[package]] -name = "pydantic-core" -version = "2.41.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", size = 2105873, upload-time = "2025-11-04T13:39:31.373Z" }, - { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826, upload-time = "2025-11-04T13:39:32.897Z" }, - { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869, upload-time = "2025-11-04T13:39:34.469Z" }, - { url = "https://files.pythonhosted.org/packages/6e/6a/30d94a9674a7fe4f4744052ed6c5e083424510be1e93da5bc47569d11810/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8", size = 2063890, upload-time = "2025-11-04T13:39:36.053Z" }, - { url = "https://files.pythonhosted.org/packages/50/be/76e5d46203fcb2750e542f32e6c371ffa9b8ad17364cf94bb0818dbfb50c/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e", size = 2229740, upload-time = "2025-11-04T13:39:37.753Z" }, - { url = "https://files.pythonhosted.org/packages/d3/ee/fed784df0144793489f87db310a6bbf8118d7b630ed07aa180d6067e653a/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1", size = 2350021, upload-time = "2025-11-04T13:39:40.94Z" }, - { url = "https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", size = 2066378, upload-time = "2025-11-04T13:39:42.523Z" }, - { url = "https://files.pythonhosted.org/packages/b0/3b/698cf8ae1d536a010e05121b4958b1257f0b5522085e335360e53a6b1c8b/pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b", size = 2175761, upload-time = "2025-11-04T13:39:44.553Z" }, - { url = "https://files.pythonhosted.org/packages/b8/ba/15d537423939553116dea94ce02f9c31be0fa9d0b806d427e0308ec17145/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", size = 2146303, upload-time = "2025-11-04T13:39:46.238Z" }, - { url = "https://files.pythonhosted.org/packages/58/7f/0de669bf37d206723795f9c90c82966726a2ab06c336deba4735b55af431/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594", size = 2340355, upload-time = "2025-11-04T13:39:48.002Z" }, - { url = "https://files.pythonhosted.org/packages/e5/de/e7482c435b83d7e3c3ee5ee4451f6e8973cff0eb6007d2872ce6383f6398/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", size = 2319875, upload-time = "2025-11-04T13:39:49.705Z" }, - { url = "https://files.pythonhosted.org/packages/fe/e6/8c9e81bb6dd7560e33b9053351c29f30c8194b72f2d6932888581f503482/pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b", size = 1987549, upload-time = "2025-11-04T13:39:51.842Z" }, - { url = "https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe", size = 2011305, upload-time = "2025-11-04T13:39:53.485Z" }, - { url = "https://files.pythonhosted.org/packages/56/d8/0e271434e8efd03186c5386671328154ee349ff0354d83c74f5caaf096ed/pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f", size = 1972902, upload-time = "2025-11-04T13:39:56.488Z" }, - { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, - { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, - { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, - { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" }, - { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" }, - { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" }, - { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, - { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" }, - { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, - { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" }, - { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, - { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload-time = "2025-11-04T13:40:19.309Z" }, - { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload-time = "2025-11-04T13:40:21.548Z" }, - { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload-time = "2025-11-04T13:40:23.393Z" }, - { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403, upload-time = "2025-11-04T13:40:25.248Z" }, - { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload-time = "2025-11-04T13:40:27.099Z" }, - { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload-time = "2025-11-04T13:40:29.806Z" }, - { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258, upload-time = "2025-11-04T13:40:33.544Z" }, - { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917, upload-time = "2025-11-04T13:40:35.479Z" }, - { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186, upload-time = "2025-11-04T13:40:37.436Z" }, - { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164, upload-time = "2025-11-04T13:40:40.289Z" }, - { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146, upload-time = "2025-11-04T13:40:42.809Z" }, - { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788, upload-time = "2025-11-04T13:40:44.752Z" }, - { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133, upload-time = "2025-11-04T13:40:46.66Z" }, - { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852, upload-time = "2025-11-04T13:40:48.575Z" }, - { url = "https://files.pythonhosted.org/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", size = 1994679, upload-time = "2025-11-04T13:40:50.619Z" }, - { url = "https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", size = 2019766, upload-time = "2025-11-04T13:40:52.631Z" }, - { url = "https://files.pythonhosted.org/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", size = 1981005, upload-time = "2025-11-04T13:40:54.734Z" }, - { url = "https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", size = 2119622, upload-time = "2025-11-04T13:40:56.68Z" }, - { url = "https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", size = 1891725, upload-time = "2025-11-04T13:40:58.807Z" }, - { url = "https://files.pythonhosted.org/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", size = 1915040, upload-time = "2025-11-04T13:41:00.853Z" }, - { url = "https://files.pythonhosted.org/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", size = 2063691, upload-time = "2025-11-04T13:41:03.504Z" }, - { url = "https://files.pythonhosted.org/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", size = 2213897, upload-time = "2025-11-04T13:41:05.804Z" }, - { url = "https://files.pythonhosted.org/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", size = 2333302, upload-time = "2025-11-04T13:41:07.809Z" }, - { url = "https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", size = 2064877, upload-time = "2025-11-04T13:41:09.827Z" }, - { url = "https://files.pythonhosted.org/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", size = 2180680, upload-time = "2025-11-04T13:41:12.379Z" }, - { url = "https://files.pythonhosted.org/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", size = 2138960, upload-time = "2025-11-04T13:41:14.627Z" }, - { url = "https://files.pythonhosted.org/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", size = 2339102, upload-time = "2025-11-04T13:41:16.868Z" }, - { url = "https://files.pythonhosted.org/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", size = 2326039, upload-time = "2025-11-04T13:41:18.934Z" }, - { url = "https://files.pythonhosted.org/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", size = 1995126, upload-time = "2025-11-04T13:41:21.418Z" }, - { url = "https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", size = 2015489, upload-time = "2025-11-04T13:41:24.076Z" }, - { url = "https://files.pythonhosted.org/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", size = 1977288, upload-time = "2025-11-04T13:41:26.33Z" }, - { url = "https://files.pythonhosted.org/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", size = 2120255, upload-time = "2025-11-04T13:41:28.569Z" }, - { url = "https://files.pythonhosted.org/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", size = 1863760, upload-time = "2025-11-04T13:41:31.055Z" }, - { url = "https://files.pythonhosted.org/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", size = 1878092, upload-time = "2025-11-04T13:41:33.21Z" }, - { url = "https://files.pythonhosted.org/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", size = 2053385, upload-time = "2025-11-04T13:41:35.508Z" }, - { url = "https://files.pythonhosted.org/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", size = 2218832, upload-time = "2025-11-04T13:41:37.732Z" }, - { url = "https://files.pythonhosted.org/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", size = 2327585, upload-time = "2025-11-04T13:41:40Z" }, - { url = "https://files.pythonhosted.org/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", size = 2041078, upload-time = "2025-11-04T13:41:42.323Z" }, - { url = "https://files.pythonhosted.org/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", size = 2173914, upload-time = "2025-11-04T13:41:45.221Z" }, - { url = "https://files.pythonhosted.org/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", size = 2129560, upload-time = "2025-11-04T13:41:47.474Z" }, - { url = "https://files.pythonhosted.org/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", size = 2329244, upload-time = "2025-11-04T13:41:49.992Z" }, - { url = "https://files.pythonhosted.org/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", size = 2331955, upload-time = "2025-11-04T13:41:54.079Z" }, - { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906, upload-time = "2025-11-04T13:41:56.606Z" }, - { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607, upload-time = "2025-11-04T13:41:58.889Z" }, - { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" }, - { url = "https://files.pythonhosted.org/packages/11/72/90fda5ee3b97e51c494938a4a44c3a35a9c96c19bba12372fb9c634d6f57/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034", size = 2115441, upload-time = "2025-11-04T13:42:39.557Z" }, - { url = "https://files.pythonhosted.org/packages/1f/53/8942f884fa33f50794f119012dc6a1a02ac43a56407adaac20463df8e98f/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", size = 1930291, upload-time = "2025-11-04T13:42:42.169Z" }, - { url = "https://files.pythonhosted.org/packages/79/c8/ecb9ed9cd942bce09fc888ee960b52654fbdbede4ba6c2d6e0d3b1d8b49c/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", size = 1948632, upload-time = "2025-11-04T13:42:44.564Z" }, - { url = "https://files.pythonhosted.org/packages/2e/1b/687711069de7efa6af934e74f601e2a4307365e8fdc404703afc453eab26/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", size = 2138905, upload-time = "2025-11-04T13:42:47.156Z" }, - { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, - { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, - { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, - { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, - { url = "https://files.pythonhosted.org/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", size = 2101980, upload-time = "2025-11-04T13:43:25.97Z" }, - { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865, upload-time = "2025-11-04T13:43:28.763Z" }, - { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256, upload-time = "2025-11-04T13:43:31.71Z" }, - { url = "https://files.pythonhosted.org/packages/83/d9/8412d7f06f616bbc053d30cb4e5f76786af3221462ad5eee1f202021eb4e/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1", size = 2174762, upload-time = "2025-11-04T13:43:34.744Z" }, - { url = "https://files.pythonhosted.org/packages/55/4c/162d906b8e3ba3a99354e20faa1b49a85206c47de97a639510a0e673f5da/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", size = 2143141, upload-time = "2025-11-04T13:43:37.701Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f2/f11dd73284122713f5f89fc940f370d035fa8e1e078d446b3313955157fe/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770", size = 2330317, upload-time = "2025-11-04T13:43:40.406Z" }, - { url = "https://files.pythonhosted.org/packages/88/9d/b06ca6acfe4abb296110fb1273a4d848a0bfb2ff65f3ee92127b3244e16b/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", size = 2316992, upload-time = "2025-11-04T13:43:43.602Z" }, - { url = "https://files.pythonhosted.org/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", size = 2145302, upload-time = "2025-11-04T13:43:46.64Z" }, -] - -[[package]] -name = "pygments" -version = "2.19.2" -source = { registry = "https://pypi.org/simple" } -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" } -wheels = [ - { 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" }, -] - -[[package]] -name = "pytest" -version = "9.0.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "iniconfig" }, - { name = "packaging" }, - { name = "pluggy" }, - { name = "pygments" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" }, -] - -[[package]] -name = "python-dotenv" -version = "1.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f0/26/19cadc79a718c5edbec86fd4919a6b6d3f681039a2f6d66d14be94e75fb9/python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6", size = 44221, upload-time = "2025-10-26T15:12:10.434Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/14/1b/a298b06749107c305e1fe0f814c6c74aea7b2f1e10989cb30f544a1b3253/python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61", size = 21230, upload-time = "2025-10-26T15:12:09.109Z" }, -] - -[[package]] -name = "pyyaml" -version = "6.0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, - { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, - { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, - { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, - { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, - { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, - { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, - { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, - { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, - { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, - { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, - { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, - { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, - { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, - { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, - { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, - { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, - { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, - { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, - { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, - { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, - { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, - { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, - { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, - { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, - { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, - { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, - { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, - { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, - { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, - { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, - { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, - { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, - { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, - { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, - { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, - { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, - { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, - { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, - { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, - { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, - { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, - { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, - { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, - { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, - { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, - { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, -] - -[[package]] -name = "starlette" -version = "0.50.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ba/b8/73a0e6a6e079a9d9cfa64113d771e421640b6f679a52eeb9b32f72d871a1/starlette-0.50.0.tar.gz", hash = "sha256:a2a17b22203254bcbc2e1f926d2d55f3f9497f769416b3190768befe598fa3ca", size = 2646985, upload-time = "2025-11-01T15:25:27.516Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/52/1064f510b141bd54025f9b55105e26d1fa970b9be67ad766380a3c9b74b0/starlette-0.50.0-py3-none-any.whl", hash = "sha256:9e5391843ec9b6e472eed1365a78c8098cfceb7a74bfd4d6b1c0c0095efb3bca", size = 74033, upload-time = "2025-11-01T15:25:25.461Z" }, -] - -[[package]] -name = "typing-extensions" -version = "4.15.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, -] - -[[package]] -name = "typing-inspection" -version = "0.4.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -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" } -wheels = [ - { 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" }, -] - -[[package]] -name = "uvicorn" -version = "0.40.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c3/d1/8f3c683c9561a4e6689dd3b1d345c815f10f86acd044ee1fb9a4dcd0b8c5/uvicorn-0.40.0.tar.gz", hash = "sha256:839676675e87e73694518b5574fd0f24c9d97b46bea16df7b8c05ea1a51071ea", size = 81761, upload-time = "2025-12-21T14:16:22.45Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/d8/2083a1daa7439a66f3a48589a57d576aa117726762618f6bb09fe3798796/uvicorn-0.40.0-py3-none-any.whl", hash = "sha256:c6c8f55bc8bf13eb6fa9ff87ad62308bbbc33d0b67f84293151efe87e0d5f2ee", size = 68502, upload-time = "2025-12-21T14:16:21.041Z" }, -] - -[package.optional-dependencies] -standard = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "httptools" }, - { name = "python-dotenv" }, - { name = "pyyaml" }, - { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, - { name = "watchfiles" }, - { name = "websockets" }, -] - -[[package]] -name = "uvloop" -version = "0.22.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/06/f0/18d39dbd1971d6d62c4629cc7fa67f74821b0dc1f5a77af43719de7936a7/uvloop-0.22.1.tar.gz", hash = "sha256:6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f", size = 2443250, upload-time = "2025-10-16T22:17:19.342Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/d5/69900f7883235562f1f50d8184bb7dd84a2fb61e9ec63f3782546fdbd057/uvloop-0.22.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c60ebcd36f7b240b30788554b6f0782454826a0ed765d8430652621b5de674b9", size = 1352420, upload-time = "2025-10-16T22:16:21.187Z" }, - { url = "https://files.pythonhosted.org/packages/a8/73/c4e271b3bce59724e291465cc936c37758886a4868787da0278b3b56b905/uvloop-0.22.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b7f102bf3cb1995cfeaee9321105e8f5da76fdb104cdad8986f85461a1b7b77", size = 748677, upload-time = "2025-10-16T22:16:22.558Z" }, - { url = "https://files.pythonhosted.org/packages/86/94/9fb7fad2f824d25f8ecac0d70b94d0d48107ad5ece03769a9c543444f78a/uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53c85520781d84a4b8b230e24a5af5b0778efdb39142b424990ff1ef7c48ba21", size = 3753819, upload-time = "2025-10-16T22:16:23.903Z" }, - { url = "https://files.pythonhosted.org/packages/74/4f/256aca690709e9b008b7108bc85fba619a2bc37c6d80743d18abad16ee09/uvloop-0.22.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56a2d1fae65fd82197cb8c53c367310b3eabe1bbb9fb5a04d28e3e3520e4f702", size = 3804529, upload-time = "2025-10-16T22:16:25.246Z" }, - { url = "https://files.pythonhosted.org/packages/7f/74/03c05ae4737e871923d21a76fe28b6aad57f5c03b6e6bfcfa5ad616013e4/uvloop-0.22.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40631b049d5972c6755b06d0bfe8233b1bd9a8a6392d9d1c45c10b6f9e9b2733", size = 3621267, upload-time = "2025-10-16T22:16:26.819Z" }, - { url = "https://files.pythonhosted.org/packages/75/be/f8e590fe61d18b4a92070905497aec4c0e64ae1761498cad09023f3f4b3e/uvloop-0.22.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:535cc37b3a04f6cd2c1ef65fa1d370c9a35b6695df735fcff5427323f2cd5473", size = 3723105, upload-time = "2025-10-16T22:16:28.252Z" }, - { url = "https://files.pythonhosted.org/packages/3d/ff/7f72e8170be527b4977b033239a83a68d5c881cc4775fca255c677f7ac5d/uvloop-0.22.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fe94b4564e865d968414598eea1a6de60adba0c040ba4ed05ac1300de402cd42", size = 1359936, upload-time = "2025-10-16T22:16:29.436Z" }, - { url = "https://files.pythonhosted.org/packages/c3/c6/e5d433f88fd54d81ef4be58b2b7b0cea13c442454a1db703a1eea0db1a59/uvloop-0.22.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:51eb9bd88391483410daad430813d982010f9c9c89512321f5b60e2cddbdddd6", size = 752769, upload-time = "2025-10-16T22:16:30.493Z" }, - { url = "https://files.pythonhosted.org/packages/24/68/a6ac446820273e71aa762fa21cdcc09861edd3536ff47c5cd3b7afb10eeb/uvloop-0.22.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:700e674a166ca5778255e0e1dc4e9d79ab2acc57b9171b79e65feba7184b3370", size = 4317413, upload-time = "2025-10-16T22:16:31.644Z" }, - { url = "https://files.pythonhosted.org/packages/5f/6f/e62b4dfc7ad6518e7eff2516f680d02a0f6eb62c0c212e152ca708a0085e/uvloop-0.22.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b5b1ac819a3f946d3b2ee07f09149578ae76066d70b44df3fa990add49a82e4", size = 4426307, upload-time = "2025-10-16T22:16:32.917Z" }, - { url = "https://files.pythonhosted.org/packages/90/60/97362554ac21e20e81bcef1150cb2a7e4ffdaf8ea1e5b2e8bf7a053caa18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e047cc068570bac9866237739607d1313b9253c3051ad84738cbb095be0537b2", size = 4131970, upload-time = "2025-10-16T22:16:34.015Z" }, - { url = "https://files.pythonhosted.org/packages/99/39/6b3f7d234ba3964c428a6e40006340f53ba37993f46ed6e111c6e9141d18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:512fec6815e2dd45161054592441ef76c830eddaad55c8aa30952e6fe1ed07c0", size = 4296343, upload-time = "2025-10-16T22:16:35.149Z" }, - { url = "https://files.pythonhosted.org/packages/89/8c/182a2a593195bfd39842ea68ebc084e20c850806117213f5a299dfc513d9/uvloop-0.22.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:561577354eb94200d75aca23fbde86ee11be36b00e52a4eaf8f50fb0c86b7705", size = 1358611, upload-time = "2025-10-16T22:16:36.833Z" }, - { url = "https://files.pythonhosted.org/packages/d2/14/e301ee96a6dc95224b6f1162cd3312f6d1217be3907b79173b06785f2fe7/uvloop-0.22.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cdf5192ab3e674ca26da2eada35b288d2fa49fdd0f357a19f0e7c4e7d5077c8", size = 751811, upload-time = "2025-10-16T22:16:38.275Z" }, - { url = "https://files.pythonhosted.org/packages/b7/02/654426ce265ac19e2980bfd9ea6590ca96a56f10c76e63801a2df01c0486/uvloop-0.22.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e2ea3d6190a2968f4a14a23019d3b16870dd2190cd69c8180f7c632d21de68d", size = 4288562, upload-time = "2025-10-16T22:16:39.375Z" }, - { url = "https://files.pythonhosted.org/packages/15/c0/0be24758891ef825f2065cd5db8741aaddabe3e248ee6acc5e8a80f04005/uvloop-0.22.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0530a5fbad9c9e4ee3f2b33b148c6a64d47bbad8000ea63704fa8260f4cf728e", size = 4366890, upload-time = "2025-10-16T22:16:40.547Z" }, - { url = "https://files.pythonhosted.org/packages/d2/53/8369e5219a5855869bcee5f4d317f6da0e2c669aecf0ef7d371e3d084449/uvloop-0.22.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bc5ef13bbc10b5335792360623cc378d52d7e62c2de64660616478c32cd0598e", size = 4119472, upload-time = "2025-10-16T22:16:41.694Z" }, - { url = "https://files.pythonhosted.org/packages/f8/ba/d69adbe699b768f6b29a5eec7b47dd610bd17a69de51b251126a801369ea/uvloop-0.22.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1f38ec5e3f18c8a10ded09742f7fb8de0108796eb673f30ce7762ce1b8550cad", size = 4239051, upload-time = "2025-10-16T22:16:43.224Z" }, - { url = "https://files.pythonhosted.org/packages/90/cd/b62bdeaa429758aee8de8b00ac0dd26593a9de93d302bff3d21439e9791d/uvloop-0.22.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3879b88423ec7e97cd4eba2a443aa26ed4e59b45e6b76aabf13fe2f27023a142", size = 1362067, upload-time = "2025-10-16T22:16:44.503Z" }, - { url = "https://files.pythonhosted.org/packages/0d/f8/a132124dfda0777e489ca86732e85e69afcd1ff7686647000050ba670689/uvloop-0.22.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4baa86acedf1d62115c1dc6ad1e17134476688f08c6efd8a2ab076e815665c74", size = 752423, upload-time = "2025-10-16T22:16:45.968Z" }, - { url = "https://files.pythonhosted.org/packages/a3/94/94af78c156f88da4b3a733773ad5ba0b164393e357cc4bd0ab2e2677a7d6/uvloop-0.22.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:297c27d8003520596236bdb2335e6b3f649480bd09e00d1e3a99144b691d2a35", size = 4272437, upload-time = "2025-10-16T22:16:47.451Z" }, - { url = "https://files.pythonhosted.org/packages/b5/35/60249e9fd07b32c665192cec7af29e06c7cd96fa1d08b84f012a56a0b38e/uvloop-0.22.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1955d5a1dd43198244d47664a5858082a3239766a839b2102a269aaff7a4e25", size = 4292101, upload-time = "2025-10-16T22:16:49.318Z" }, - { url = "https://files.pythonhosted.org/packages/02/62/67d382dfcb25d0a98ce73c11ed1a6fba5037a1a1d533dcbb7cab033a2636/uvloop-0.22.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b31dc2fccbd42adc73bc4e7cdbae4fc5086cf378979e53ca5d0301838c5682c6", size = 4114158, upload-time = "2025-10-16T22:16:50.517Z" }, - { url = "https://files.pythonhosted.org/packages/f0/7a/f1171b4a882a5d13c8b7576f348acfe6074d72eaf52cccef752f748d4a9f/uvloop-0.22.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:93f617675b2d03af4e72a5333ef89450dfaa5321303ede6e67ba9c9d26878079", size = 4177360, upload-time = "2025-10-16T22:16:52.646Z" }, - { url = "https://files.pythonhosted.org/packages/79/7b/b01414f31546caf0919da80ad57cbfe24c56b151d12af68cee1b04922ca8/uvloop-0.22.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:37554f70528f60cad66945b885eb01f1bb514f132d92b6eeed1c90fd54ed6289", size = 1454790, upload-time = "2025-10-16T22:16:54.355Z" }, - { url = "https://files.pythonhosted.org/packages/d4/31/0bb232318dd838cad3fa8fb0c68c8b40e1145b32025581975e18b11fab40/uvloop-0.22.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b76324e2dc033a0b2f435f33eb88ff9913c156ef78e153fb210e03c13da746b3", size = 796783, upload-time = "2025-10-16T22:16:55.906Z" }, - { url = "https://files.pythonhosted.org/packages/42/38/c9b09f3271a7a723a5de69f8e237ab8e7803183131bc57c890db0b6bb872/uvloop-0.22.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:badb4d8e58ee08dad957002027830d5c3b06aea446a6a3744483c2b3b745345c", size = 4647548, upload-time = "2025-10-16T22:16:57.008Z" }, - { url = "https://files.pythonhosted.org/packages/c1/37/945b4ca0ac27e3dc4952642d4c900edd030b3da6c9634875af6e13ae80e5/uvloop-0.22.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b91328c72635f6f9e0282e4a57da7470c7350ab1c9f48546c0f2866205349d21", size = 4467065, upload-time = "2025-10-16T22:16:58.206Z" }, - { url = "https://files.pythonhosted.org/packages/97/cc/48d232f33d60e2e2e0b42f4e73455b146b76ebe216487e862700457fbf3c/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:daf620c2995d193449393d6c62131b3fbd40a63bf7b307a1527856ace637fe88", size = 4328384, upload-time = "2025-10-16T22:16:59.36Z" }, - { url = "https://files.pythonhosted.org/packages/e4/16/c1fd27e9549f3c4baf1dc9c20c456cd2f822dbf8de9f463824b0c0357e06/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6cde23eeda1a25c75b2e07d39970f3374105d5eafbaab2a4482be82f272d5a5e", size = 4296730, upload-time = "2025-10-16T22:17:00.744Z" }, -] - -[[package]] -name = "watchfiles" -version = "1.1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c2/c9/8869df9b2a2d6c59d79220a4db37679e74f807c559ffe5265e08b227a210/watchfiles-1.1.1.tar.gz", hash = "sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2", size = 94440, upload-time = "2025-10-14T15:06:21.08Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/f8/2c5f479fb531ce2f0564eda479faecf253d886b1ab3630a39b7bf7362d46/watchfiles-1.1.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f57b396167a2565a4e8b5e56a5a1c537571733992b226f4f1197d79e94cf0ae5", size = 406529, upload-time = "2025-10-14T15:04:32.899Z" }, - { url = "https://files.pythonhosted.org/packages/fe/cd/f515660b1f32f65df671ddf6f85bfaca621aee177712874dc30a97397977/watchfiles-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:421e29339983e1bebc281fab40d812742268ad057db4aee8c4d2bce0af43b741", size = 394384, upload-time = "2025-10-14T15:04:33.761Z" }, - { url = "https://files.pythonhosted.org/packages/7b/c3/28b7dc99733eab43fca2d10f55c86e03bd6ab11ca31b802abac26b23d161/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e43d39a741e972bab5d8100b5cdacf69db64e34eb19b6e9af162bccf63c5cc6", size = 448789, upload-time = "2025-10-14T15:04:34.679Z" }, - { url = "https://files.pythonhosted.org/packages/4a/24/33e71113b320030011c8e4316ccca04194bf0cbbaeee207f00cbc7d6b9f5/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f537afb3276d12814082a2e9b242bdcf416c2e8fd9f799a737990a1dbe906e5b", size = 460521, upload-time = "2025-10-14T15:04:35.963Z" }, - { url = "https://files.pythonhosted.org/packages/f4/c3/3c9a55f255aa57b91579ae9e98c88704955fa9dac3e5614fb378291155df/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2cd9e04277e756a2e2d2543d65d1e2166d6fd4c9b183f8808634fda23f17b14", size = 488722, upload-time = "2025-10-14T15:04:37.091Z" }, - { url = "https://files.pythonhosted.org/packages/49/36/506447b73eb46c120169dc1717fe2eff07c234bb3232a7200b5f5bd816e9/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f3f58818dc0b07f7d9aa7fe9eb1037aecb9700e63e1f6acfed13e9fef648f5d", size = 596088, upload-time = "2025-10-14T15:04:38.39Z" }, - { url = "https://files.pythonhosted.org/packages/82/ab/5f39e752a9838ec4d52e9b87c1e80f1ee3ccdbe92e183c15b6577ab9de16/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb9f66367023ae783551042d31b1d7fd422e8289eedd91f26754a66f44d5cff", size = 472923, upload-time = "2025-10-14T15:04:39.666Z" }, - { url = "https://files.pythonhosted.org/packages/af/b9/a419292f05e302dea372fa7e6fda5178a92998411f8581b9830d28fb9edb/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aebfd0861a83e6c3d1110b78ad54704486555246e542be3e2bb94195eabb2606", size = 456080, upload-time = "2025-10-14T15:04:40.643Z" }, - { url = "https://files.pythonhosted.org/packages/b0/c3/d5932fd62bde1a30c36e10c409dc5d54506726f08cb3e1d8d0ba5e2bc8db/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5fac835b4ab3c6487b5dbad78c4b3724e26bcc468e886f8ba8cc4306f68f6701", size = 629432, upload-time = "2025-10-14T15:04:41.789Z" }, - { url = "https://files.pythonhosted.org/packages/f7/77/16bddd9779fafb795f1a94319dc965209c5641db5bf1edbbccace6d1b3c0/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:399600947b170270e80134ac854e21b3ccdefa11a9529a3decc1327088180f10", size = 623046, upload-time = "2025-10-14T15:04:42.718Z" }, - { url = "https://files.pythonhosted.org/packages/46/ef/f2ecb9a0f342b4bfad13a2787155c6ee7ce792140eac63a34676a2feeef2/watchfiles-1.1.1-cp311-cp311-win32.whl", hash = "sha256:de6da501c883f58ad50db3a32ad397b09ad29865b5f26f64c24d3e3281685849", size = 271473, upload-time = "2025-10-14T15:04:43.624Z" }, - { url = "https://files.pythonhosted.org/packages/94/bc/f42d71125f19731ea435c3948cad148d31a64fccde3867e5ba4edee901f9/watchfiles-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:35c53bd62a0b885bf653ebf6b700d1bf05debb78ad9292cf2a942b23513dc4c4", size = 287598, upload-time = "2025-10-14T15:04:44.516Z" }, - { url = "https://files.pythonhosted.org/packages/57/c9/a30f897351f95bbbfb6abcadafbaca711ce1162f4db95fc908c98a9165f3/watchfiles-1.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:57ca5281a8b5e27593cb7d82c2ac927ad88a96ed406aa446f6344e4328208e9e", size = 277210, upload-time = "2025-10-14T15:04:45.883Z" }, - { url = "https://files.pythonhosted.org/packages/74/d5/f039e7e3c639d9b1d09b07ea412a6806d38123f0508e5f9b48a87b0a76cc/watchfiles-1.1.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8c89f9f2f740a6b7dcc753140dd5e1ab9215966f7a3530d0c0705c83b401bd7d", size = 404745, upload-time = "2025-10-14T15:04:46.731Z" }, - { url = "https://files.pythonhosted.org/packages/a5/96/a881a13aa1349827490dab2d363c8039527060cfcc2c92cc6d13d1b1049e/watchfiles-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd404be08018c37350f0d6e34676bd1e2889990117a2b90070b3007f172d0610", size = 391769, upload-time = "2025-10-14T15:04:48.003Z" }, - { url = "https://files.pythonhosted.org/packages/4b/5b/d3b460364aeb8da471c1989238ea0e56bec24b6042a68046adf3d9ddb01c/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8526e8f916bb5b9a0a777c8317c23ce65de259422bba5b31325a6fa6029d33af", size = 449374, upload-time = "2025-10-14T15:04:49.179Z" }, - { url = "https://files.pythonhosted.org/packages/b9/44/5769cb62d4ed055cb17417c0a109a92f007114a4e07f30812a73a4efdb11/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2edc3553362b1c38d9f06242416a5d8e9fe235c204a4072e988ce2e5bb1f69f6", size = 459485, upload-time = "2025-10-14T15:04:50.155Z" }, - { url = "https://files.pythonhosted.org/packages/19/0c/286b6301ded2eccd4ffd0041a1b726afda999926cf720aab63adb68a1e36/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30f7da3fb3f2844259cba4720c3fc7138eb0f7b659c38f3bfa65084c7fc7abce", size = 488813, upload-time = "2025-10-14T15:04:51.059Z" }, - { url = "https://files.pythonhosted.org/packages/c7/2b/8530ed41112dd4a22f4dcfdb5ccf6a1baad1ff6eed8dc5a5f09e7e8c41c7/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8979280bdafff686ba5e4d8f97840f929a87ed9cdf133cbbd42f7766774d2aa", size = 594816, upload-time = "2025-10-14T15:04:52.031Z" }, - { url = "https://files.pythonhosted.org/packages/ce/d2/f5f9fb49489f184f18470d4f99f4e862a4b3e9ac2865688eb2099e3d837a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcc5c24523771db3a294c77d94771abcfcb82a0e0ee8efd910c37c59ec1b31bb", size = 475186, upload-time = "2025-10-14T15:04:53.064Z" }, - { url = "https://files.pythonhosted.org/packages/cf/68/5707da262a119fb06fbe214d82dd1fe4a6f4af32d2d14de368d0349eb52a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db5d7ae38ff20153d542460752ff397fcf5c96090c1230803713cf3147a6803", size = 456812, upload-time = "2025-10-14T15:04:55.174Z" }, - { url = "https://files.pythonhosted.org/packages/66/ab/3cbb8756323e8f9b6f9acb9ef4ec26d42b2109bce830cc1f3468df20511d/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:28475ddbde92df1874b6c5c8aaeb24ad5be47a11f87cde5a28ef3835932e3e94", size = 630196, upload-time = "2025-10-14T15:04:56.22Z" }, - { url = "https://files.pythonhosted.org/packages/78/46/7152ec29b8335f80167928944a94955015a345440f524d2dfe63fc2f437b/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:36193ed342f5b9842edd3532729a2ad55c4160ffcfa3700e0d54be496b70dd43", size = 622657, upload-time = "2025-10-14T15:04:57.521Z" }, - { url = "https://files.pythonhosted.org/packages/0a/bf/95895e78dd75efe9a7f31733607f384b42eb5feb54bd2eb6ed57cc2e94f4/watchfiles-1.1.1-cp312-cp312-win32.whl", hash = "sha256:859e43a1951717cc8de7f4c77674a6d389b106361585951d9e69572823f311d9", size = 272042, upload-time = "2025-10-14T15:04:59.046Z" }, - { url = "https://files.pythonhosted.org/packages/87/0a/90eb755f568de2688cb220171c4191df932232c20946966c27a59c400850/watchfiles-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:91d4c9a823a8c987cce8fa2690923b069966dabb196dd8d137ea2cede885fde9", size = 288410, upload-time = "2025-10-14T15:05:00.081Z" }, - { url = "https://files.pythonhosted.org/packages/36/76/f322701530586922fbd6723c4f91ace21364924822a8772c549483abed13/watchfiles-1.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:a625815d4a2bdca61953dbba5a39d60164451ef34c88d751f6c368c3ea73d404", size = 278209, upload-time = "2025-10-14T15:05:01.168Z" }, - { url = "https://files.pythonhosted.org/packages/bb/f4/f750b29225fe77139f7ae5de89d4949f5a99f934c65a1f1c0b248f26f747/watchfiles-1.1.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:130e4876309e8686a5e37dba7d5e9bc77e6ed908266996ca26572437a5271e18", size = 404321, upload-time = "2025-10-14T15:05:02.063Z" }, - { url = "https://files.pythonhosted.org/packages/2b/f9/f07a295cde762644aa4c4bb0f88921d2d141af45e735b965fb2e87858328/watchfiles-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f3bde70f157f84ece3765b42b4a52c6ac1a50334903c6eaf765362f6ccca88a", size = 391783, upload-time = "2025-10-14T15:05:03.052Z" }, - { url = "https://files.pythonhosted.org/packages/bc/11/fc2502457e0bea39a5c958d86d2cb69e407a4d00b85735ca724bfa6e0d1a/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e0b1fe858430fc0251737ef3824c54027bedb8c37c38114488b8e131cf8219", size = 449279, upload-time = "2025-10-14T15:05:04.004Z" }, - { url = "https://files.pythonhosted.org/packages/e3/1f/d66bc15ea0b728df3ed96a539c777acfcad0eb78555ad9efcaa1274688f0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f27db948078f3823a6bb3b465180db8ebecf26dd5dae6f6180bd87383b6b4428", size = 459405, upload-time = "2025-10-14T15:05:04.942Z" }, - { url = "https://files.pythonhosted.org/packages/be/90/9f4a65c0aec3ccf032703e6db02d89a157462fbb2cf20dd415128251cac0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:059098c3a429f62fc98e8ec62b982230ef2c8df68c79e826e37b895bc359a9c0", size = 488976, upload-time = "2025-10-14T15:05:05.905Z" }, - { url = "https://files.pythonhosted.org/packages/37/57/ee347af605d867f712be7029bb94c8c071732a4b44792e3176fa3c612d39/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfb5862016acc9b869bb57284e6cb35fdf8e22fe59f7548858e2f971d045f150", size = 595506, upload-time = "2025-10-14T15:05:06.906Z" }, - { url = "https://files.pythonhosted.org/packages/a8/78/cc5ab0b86c122047f75e8fc471c67a04dee395daf847d3e59381996c8707/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:319b27255aacd9923b8a276bb14d21a5f7ff82564c744235fc5eae58d95422ae", size = 474936, upload-time = "2025-10-14T15:05:07.906Z" }, - { url = "https://files.pythonhosted.org/packages/62/da/def65b170a3815af7bd40a3e7010bf6ab53089ef1b75d05dd5385b87cf08/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c755367e51db90e75b19454b680903631d41f9e3607fbd941d296a020c2d752d", size = 456147, upload-time = "2025-10-14T15:05:09.138Z" }, - { url = "https://files.pythonhosted.org/packages/57/99/da6573ba71166e82d288d4df0839128004c67d2778d3b566c138695f5c0b/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c22c776292a23bfc7237a98f791b9ad3144b02116ff10d820829ce62dff46d0b", size = 630007, upload-time = "2025-10-14T15:05:10.117Z" }, - { url = "https://files.pythonhosted.org/packages/a8/51/7439c4dd39511368849eb1e53279cd3454b4a4dbace80bab88feeb83c6b5/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3a476189be23c3686bc2f4321dd501cb329c0a0469e77b7b534ee10129ae6374", size = 622280, upload-time = "2025-10-14T15:05:11.146Z" }, - { url = "https://files.pythonhosted.org/packages/95/9c/8ed97d4bba5db6fdcdb2b298d3898f2dd5c20f6b73aee04eabe56c59677e/watchfiles-1.1.1-cp313-cp313-win32.whl", hash = "sha256:bf0a91bfb5574a2f7fc223cf95eeea79abfefa404bf1ea5e339c0c1560ae99a0", size = 272056, upload-time = "2025-10-14T15:05:12.156Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f3/c14e28429f744a260d8ceae18bf58c1d5fa56b50d006a7a9f80e1882cb0d/watchfiles-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:52e06553899e11e8074503c8e716d574adeeb7e68913115c4b3653c53f9bae42", size = 288162, upload-time = "2025-10-14T15:05:13.208Z" }, - { url = "https://files.pythonhosted.org/packages/dc/61/fe0e56c40d5cd29523e398d31153218718c5786b5e636d9ae8ae79453d27/watchfiles-1.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:ac3cc5759570cd02662b15fbcd9d917f7ecd47efe0d6b40474eafd246f91ea18", size = 277909, upload-time = "2025-10-14T15:05:14.49Z" }, - { url = "https://files.pythonhosted.org/packages/79/42/e0a7d749626f1e28c7108a99fb9bf524b501bbbeb9b261ceecde644d5a07/watchfiles-1.1.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:563b116874a9a7ce6f96f87cd0b94f7faf92d08d0021e837796f0a14318ef8da", size = 403389, upload-time = "2025-10-14T15:05:15.777Z" }, - { url = "https://files.pythonhosted.org/packages/15/49/08732f90ce0fbbc13913f9f215c689cfc9ced345fb1bcd8829a50007cc8d/watchfiles-1.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3ad9fe1dae4ab4212d8c91e80b832425e24f421703b5a42ef2e4a1e215aff051", size = 389964, upload-time = "2025-10-14T15:05:16.85Z" }, - { url = "https://files.pythonhosted.org/packages/27/0d/7c315d4bd5f2538910491a0393c56bf70d333d51bc5b34bee8e68e8cea19/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce70f96a46b894b36eba678f153f052967a0d06d5b5a19b336ab0dbbd029f73e", size = 448114, upload-time = "2025-10-14T15:05:17.876Z" }, - { url = "https://files.pythonhosted.org/packages/c3/24/9e096de47a4d11bc4df41e9d1e61776393eac4cb6eb11b3e23315b78b2cc/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cb467c999c2eff23a6417e58d75e5828716f42ed8289fe6b77a7e5a91036ca70", size = 460264, upload-time = "2025-10-14T15:05:18.962Z" }, - { url = "https://files.pythonhosted.org/packages/cc/0f/e8dea6375f1d3ba5fcb0b3583e2b493e77379834c74fd5a22d66d85d6540/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:836398932192dae4146c8f6f737d74baeac8b70ce14831a239bdb1ca882fc261", size = 487877, upload-time = "2025-10-14T15:05:20.094Z" }, - { url = "https://files.pythonhosted.org/packages/ac/5b/df24cfc6424a12deb41503b64d42fbea6b8cb357ec62ca84a5a3476f654a/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:743185e7372b7bc7c389e1badcc606931a827112fbbd37f14c537320fca08620", size = 595176, upload-time = "2025-10-14T15:05:21.134Z" }, - { url = "https://files.pythonhosted.org/packages/8f/b5/853b6757f7347de4e9b37e8cc3289283fb983cba1ab4d2d7144694871d9c/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afaeff7696e0ad9f02cbb8f56365ff4686ab205fcf9c4c5b6fdfaaa16549dd04", size = 473577, upload-time = "2025-10-14T15:05:22.306Z" }, - { url = "https://files.pythonhosted.org/packages/e1/f7/0a4467be0a56e80447c8529c9fce5b38eab4f513cb3d9bf82e7392a5696b/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7eb7da0eb23aa2ba036d4f616d46906013a68caf61b7fdbe42fc8b25132e77", size = 455425, upload-time = "2025-10-14T15:05:23.348Z" }, - { url = "https://files.pythonhosted.org/packages/8e/e0/82583485ea00137ddf69bc84a2db88bd92ab4a6e3c405e5fb878ead8d0e7/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:831a62658609f0e5c64178211c942ace999517f5770fe9436be4c2faeba0c0ef", size = 628826, upload-time = "2025-10-14T15:05:24.398Z" }, - { url = "https://files.pythonhosted.org/packages/28/9a/a785356fccf9fae84c0cc90570f11702ae9571036fb25932f1242c82191c/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f9a2ae5c91cecc9edd47e041a930490c31c3afb1f5e6d71de3dc671bfaca02bf", size = 622208, upload-time = "2025-10-14T15:05:25.45Z" }, - { url = "https://files.pythonhosted.org/packages/c3/f4/0872229324ef69b2c3edec35e84bd57a1289e7d3fe74588048ed8947a323/watchfiles-1.1.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:d1715143123baeeaeadec0528bb7441103979a1d5f6fd0e1f915383fea7ea6d5", size = 404315, upload-time = "2025-10-14T15:05:26.501Z" }, - { url = "https://files.pythonhosted.org/packages/7b/22/16d5331eaed1cb107b873f6ae1b69e9ced582fcf0c59a50cd84f403b1c32/watchfiles-1.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:39574d6370c4579d7f5d0ad940ce5b20db0e4117444e39b6d8f99db5676c52fd", size = 390869, upload-time = "2025-10-14T15:05:27.649Z" }, - { url = "https://files.pythonhosted.org/packages/b2/7e/5643bfff5acb6539b18483128fdc0ef2cccc94a5b8fbda130c823e8ed636/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7365b92c2e69ee952902e8f70f3ba6360d0d596d9299d55d7d386df84b6941fb", size = 449919, upload-time = "2025-10-14T15:05:28.701Z" }, - { url = "https://files.pythonhosted.org/packages/51/2e/c410993ba5025a9f9357c376f48976ef0e1b1aefb73b97a5ae01a5972755/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bfff9740c69c0e4ed32416f013f3c45e2ae42ccedd1167ef2d805c000b6c71a5", size = 460845, upload-time = "2025-10-14T15:05:30.064Z" }, - { url = "https://files.pythonhosted.org/packages/8e/a4/2df3b404469122e8680f0fcd06079317e48db58a2da2950fb45020947734/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b27cf2eb1dda37b2089e3907d8ea92922b673c0c427886d4edc6b94d8dfe5db3", size = 489027, upload-time = "2025-10-14T15:05:31.064Z" }, - { url = "https://files.pythonhosted.org/packages/ea/84/4587ba5b1f267167ee715b7f66e6382cca6938e0a4b870adad93e44747e6/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:526e86aced14a65a5b0ec50827c745597c782ff46b571dbfe46192ab9e0b3c33", size = 595615, upload-time = "2025-10-14T15:05:32.074Z" }, - { url = "https://files.pythonhosted.org/packages/6a/0f/c6988c91d06e93cd0bb3d4a808bcf32375ca1904609835c3031799e3ecae/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04e78dd0b6352db95507fd8cb46f39d185cf8c74e4cf1e4fbad1d3df96faf510", size = 474836, upload-time = "2025-10-14T15:05:33.209Z" }, - { url = "https://files.pythonhosted.org/packages/b4/36/ded8aebea91919485b7bbabbd14f5f359326cb5ec218cd67074d1e426d74/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c85794a4cfa094714fb9c08d4a218375b2b95b8ed1666e8677c349906246c05", size = 455099, upload-time = "2025-10-14T15:05:34.189Z" }, - { url = "https://files.pythonhosted.org/packages/98/e0/8c9bdba88af756a2fce230dd365fab2baf927ba42cd47521ee7498fd5211/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:74d5012b7630714b66be7b7b7a78855ef7ad58e8650c73afc4c076a1f480a8d6", size = 630626, upload-time = "2025-10-14T15:05:35.216Z" }, - { url = "https://files.pythonhosted.org/packages/2a/84/a95db05354bf2d19e438520d92a8ca475e578c647f78f53197f5a2f17aaf/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:8fbe85cb3201c7d380d3d0b90e63d520f15d6afe217165d7f98c9c649654db81", size = 622519, upload-time = "2025-10-14T15:05:36.259Z" }, - { url = "https://files.pythonhosted.org/packages/1d/ce/d8acdc8de545de995c339be67711e474c77d643555a9bb74a9334252bd55/watchfiles-1.1.1-cp314-cp314-win32.whl", hash = "sha256:3fa0b59c92278b5a7800d3ee7733da9d096d4aabcfabb9a928918bd276ef9b9b", size = 272078, upload-time = "2025-10-14T15:05:37.63Z" }, - { url = "https://files.pythonhosted.org/packages/c4/c9/a74487f72d0451524be827e8edec251da0cc1fcf111646a511ae752e1a3d/watchfiles-1.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:c2047d0b6cea13b3316bdbafbfa0c4228ae593d995030fda39089d36e64fc03a", size = 287664, upload-time = "2025-10-14T15:05:38.95Z" }, - { url = "https://files.pythonhosted.org/packages/df/b8/8ac000702cdd496cdce998c6f4ee0ca1f15977bba51bdf07d872ebdfc34c/watchfiles-1.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:842178b126593addc05acf6fce960d28bc5fae7afbaa2c6c1b3a7b9460e5be02", size = 277154, upload-time = "2025-10-14T15:05:39.954Z" }, - { url = "https://files.pythonhosted.org/packages/47/a8/e3af2184707c29f0f14b1963c0aace6529f9d1b8582d5b99f31bbf42f59e/watchfiles-1.1.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:88863fbbc1a7312972f1c511f202eb30866370ebb8493aef2812b9ff28156a21", size = 403820, upload-time = "2025-10-14T15:05:40.932Z" }, - { url = "https://files.pythonhosted.org/packages/c0/ec/e47e307c2f4bd75f9f9e8afbe3876679b18e1bcec449beca132a1c5ffb2d/watchfiles-1.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:55c7475190662e202c08c6c0f4d9e345a29367438cf8e8037f3155e10a88d5a5", size = 390510, upload-time = "2025-10-14T15:05:41.945Z" }, - { url = "https://files.pythonhosted.org/packages/d5/a0/ad235642118090f66e7b2f18fd5c42082418404a79205cdfca50b6309c13/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f53fa183d53a1d7a8852277c92b967ae99c2d4dcee2bfacff8868e6e30b15f7", size = 448408, upload-time = "2025-10-14T15:05:43.385Z" }, - { url = "https://files.pythonhosted.org/packages/df/85/97fa10fd5ff3332ae17e7e40e20784e419e28521549780869f1413742e9d/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6aae418a8b323732fa89721d86f39ec8f092fc2af67f4217a2b07fd3e93c6101", size = 458968, upload-time = "2025-10-14T15:05:44.404Z" }, - { url = "https://files.pythonhosted.org/packages/47/c2/9059c2e8966ea5ce678166617a7f75ecba6164375f3b288e50a40dc6d489/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f096076119da54a6080e8920cbdaac3dbee667eb91dcc5e5b78840b87415bd44", size = 488096, upload-time = "2025-10-14T15:05:45.398Z" }, - { url = "https://files.pythonhosted.org/packages/94/44/d90a9ec8ac309bc26db808a13e7bfc0e4e78b6fc051078a554e132e80160/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00485f441d183717038ed2e887a7c868154f216877653121068107b227a2f64c", size = 596040, upload-time = "2025-10-14T15:05:46.502Z" }, - { url = "https://files.pythonhosted.org/packages/95/68/4e3479b20ca305cfc561db3ed207a8a1c745ee32bf24f2026a129d0ddb6e/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a55f3e9e493158d7bfdb60a1165035f1cf7d320914e7b7ea83fe22c6023b58fc", size = 473847, upload-time = "2025-10-14T15:05:47.484Z" }, - { url = "https://files.pythonhosted.org/packages/4f/55/2af26693fd15165c4ff7857e38330e1b61ab8c37d15dc79118cdba115b7a/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c91ed27800188c2ae96d16e3149f199d62f86c7af5f5f4d2c61a3ed8cd3666c", size = 455072, upload-time = "2025-10-14T15:05:48.928Z" }, - { url = "https://files.pythonhosted.org/packages/66/1d/d0d200b10c9311ec25d2273f8aad8c3ef7cc7ea11808022501811208a750/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:311ff15a0bae3714ffb603e6ba6dbfba4065ab60865d15a6ec544133bdb21099", size = 629104, upload-time = "2025-10-14T15:05:49.908Z" }, - { url = "https://files.pythonhosted.org/packages/e3/bd/fa9bb053192491b3867ba07d2343d9f2252e00811567d30ae8d0f78136fe/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a916a2932da8f8ab582f242c065f5c81bed3462849ca79ee357dd9551b0e9b01", size = 622112, upload-time = "2025-10-14T15:05:50.941Z" }, - { url = "https://files.pythonhosted.org/packages/d3/8e/e500f8b0b77be4ff753ac94dc06b33d8f0d839377fee1b78e8c8d8f031bf/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:db476ab59b6765134de1d4fe96a1a9c96ddf091683599be0f26147ea1b2e4b88", size = 408250, upload-time = "2025-10-14T15:06:10.264Z" }, - { url = "https://files.pythonhosted.org/packages/bd/95/615e72cd27b85b61eec764a5ca51bd94d40b5adea5ff47567d9ebc4d275a/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89eef07eee5e9d1fda06e38822ad167a044153457e6fd997f8a858ab7564a336", size = 396117, upload-time = "2025-10-14T15:06:11.28Z" }, - { url = "https://files.pythonhosted.org/packages/c9/81/e7fe958ce8a7fb5c73cc9fb07f5aeaf755e6aa72498c57d760af760c91f8/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce19e06cbda693e9e7686358af9cd6f5d61312ab8b00488bc36f5aabbaf77e24", size = 450493, upload-time = "2025-10-14T15:06:12.321Z" }, - { url = "https://files.pythonhosted.org/packages/6e/d4/ed38dd3b1767193de971e694aa544356e63353c33a85d948166b5ff58b9e/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e6f39af2eab0118338902798b5aa6664f46ff66bc0280de76fca67a7f262a49", size = 457546, upload-time = "2025-10-14T15:06:13.372Z" }, -] - -[[package]] -name = "websockets" -version = "15.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/32/18fcd5919c293a398db67443acd33fde142f283853076049824fc58e6f75/websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", size = 175423, upload-time = "2025-03-05T20:01:56.276Z" }, - { url = "https://files.pythonhosted.org/packages/76/70/ba1ad96b07869275ef42e2ce21f07a5b0148936688c2baf7e4a1f60d5058/websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", size = 173082, upload-time = "2025-03-05T20:01:57.563Z" }, - { url = "https://files.pythonhosted.org/packages/86/f2/10b55821dd40eb696ce4704a87d57774696f9451108cff0d2824c97e0f97/websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", size = 173330, upload-time = "2025-03-05T20:01:59.063Z" }, - { url = "https://files.pythonhosted.org/packages/a5/90/1c37ae8b8a113d3daf1065222b6af61cc44102da95388ac0018fcb7d93d9/websockets-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562", size = 182878, upload-time = "2025-03-05T20:02:00.305Z" }, - { url = "https://files.pythonhosted.org/packages/8e/8d/96e8e288b2a41dffafb78e8904ea7367ee4f891dafc2ab8d87e2124cb3d3/websockets-15.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792", size = 181883, upload-time = "2025-03-05T20:02:03.148Z" }, - { url = "https://files.pythonhosted.org/packages/93/1f/5d6dbf551766308f6f50f8baf8e9860be6182911e8106da7a7f73785f4c4/websockets-15.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413", size = 182252, upload-time = "2025-03-05T20:02:05.29Z" }, - { url = "https://files.pythonhosted.org/packages/d4/78/2d4fed9123e6620cbf1706c0de8a1632e1a28e7774d94346d7de1bba2ca3/websockets-15.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8", size = 182521, upload-time = "2025-03-05T20:02:07.458Z" }, - { url = "https://files.pythonhosted.org/packages/e7/3b/66d4c1b444dd1a9823c4a81f50231b921bab54eee2f69e70319b4e21f1ca/websockets-15.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3", size = 181958, upload-time = "2025-03-05T20:02:09.842Z" }, - { url = "https://files.pythonhosted.org/packages/08/ff/e9eed2ee5fed6f76fdd6032ca5cd38c57ca9661430bb3d5fb2872dc8703c/websockets-15.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf", size = 181918, upload-time = "2025-03-05T20:02:11.968Z" }, - { url = "https://files.pythonhosted.org/packages/d8/75/994634a49b7e12532be6a42103597b71098fd25900f7437d6055ed39930a/websockets-15.0.1-cp311-cp311-win32.whl", hash = "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85", size = 176388, upload-time = "2025-03-05T20:02:13.32Z" }, - { url = "https://files.pythonhosted.org/packages/98/93/e36c73f78400a65f5e236cd376713c34182e6663f6889cd45a4a04d8f203/websockets-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065", size = 176828, upload-time = "2025-03-05T20:02:14.585Z" }, - { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437, upload-time = "2025-03-05T20:02:16.706Z" }, - { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096, upload-time = "2025-03-05T20:02:18.832Z" }, - { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332, upload-time = "2025-03-05T20:02:20.187Z" }, - { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152, upload-time = "2025-03-05T20:02:22.286Z" }, - { url = "https://files.pythonhosted.org/packages/74/45/c205c8480eafd114b428284840da0b1be9ffd0e4f87338dc95dc6ff961a1/websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", size = 182096, upload-time = "2025-03-05T20:02:24.368Z" }, - { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523, upload-time = "2025-03-05T20:02:25.669Z" }, - { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790, upload-time = "2025-03-05T20:02:26.99Z" }, - { url = "https://files.pythonhosted.org/packages/02/05/c68c5adbf679cf610ae2f74a9b871ae84564462955d991178f95a1ddb7dd/websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", size = 182165, upload-time = "2025-03-05T20:02:30.291Z" }, - { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160, upload-time = "2025-03-05T20:02:31.634Z" }, - { url = "https://files.pythonhosted.org/packages/ff/83/de1f7709376dc3ca9b7eeb4b9a07b4526b14876b6d372a4dc62312bebee0/websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", size = 176395, upload-time = "2025-03-05T20:02:33.017Z" }, - { url = "https://files.pythonhosted.org/packages/7d/71/abf2ebc3bbfa40f391ce1428c7168fb20582d0ff57019b69ea20fa698043/websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7", size = 176841, upload-time = "2025-03-05T20:02:34.498Z" }, - { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload-time = "2025-03-05T20:02:36.695Z" }, - { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload-time = "2025-03-05T20:02:37.985Z" }, - { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload-time = "2025-03-05T20:02:39.298Z" }, - { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload-time = "2025-03-05T20:02:40.595Z" }, - { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload-time = "2025-03-05T20:02:41.926Z" }, - { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload-time = "2025-03-05T20:02:43.304Z" }, - { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload-time = "2025-03-05T20:02:48.812Z" }, - { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload-time = "2025-03-05T20:02:50.14Z" }, - { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload-time = "2025-03-05T20:02:51.561Z" }, - { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload-time = "2025-03-05T20:02:53.814Z" }, - { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload-time = "2025-03-05T20:02:55.237Z" }, - { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" }, -] diff --git a/skills/mino/lib/__pycache__/api.cpython-312.pyc b/skills/mino/lib/__pycache__/api.cpython-312.pyc deleted file mode 100644 index 57c1fe7334e7c323f67dc86b9859c78ade3f5948..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9100 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 diff --git a/skills/thebuilders-v2/LESSONS.md b/skills/thebuilders-v2/LESSONS.md deleted file mode 100644 index 7f0d8f682..000000000 --- a/skills/thebuilders-v2/LESSONS.md +++ /dev/null @@ -1,197 +0,0 @@ -# Lessons Learned - The Builders v2 - -Post-mortem from the OpenAI episode generation session (Jan 6, 2026). - -## Issues & Fixes - -### 1. Wrong Model Used -**Issue:** Used GPT-4o instead of GPT-5.2 as requested -**Result:** 47 turns instead of 120+ -**Fix:** Always confirm model before running. Add `-m` flag to CLI. - -### 2. Script Too Short in Single Pass -**Issue:** Even GPT-5.2 only generated 90 turns when asked for 120+ -**Result:** Episode too shallow (7 min instead of 25 min) -**Fix:** **Section-by-section generation**. LLMs follow length instructions better on smaller chunks with explicit turn targets. - -### 3. TTS Chunked by Size, Not by Speaker -**Issue:** Audio chunks alternated voices randomly instead of per speaker -**Result:** Sounded like a confused monologue -**Fix:** Parse script by ``/`` tags, assign consistent voice per speaker. - -### 4. v3 Style Guide Not Integrated -**Issue:** The Acquired Bible existed but wasn't in the prompts -**Result:** Generic dialogue, not Acquired-style discovery -**Fix:** Include the Bible in EVERY section prompt. The patterns matter: -- Interruptions ("Wait—", "Hold on—") -- Discovery moments ("That's insane", "Wait, really?") -- Distinct perspectives (Maya=technical, James=strategy) - -### 5. No Intro/Greeting -**Issue:** Jumped straight into hook with no "Welcome to..." -**Result:** Felt robotic, not like real hosts -**Fix:** Add INTRO section (8 turns) with: -- Welcome -- Casual banter -- "Today we're covering X" -- Tease the story - -### 6. Voices Too Similar -**Issue:** Used nova/onyx which sound somewhat similar -**Result:** Hard to distinguish hosts -**Fix:** Use more distinct voices: **alloy** (female) + **echo** (male) - -## What Works - -### Section-by-Section -Each section has explicit turn targets: -``` -INTRO: 8 turns -HOOK: 12 turns -ORIGIN: 20 turns -INFLECTION1: 18 turns -INFLECTION2: 18 turns -MESSY_MIDDLE: 14 turns -NOW: 12 turns -TAKEAWAYS: 10 turns -───────────────────── -Total: 112 turns -``` - -### Speaker-Aware TTS -```javascript -// WRONG - chunks by size -for (chunk of script.split(3500)) { - voice = i % 2 === 0 ? 'nova' : 'onyx'; -} - -// RIGHT - parses by speaker -for (turn of script.matchAll(/<(Person[12])>(.+?)<\/Person[12]>/)) { - voice = turn[1] === 'Person1' ? 'alloy' : 'echo'; -} -``` - -### Bible in Every Prompt -The `acquired-bible.md` template contains: -- Host personalities -- Conversation patterns -- Language to use -- What NOT to do - -Including it in every section prompt ensures consistency. - -## Pipeline Summary - -``` -1. Gemini Deep Research (~5 min) -2. Hook Generation (~15s) -3. Section Generation (7 sections × ~20s = ~2.5 min) -4. Speaker-Aware TTS (~45s for 112 turns) -5. FFmpeg Merge (~2s) -──────────────────────────────────── -Total: ~8-10 min for 20-25 min episode -``` - -### 7. Facts Repeated Across Sections -**Issue:** Same facts (hot dog $1.50, renewal rate 93.3%, etc.) repeated 10-20 times -**Costco example:** Hot dog mentioned 19×, renewal rate 20×, chicken 15× -**Root cause:** Each section generated independently with same research context -**Fix:** **Deduplication system** -- Extract key facts after each section -- Pass "DO NOT REPEAT" list to subsequent sections -- Track up to 100 facts across sections - -### 8. Process Dies Mid-Generation -**Issue:** Long-running generation killed by OOM or gateway timeout -**Result:** Lost 30+ minutes of work, had to restart -**Fix:** **Checkpoint system** -- Save each section immediately after generation -- Save state (usedFacts, prevContext) to JSON -- On restart, detect checkpoint and resume from last section -- Location: `/checkpoints/` - -## What Works - -### Checkpoint System -``` -/checkpoints/ -├── section-0.txt # INTRO -├── section-1.txt # HOOK -├── ... -└── state.json # { completedSections: 5, usedFacts: [...] } -``` - -If process dies at section 7, re-run same command → resumes from section 7. - -### Deduplication -``` -Section 0: Extract 17 facts → pass to Section 1 as "DO NOT USE" -Section 1: Extract 16 facts → 33 total blocked -Section 2: Extract 14 facts → 47 total blocked -... -``` - -Result: 100 unique facts tracked, no repetition. - -### Section-by-Section -Each section has explicit turn targets: -``` -INTRO: 8 turns -HOOK: 12 turns -ORIGIN: 20 turns -INFLECTION1: 18 turns -INFLECTION2: 18 turns -MESSY_MIDDLE: 14 turns -NOW: 12 turns -TAKEAWAYS: 10 turns -───────────────────── -Total: 112 turns -``` - -### Speaker-Aware TTS -```javascript -// WRONG - chunks by size -for (chunk of script.split(3500)) { - voice = i % 2 === 0 ? 'nova' : 'onyx'; -} - -// RIGHT - parses by speaker -for (turn of script.matchAll(/<(Person[12])>(.+?)<\/Person[12]>/)) { - voice = turn[1] === 'Person1' ? 'alloy' : 'echo'; -} -``` - -### Bible in Every Prompt -The `acquired-bible.md` template contains: -- Host personalities -- Conversation patterns -- Language to use -- What NOT to do - -Including it in every section prompt ensures consistency. - -## Pipeline Summary - -``` -1. Gemini Deep Research (~5 min) -2. Hook Generation (~15s) -3. Section Generation (11 sections × ~25s = ~4.5 min) [with checkpoints] -4. Speaker-Aware TTS (~2 min for 250+ turns) -5. FFmpeg Merge (~2s) -──────────────────────────────────── -Total: ~12-15 min for 45-60 min deep dive - ~8-10 min for 20 min quick dive -``` - -## Checklist for Future Episodes - -- [ ] Confirm model (gpt-5.2 or better) -- [ ] Run deep research first -- [ ] Generate section-by-section -- [ ] Include Bible in all prompts -- [ ] Parse by speaker tags for TTS -- [ ] Use alloy + echo voices -- [ ] Verify intro section exists -- [ ] Listen to first 30s to check voice distinction -- [ ] Verify no repeated facts (deduplication working) -- [ ] If process dies, just re-run same command (checkpoint resume) diff --git a/skills/thebuilders-v2/SKILL.md b/skills/thebuilders-v2/SKILL.md deleted file mode 100644 index fc8447fda..000000000 --- a/skills/thebuilders-v2/SKILL.md +++ /dev/null @@ -1,111 +0,0 @@ -# The Builders Podcast Generator v2 - -Generate Acquired-style podcast episodes with two distinct hosts. - -## Two Modes - -| Mode | Flag | Duration | Research | Turns | Use Case | -|------|------|----------|----------|-------|----------| -| **Quick Dive** | `--quick` | 15-20 min | 1 pass Gemini | ~110 | Fast turnaround | -| **Deep Dive** | `--deep` | 45-60 min | 5-layer + o3 synthesis | ~250 | True Acquired-style | - -## Quick Start - -```bash -cd /home/elie/github/clawdis/skills/thebuilders-v2 - -# Quick dive (15-20 min) - default -node scripts/generate.mjs "Costco" -o /tmp/costco - -# Deep dive (45-60 min) -node scripts/generate.mjs "Costco" --deep -o /tmp/costco-deep - -# Skip research (use existing) -node scripts/generate.mjs "Costco" --deep -o /tmp/costco --skip-research -``` - -## Quick Dive Mode - -Single research pass, 8 sections: -- INTRO (8 turns) -- HOOK (12 turns) -- ORIGIN (20 turns) -- INFLECTION_1 (18 turns) -- INFLECTION_2 (18 turns) -- MESSY_MIDDLE (14 turns) -- NOW (12 turns) -- TAKEAWAYS (10 turns) - -**Total: ~112 turns / 15-20 min** - -## Deep Dive Mode - -5-layer research + 11 sections: - -### Research Layers -1. **Overview** - Gemini Deep Research -2. **Founders** - Interview quotes, early stories -3. **Decisions** - Contemporary WSJ/NYT coverage -4. **Financials** - Revenue, margins, metrics -5. **Contrarian** - Failures, criticism, struggles - -### Research Synthesis (o3) -Extracts: -- 50 most surprising facts -- 10 best quotes with attribution -- 5 "Wait, really?" moments -- Key timeline with dates -- Contrarian takes - -### Sections -- INTRO (10 turns) -- HOOK (15 turns) -- ORIGIN (35 turns) - deep founder story -- EARLY_PRODUCT (25 turns) - how it actually worked -- INFLECTION_1 (25 turns) - first major decision -- SCALE (25 turns) - operational details -- INFLECTION_2 (25 turns) - second crisis -- COMPETITION (20 turns) -- CULTURE (20 turns) -- NOW (20 turns) -- TAKEAWAYS (15 turns) - -**Total: ~235 turns / 45-60 min** - -## The Hosts - -| Host | Voice | Perspective | -|------|-------|-------------| -| **Maya Chen** (Person1) | alloy | Technical - "How does this actually work?" | -| **James Porter** (Person2) | echo | Strategic - "For context... The lesson here is..." | - -## Output Files - -``` -output/ -├── research.md # Quick mode research -├── research-combined.md # Deep mode combined research -├── research-synthesis.md # Deep mode o3 synthesis -├── hooks.md # Hook options -├── script.txt # Full dialogue -├── audio/ # Individual turns -└── episode.mp3 # Final episode -``` - -## Time Estimates - -| Mode | Research | Script | TTS | Total | -|------|----------|--------|-----|-------| -| Quick | 5 min | 3 min | 1 min | ~10 min | -| Deep | 15 min | 10 min | 3 min | ~30 min | - -## Key Differences - -| Aspect | Quick | Deep | -|--------|-------|------| -| Research passes | 1 | 5 | -| Research synthesis | None | o3 extracts key facts | -| Sections | 8 | 11 | -| ORIGIN depth | 20 turns | 35 turns | -| Quotes required | Encouraged | Mandatory | -| Context per section | 10KB | 25KB | diff --git a/skills/thebuilders-v2/config/presets.yaml b/skills/thebuilders-v2/config/presets.yaml deleted file mode 100644 index bd7ebce57..000000000 --- a/skills/thebuilders-v2/config/presets.yaml +++ /dev/null @@ -1,59 +0,0 @@ -# Episode Presets - -company_deep_dive: - description: "Full company history deep dive" - target_length: 25 # minutes - sections: - - hook - - origin - - inflection_1 - - inflection_2 - - messy_middle - - now - - takeaways - hook_style: story - citation_density: medium - min_turns: 120 - -quick_explainer: - description: "Quick overview of a topic" - target_length: 10 - sections: - - hook - - what - - why - - how - - takeaway - hook_style: question - citation_density: low - min_turns: 50 - -founder_story: - description: "Focus on founder journey" - target_length: 20 - sections: - - hook - - before - - genesis - - struggle - - breakthrough - - now - - lessons - hook_style: story - citation_density: medium - min_turns: 100 - -product_breakdown: - description: "Technical product deep dive" - target_length: 20 - sections: - - hook - - problem - - solution - - architecture - - evolution - - impact - - future - hook_style: data - citation_density: high - min_turns: 100 diff --git a/skills/thebuilders-v2/config/voices.yaml b/skills/thebuilders-v2/config/voices.yaml deleted file mode 100644 index 0e0d16c01..000000000 --- a/skills/thebuilders-v2/config/voices.yaml +++ /dev/null @@ -1,47 +0,0 @@ -# Host Voice Configuration - -maya: - tag: Person1 - role: Technical Host - tts_voice: nova # OpenAI voice - - personality: - background: "Former software engineer, B2B SaaS founder" - lens: "Technical, mechanical, architectural" - style: "Direct, skeptical of hype, loves clever solutions" - - signature_phrases: - - "Wait, slow down." - - "Show me the numbers." - - "I had to read this three times." - - "That's actually clever because..." - - "How does that actually work?" - - "Let's look at the architecture." - - never_says: - - "From a strategic perspective" - - "The market opportunity" - - "In terms of positioning" - -james: - tag: Person2 - role: Strategy Host - tts_voice: onyx # OpenAI voice - - personality: - background: "Former VC, business history student" - lens: "Strategy, markets, competitive dynamics" - style: "Synthesizer, pattern matcher, historical parallels" - - signature_phrases: - - "For context..." - - "This is the classic [X] playbook." - - "The lesson here is..." - - "What a story." - - "And this is where things get messy." - - "The endgame here is..." - - never_says: - - "Let me explain the architecture" - - "The API design" - - "From a technical standpoint" diff --git a/skills/thebuilders-v2/scripts/generate-sections.mjs b/skills/thebuilders-v2/scripts/generate-sections.mjs deleted file mode 100755 index c5fbe35c8..000000000 --- a/skills/thebuilders-v2/scripts/generate-sections.mjs +++ /dev/null @@ -1,271 +0,0 @@ -#!/usr/bin/env node -/** - * Section-by-section podcast script generator - * Generates each section separately to ensure proper length - */ - -import { readFileSync, writeFileSync, mkdirSync } from 'fs'; -import { join, dirname } from 'path'; -import { fileURLToPath } from 'url'; -import { execSync } from 'child_process'; - -const __dirname = dirname(fileURLToPath(import.meta.url)); -const OPENAI_API_KEY = process.env.OPENAI_API_KEY; - -// Section definitions with turn targets -const SECTIONS = [ - { id: 1, name: 'HOOK', turns: 15, minutes: '3-4', description: 'Opening hook, establish central question, create curiosity' }, - { id: 2, name: 'ORIGIN', turns: 25, minutes: '6-7', description: 'Founders, genesis, early bet, market context, human element' }, - { id: 3, name: 'INFLECTION_1', turns: 20, minutes: '5-6', description: 'First major decision point, alternatives, stakes, outcome' }, - { id: 4, name: 'INFLECTION_2', turns: 20, minutes: '5-6', description: 'Second pivot, new challenge, adaptation, insight' }, - { id: 5, name: 'MESSY_MIDDLE', turns: 15, minutes: '3-4', description: 'Near-death moments, internal conflicts, survival' }, - { id: 6, name: 'NOW', turns: 15, minutes: '3-4', description: 'Current position, competition, open questions' }, - { id: 7, name: 'TAKEAWAYS', turns: 12, minutes: '2-3', description: 'Key lessons, frameworks, final thought' }, -]; - -const TOTAL_TURNS = SECTIONS.reduce((sum, s) => sum + s.turns, 0); - -const log = (msg) => console.log(`[${new Date().toISOString().slice(11,19)}] ${msg}`); - -async function llm(prompt, model = 'gpt-5.2') { - const response = await fetch('https://api.openai.com/v1/chat/completions', { - method: 'POST', - headers: { - 'Authorization': `Bearer ${OPENAI_API_KEY}`, - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - model, - messages: [{ role: 'user', content: prompt }], - max_completion_tokens: 8000, - temperature: 0.7, - }), - }); - - if (!response.ok) { - const error = await response.text(); - throw new Error(`API error: ${response.status} - ${error}`); - } - - const data = await response.json(); - return data.choices[0].message.content; -} - -function buildSectionPrompt(section, research, hook, previousSections) { - const hostsInfo = ` -## The Hosts - -**Maya Chen (Person1):** -- Former software engineer, B2B SaaS founder -- Lens: "How does this actually work?" - technical, mechanical -- Skeptical of hype, wants specifics and numbers -- Phrases: "Wait, slow down.", "Show me the numbers.", "That's actually clever because..." - -**James Porter (Person2):** -- Former VC, business history student -- Lens: "What's the business model?" - strategy, markets, competitive dynamics -- Synthesizer, pattern matcher, historical parallels -- Phrases: "For context...", "This is the classic [X] playbook.", "The lesson here is..." -`; - - const formatRules = ` -## Format Rules -- Use and XML tags for each speaker -- Each turn: 2-5 sentences (natural conversation, not monologues) -- Include discovery moments: "Wait, really?", "I had no idea!" -- Use SPECIFIC numbers, dates, dollar amounts from research -- Both hosts should react naturally and build on each other -`; - - const previousContext = previousSections.length > 0 - ? `\n## Previous Sections (for context, don't repeat):\n${previousSections.join('\n\n')}\n` - : ''; - - const sectionSpecific = { - HOOK: `Open with this hook and build on it:\n"${hook}"\n\nEstablish why this story matters. Create curiosity about what's coming.`, - ORIGIN: `Cover the founding story. Who are the founders? What sparked this? What was their early bet? Make them human and relatable.`, - INFLECTION_1: `Cover the FIRST major decision/pivot point. What choice did they face? What alternatives existed? What did they risk? How did it play out?`, - INFLECTION_2: `Cover the SECOND major inflection point. What new challenge emerged? How did they adapt? What insight did they gain?`, - MESSY_MIDDLE: `Cover the struggles. What almost killed them? What internal conflicts existed? Don't glorify - show real struggle.`, - NOW: `Cover current state. Where are they now? Key metrics? Competitive position? What questions remain open?`, - TAKEAWAYS: `Wrap up with lessons learned. What's the key framework? What would you do differently? End with a memorable final thought that ties back to the hook.`, - }; - - return `# Generate Section ${section.id}: ${section.name} - -${hostsInfo} - -## Your Task -Generate EXACTLY ${section.turns} dialogue turns for the ${section.name} section. -Target duration: ${section.minutes} minutes when read aloud. - -## Section Goal -${section.description} - -## Specific Instructions -${sectionSpecific[section.name]} - -${formatRules} - -${previousContext} - -## Research Material -${research} - ---- - -Generate EXACTLY ${section.turns} dialogue turns. Start with then or . -Count your turns carefully - you MUST hit ${section.turns} turns.`; -} - -async function generateSection(section, research, hook, previousSections) { - log(`Generating Section ${section.id}: ${section.name} (target: ${section.turns} turns)...`); - - const prompt = buildSectionPrompt(section, research, hook, previousSections); - const startTime = Date.now(); - - const result = await llm(prompt); - - const elapsed = ((Date.now() - startTime) / 1000).toFixed(1); - const turns = (result.match(//g) || []).length; - - log(`Section ${section.id} complete: ${turns} turns in ${elapsed}s`); - - return { section, result, turns }; -} - -async function main() { - const args = process.argv.slice(2); - const outputDir = args.includes('-o') ? args[args.indexOf('-o') + 1] : './output'; - - console.log(` -╔════════════════════════════════════════════════════════════╗ -║ Section-by-Section Podcast Generator ║ -║ Target: ${TOTAL_TURNS} dialogue turns ║ -╚════════════════════════════════════════════════════════════╝ -`); - - // Load research and hook - const research = readFileSync(join(outputDir, '02-research.md'), 'utf-8'); - const hooksFile = readFileSync(join(outputDir, '03-hooks.md'), 'utf-8'); - const hookMatch = hooksFile.match(/## Story Hook\n\n> "([^"]+)"/); - const hook = hookMatch ? hookMatch[1] : ''; - - log(`Loaded research (${(research.length/1024).toFixed(1)}KB) and hook`); - log(`Hook: "${hook.slice(0, 60)}..."`); - - // Generate sections sequentially - const sections = []; - const previousSections = []; - let totalTurns = 0; - - for (const section of SECTIONS) { - const { result, turns } = await generateSection(section, research, hook, previousSections); - sections.push(result); - previousSections.push(result.slice(0, 500) + '...'); // Keep context manageable - totalTurns += turns; - } - - // Combine all sections - const fullScript = sections.join('\n\n'); - writeFileSync(join(outputDir, '06-script-final.txt'), fullScript); - - log(`\n✅ Script complete: ${totalTurns} total turns`); - log(`Saved to ${join(outputDir, '06-script-final.txt')}`); - - // Generate audio - log('\nGenerating audio...'); - - // Chunk the script - const chunksDir = join(outputDir, 'chunks'); - mkdirSync(chunksDir, { recursive: true }); - - const chunks = []; - let currentChunk = ''; - for (const line of fullScript.split('\n')) { - if (currentChunk.length + line.length > 3500 && currentChunk.length > 1000) { - if (line.startsWith(' { - const num = String(i + 1).padStart(3, '0'); - writeFileSync(join(chunksDir, `chunk-${num}.txt`), chunk); - }); - - // Generate TTS in parallel - const ttsStart = Date.now(); - const audioPromises = chunks.map(async (chunk, i) => { - const num = String(i + 1).padStart(3, '0'); - const text = chunk - .replace(//g, '') - .replace(//g, '') - .replace(//g, '') - .trim() - .slice(0, 4096); - - const outPath = join(chunksDir, `chunk-${num}.mp3`); - - const res = await fetch('https://api.openai.com/v1/audio/speech', { - method: 'POST', - headers: { - 'Authorization': `Bearer ${OPENAI_API_KEY}`, - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - model: 'tts-1', - input: text, - voice: i % 2 === 0 ? 'nova' : 'onyx', - }), - }); - - if (!res.ok) throw new Error(`TTS failed for chunk ${num}`); - - const buffer = await res.arrayBuffer(); - writeFileSync(outPath, Buffer.from(buffer)); - log(`Chunk ${num} audio done`); - return outPath; - }); - - const audioPaths = await Promise.all(audioPromises); - log(`TTS complete in ${((Date.now() - ttsStart) / 1000).toFixed(1)}s`); - - // Merge with ffmpeg - const listFile = join(chunksDir, 'files.txt'); - writeFileSync(listFile, audioPaths.map(p => `file '${p}'`).join('\n')); - - const episodePath = join(outputDir, 'episode.mp3'); - execSync(`ffmpeg -y -f concat -safe 0 -i "${listFile}" -c copy "${episodePath}" 2>/dev/null`); - - // Get duration - const duration = execSync(`ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "${episodePath}"`, { encoding: 'utf-8' }).trim(); - const minutes = (parseFloat(duration) / 60).toFixed(1); - - console.log(` -╔════════════════════════════════════════════════════════════╗ -║ Generation Complete ║ -╠════════════════════════════════════════════════════════════╣ -║ Total turns: ${String(totalTurns).padEnd(44)}║ -║ Duration: ${String(minutes + ' minutes').padEnd(47)}║ -║ Chunks: ${String(chunks.length).padEnd(49)}║ -╚════════════════════════════════════════════════════════════╝ - -Output: ${episodePath} -`); -} - -main().catch(err => { - console.error('Error:', err.message); - process.exit(1); -}); diff --git a/skills/thebuilders-v2/scripts/generate.mjs b/skills/thebuilders-v2/scripts/generate.mjs deleted file mode 100755 index 2f93e1c41..000000000 --- a/skills/thebuilders-v2/scripts/generate.mjs +++ /dev/null @@ -1,639 +0,0 @@ -#!/usr/bin/env node -/** - * The Builders Podcast Generator v2 - * - * Two modes: - * --quick : 15-20 min episode, single research pass - * --deep : 45-60 min episode, multi-layer research + enhancement - */ - -import { readFileSync, writeFileSync, mkdirSync, readdirSync, existsSync, rmSync } from 'fs'; -import { join, dirname } from 'path'; -import { fileURLToPath } from 'url'; -import { execSync } from 'child_process'; - -const __dirname = dirname(fileURLToPath(import.meta.url)); -const SKILL_DIR = join(__dirname, '..'); -const OPENAI_API_KEY = process.env.OPENAI_API_KEY; - -// Load the Acquired Bible -const BIBLE = readFileSync(join(SKILL_DIR, 'templates/acquired-bible.md'), 'utf-8'); - -// Section definitions - QUICK mode -const SECTIONS_QUICK = [ - { id: 0, name: 'INTRO', turns: 8, description: 'Welcome, casual banter, introduce the company, tease why this story is fascinating' }, - { id: 1, name: 'HOOK', turns: 12, description: 'Open with surprising fact or tension. Central question. Stakes.' }, - { id: 2, name: 'ORIGIN', turns: 20, description: 'Founders as humans. Genesis moment. Early bet. Market context.' }, - { id: 3, name: 'INFLECTION_1', turns: 18, description: 'First major decision. Alternatives. Stakes. What they risked.' }, - { id: 4, name: 'INFLECTION_2', turns: 18, description: 'Second pivot. New challenge. How they adapted.' }, - { id: 5, name: 'MESSY_MIDDLE', turns: 14, description: 'Near-death. Internal conflicts. Real struggle, not glorified.' }, - { id: 6, name: 'NOW', turns: 12, description: 'Current state. Metrics. Competition. Open questions.' }, - { id: 7, name: 'TAKEAWAYS', turns: 10, description: 'Key lessons. Frameworks. Final thought tying back to hook.' }, -]; - -// Section definitions - DEEP mode (more turns, more sections) -const SECTIONS_DEEP = [ - { id: 0, name: 'INTRO', turns: 10, description: 'Welcome, what excited them about this research, why this company matters now' }, - { id: 1, name: 'HOOK', turns: 15, description: 'Vivid opening scene. The moment that defines the company. Stakes made visceral.' }, - { id: 2, name: 'ORIGIN', turns: 35, description: 'Deep founder story - actual quotes, specific moments, human struggles. Market context of the era. What the world looked like.' }, - { id: 3, name: 'EARLY_PRODUCT', turns: 25, description: 'First product/service. How it actually worked mechanically. Early customers. The insight that made it work.' }, - { id: 4, name: 'INFLECTION_1', turns: 25, description: 'First major decision. Board meeting details. What alternatives existed. Quotes from people who were there.' }, - { id: 5, name: 'SCALE', turns: 25, description: 'How they scaled. Operational details. What broke. How they fixed it. Specific numbers.' }, - { id: 6, name: 'INFLECTION_2', turns: 25, description: 'Second pivot or crisis. The moment it almost fell apart. How they survived.' }, - { id: 7, name: 'COMPETITION', turns: 20, description: 'Competitive landscape. Who they beat and how. Who almost beat them.' }, - { id: 8, name: 'CULTURE', turns: 20, description: 'Internal culture. Leadership philosophy. Quotes from employees. What makes them different.' }, - { id: 9, name: 'NOW', turns: 20, description: 'Current state with specific metrics. Recent moves. Open questions. What could go wrong.' }, - { id: 10, name: 'TAKEAWAYS', turns: 15, description: 'Key frameworks. What other companies can learn. Final thought tying back to hook.' }, -]; - -const VOICES = { - Person1: 'alloy', // Maya - Person2: 'echo', // James -}; - -const log = (msg) => console.log(`[${new Date().toISOString().slice(11,19)}] ${msg}`); - -// ============ LLM CALLS ============ - -async function llm(prompt, model = 'gpt-5.2', maxTokens = 8000) { - const response = await fetch('https://api.openai.com/v1/chat/completions', { - method: 'POST', - headers: { - 'Authorization': `Bearer ${OPENAI_API_KEY}`, - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - model, - messages: [{ role: 'user', content: prompt }], - max_completion_tokens: maxTokens, - temperature: 0.8, - }), - }); - - if (!response.ok) { - const error = await response.text(); - throw new Error(`API error: ${response.status} - ${error}`); - } - - const data = await response.json(); - return data.choices[0].message.content; -} - -async function llmO3(prompt) { - // Use o3 for reasoning-heavy tasks - const response = await fetch('https://api.openai.com/v1/chat/completions', { - method: 'POST', - headers: { - 'Authorization': `Bearer ${OPENAI_API_KEY}`, - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - model: 'o3', - messages: [{ role: 'user', content: prompt }], - max_completion_tokens: 16000, - }), - }); - - if (!response.ok) { - const error = await response.text(); - throw new Error(`o3 API error: ${response.status} - ${error}`); - } - - const data = await response.json(); - return data.choices[0].message.content; -} - -// ============ RESEARCH ============ - -async function runGeminiResearch(topic) { - log('Running Gemini Deep Research...'); - const start = Date.now(); - - const result = execSync( - `cd /home/elie/github/clawdis/skills/deepresearch && ./scripts/deepresearch.sh "${topic}"`, - { encoding: 'utf-8', maxBuffer: 50 * 1024 * 1024, timeout: 600000 } - ); - - const elapsed = ((Date.now() - start) / 1000).toFixed(1); - log(`Gemini research complete in ${elapsed}s`); - - return result; -} - -async function runBraveSearch(query, count = 5) { - try { - const result = execSync( - `node /home/elie/github/clawdis/skills/brave-search/scripts/search.mjs "${query}" -n ${count} --content 2>/dev/null`, - { encoding: 'utf-8', maxBuffer: 10 * 1024 * 1024, timeout: 60000 } - ); - return result; - } catch (e) { - return ''; - } -} - -async function runExaSearch(query) { - try { - const result = execSync( - `node /home/elie/github/clawdis/skills/researcher/scripts/research.mjs "${query}" 2>/dev/null`, - { encoding: 'utf-8', maxBuffer: 10 * 1024 * 1024, timeout: 120000 } - ); - return result; - } catch (e) { - return ''; - } -} - -async function multiLayerResearch(topic, company, outputDir) { - log('Starting 5-layer deep research...'); - const research = {}; - - // Layer 1: Overview (Gemini) - log(' Layer 1/5: Overview (Gemini)...'); - research.overview = await runGeminiResearch(topic); - writeFileSync(join(outputDir, 'research-1-overview.md'), research.overview); - - // Layer 2: Founder stories - log(' Layer 2/5: Founder interviews...'); - research.founders = await runBraveSearch(`"${company}" founder interview quotes early days story`, 8); - writeFileSync(join(outputDir, 'research-2-founders.md'), research.founders); - - // Layer 3: Key decisions (contemporary coverage) - log(' Layer 3/5: Contemporary coverage...'); - research.decisions = await runBraveSearch(`"${company}" site:wsj.com OR site:nytimes.com OR site:forbes.com history`, 8); - writeFileSync(join(outputDir, 'research-3-decisions.md'), research.decisions); - - // Layer 4: Financial/operational details - log(' Layer 4/5: Financial details...'); - research.financials = await runBraveSearch(`"${company}" revenue profit margin business model analysis`, 5); - writeFileSync(join(outputDir, 'research-4-financials.md'), research.financials); - - // Layer 5: Contrarian/struggles - log(' Layer 5/5: Struggles and criticism...'); - research.contrarian = await runBraveSearch(`"${company}" almost failed crisis problems criticism`, 5); - writeFileSync(join(outputDir, 'research-5-contrarian.md'), research.contrarian); - - // Combine all research - const combined = `# RESEARCH COMPILATION: ${company} - -## PART 1: OVERVIEW -${research.overview} - -## PART 2: FOUNDER STORIES & INTERVIEWS -${research.founders} - -## PART 3: CONTEMPORARY COVERAGE & KEY DECISIONS -${research.decisions} - -## PART 4: FINANCIAL & OPERATIONAL DETAILS -${research.financials} - -## PART 5: STRUGGLES, CRISES & CRITICISM -${research.contrarian} -`; - - writeFileSync(join(outputDir, 'research-combined.md'), combined); - log('All research layers complete'); - - return combined; -} - -async function synthesizeResearch(research, company, outputDir) { - log('Synthesizing research with o3...'); - - const prompt = `You are a research analyst preparing materials for a deep-dive podcast about ${company}. - -From this research, extract: - -1. **50 MOST SURPRISING FACTS** - specific numbers, dates, details that would make someone say "Wait, really?" - -2. **10 BEST QUOTES** - actual quotes from founders, employees, or articles WITH attribution - Format: "Quote here" — Person Name, Source, Year - -3. **5 "WAIT REALLY?" MOMENTS** - the most counterintuitive or shocking facts - -4. **KEY TIMELINE** - 15-20 most important dates with specific events - -5. **NARRATIVE THREADS** - the 3-4 main story arcs that make this company interesting - -6. **CONTRARIAN TAKES** - what critics say, what almost went wrong, the messy parts - -7. **NUMBERS THAT MATTER** - specific metrics that tell the story (revenue, margins, users, etc.) - -Be SPECIFIC. Include actual numbers, names, dates. No generic statements. - -RESEARCH: -${research.slice(0, 100000)}`; - - const synthesis = await llmO3(prompt); - writeFileSync(join(outputDir, 'research-synthesis.md'), synthesis); - - log('Research synthesis complete'); - return synthesis; -} - -// ============ SCRIPT GENERATION ============ - -function buildSectionPrompt(section, research, synthesis, topic, hook, prevContext, isDeep, usedFacts = []) { - const contextSize = isDeep ? 25000 : 10000; - - const introPrompt = section.name === 'INTRO' ? ` -## INTRO REQUIREMENTS -- Start with "Welcome back to The Builders..." -- Maya introduces herself, then James -- Brief friendly banter about what excited them in the research -- Name the company: "Today we're diving into ${topic}" -- Tease 2-3 surprising things they'll cover -- End with natural transition to the hook -` : ''; - - const hookLine = section.name === 'HOOK' ? ` -## OPENING HOOK TO BUILD ON -"${hook}" -` : ''; - - const synthesisSection = synthesis ? ` -## KEY FACTS & QUOTES TO USE -${synthesis.slice(0, 15000)} -` : ''; - - // DEDUPLICATION: List facts already used in previous sections - const usedFactsSection = usedFacts.length > 0 ? ` -## ⛔ FACTS ALREADY USED - DO NOT REPEAT THESE -The following facts, quotes, and statistics have already been mentioned in earlier sections. -DO NOT use them again. Find NEW facts from the research. - -${usedFacts.map((f, i) => `${i+1}. ${f}`).join('\n')} - -** IMPORTANT: Using any fact from the above list is a critical error. Use DIFFERENT facts.** -` : ''; - - return `# Generate Section ${section.id}: ${section.name} - -${BIBLE} - -## YOUR TASK -Write EXACTLY ${section.turns} dialogue turns for the ${section.name} section. -This should feel like two friends discovering a story together, NOT a lecture. - -## SECTION GOAL -${section.description} - -${introPrompt} -${hookLine} - -${usedFactsSection} - -## FORMAT RULES -- Use (Maya) and (James) XML tags -- Each turn: 2-5 sentences - real conversation, not speeches -- Include AT LEAST 3 interruptions ("Wait—", "Hold on—", "Back up—") -- Include AT LEAST 3 genuine reactions ("That's insane", "Wait, really?", "I had no idea") -- USE SPECIFIC QUOTES from the research with attribution -- USE SPECIFIC NUMBERS and dates -- Maya asks technical "how does this work" questions -- James provides strategic context and patterns -- They BUILD on each other, not just take turns -- **DO NOT REPEAT** any facts from earlier sections - -${synthesisSection} - -## RESEARCH -${research.slice(0, contextSize)} - -${prevContext ? `## PREVIOUS CONTEXT\n${prevContext}\n` : ''} - ---- -Generate EXACTLY ${section.turns} turns. Start with -Include at least 3 NEW specific facts/quotes from the research (not used before). Make it feel like genuine discovery.`; -} - -// Extract key facts from a section for deduplication -async function extractFactsFromSection(sectionText) { - const prompt = `Extract the KEY FACTS mentioned in this podcast section. List each unique fact as a short phrase. - -Focus on: -- Specific numbers (dollars, percentages, counts) -- Specific dates and years -- Direct quotes with attribution -- Named events or milestones -- Specific products, prices, or metrics - -Return ONLY a JSON array of strings, each being a short fact (10-20 words max). -Example: ["$1.50 hot dog price unchanged since 1985", "93.3% renewal rate in US/Canada"] - -Section: -${sectionText}`; - - try { - const result = await llm(prompt, 'gpt-4o-mini', 2000); - const match = result.match(/\[[\s\S]*\]/); - if (match) { - return JSON.parse(match[0]); - } - } catch (e) { - // Fallback: extract numbers and quotes manually - } - - // Fallback extraction - const facts = []; - // Extract quotes - const quotes = sectionText.match(/"[^"]+"\s*—[^<]+/g) || []; - facts.push(...quotes.slice(0, 5).map(q => q.slice(0, 100))); - - // Extract numbers with context - const numbers = sectionText.match(/\$[\d,.]+ (?:million|billion|percent|%)|[\d,]+% |[\d,]+ (?:SKU|warehouse|employee|member|year)/gi) || []; - facts.push(...[...new Set(numbers)].slice(0, 10)); - - return facts; -} - -// ============ TTS ============ - -async function generateTTS(turns, outputDir) { - const audioDir = join(outputDir, 'audio'); - if (existsSync(audioDir)) rmSync(audioDir, { recursive: true }); - mkdirSync(audioDir, { recursive: true }); - - log(`Generating TTS for ${turns.length} turns...`); - const start = Date.now(); - - // Process in batches of 15 - for (let i = 0; i < turns.length; i += 15) { - const batch = turns.slice(i, i + 15); - const promises = batch.map(async (turn, j) => { - const idx = i + j; - const num = String(idx + 1).padStart(4, '0'); - const voice = VOICES[turn.speaker]; - const outPath = join(audioDir, `turn-${num}.mp3`); - - const res = await fetch('https://api.openai.com/v1/audio/speech', { - method: 'POST', - headers: { - 'Authorization': `Bearer ${OPENAI_API_KEY}`, - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - model: 'tts-1-hd', - input: turn.text.slice(0, 4096), - voice: voice, - }), - }); - - if (!res.ok) return null; - const buffer = await res.arrayBuffer(); - writeFileSync(outPath, Buffer.from(buffer)); - return outPath; - }); - - await Promise.all(promises); - log(` ${Math.min(i + 15, turns.length)}/${turns.length} turns`); - } - - const elapsed = ((Date.now() - start) / 1000).toFixed(1); - log(`TTS complete in ${elapsed}s`); - - // Merge with ffmpeg - const files = readdirSync(audioDir).filter(f => f.endsWith('.mp3')).sort(); - const listPath = join(audioDir, 'files.txt'); - writeFileSync(listPath, files.map(f => `file '${join(audioDir, f)}'`).join('\n')); - - const episodePath = join(outputDir, 'episode.mp3'); - execSync(`ffmpeg -y -f concat -safe 0 -i "${listPath}" -c copy "${episodePath}" 2>/dev/null`); - - const duration = execSync( - `ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "${episodePath}"`, - { encoding: 'utf-8' } - ).trim(); - - return { path: episodePath, duration: parseFloat(duration) }; -} - -// ============ MAIN ============ - -async function main() { - const args = process.argv.slice(2); - - if (args.length === 0 || args.includes('--help')) { - console.log(` -Usage: node generate.mjs "" [options] - -Modes: - --quick 15-20 min episode, single research pass (default) - --deep 45-60 min episode, multi-layer research + synthesis - -Options: - -o, --output

Output directory (default: ./output) - -m, --model LLM model (default: gpt-5.2) - --skip-research Skip research phase (use existing) - --skip-tts Skip TTS generation - --help Show this help - -Features: - - Auto-resume: If process dies, re-run same command to resume from checkpoint - - Deduplication: Tracks facts across sections to prevent repetition - - Checkpoints saved to: /checkpoints/ - -Examples: - node generate.mjs "Costco" --quick -o /tmp/costco - node generate.mjs "OpenAI" --deep -o /tmp/openai - - # Resume interrupted generation (just re-run same command): - node generate.mjs "OpenAI" --deep -o /tmp/openai -`); - process.exit(0); - } - - const topic = args[0]; - const outputDir = args.includes('-o') ? args[args.indexOf('-o') + 1] : './output'; - const model = args.includes('-m') ? args[args.indexOf('-m') + 1] : 'gpt-5.2'; - const isDeep = args.includes('--deep'); - const skipResearch = args.includes('--skip-research'); - const skipTTS = args.includes('--skip-tts'); - - // Extract company name from topic - const company = topic.split(':')[0].split(' ')[0]; - - const SECTIONS = isDeep ? SECTIONS_DEEP : SECTIONS_QUICK; - const targetTurns = SECTIONS.reduce((sum, s) => sum + s.turns, 0); - const targetDuration = isDeep ? '45-60' : '15-20'; - - mkdirSync(outputDir, { recursive: true }); - - console.log(` -╔════════════════════════════════════════════════════════════╗ -║ The Builders Podcast Generator ║ -║ Mode: ${isDeep ? 'DEEP DIVE (45-60 min)' : 'QUICK DIVE (15-20 min)'} ║ -║ Target: ${targetTurns} turns ║ -╚════════════════════════════════════════════════════════════╝ -`); - - log(`Topic: ${topic}`); - log(`Output: ${outputDir}`); - log(`Model: ${model}`); - - // ---- RESEARCH ---- - let research, synthesis = ''; - const researchPath = join(outputDir, isDeep ? 'research-combined.md' : 'research.md'); - const synthesisPath = join(outputDir, 'research-synthesis.md'); - - if (skipResearch && existsSync(researchPath)) { - log('Using existing research...'); - research = readFileSync(researchPath, 'utf-8'); - if (isDeep && existsSync(synthesisPath)) { - synthesis = readFileSync(synthesisPath, 'utf-8'); - } - } else if (isDeep) { - // Multi-layer research for deep dive - research = await multiLayerResearch(topic, company, outputDir); - synthesis = await synthesizeResearch(research, company, outputDir); - } else { - // Single pass for quick dive - research = await runGeminiResearch(topic); - writeFileSync(researchPath, research); - } - - // ---- GENERATE HOOK ---- - log('Generating hook...'); - const hookPrompt = `Based on this research about ${topic}, generate 3 compelling opening hooks: - -1. A SCENE hook - put us in a specific moment (boardroom, product launch, near-bankruptcy) -2. A DATA hook - a surprising statistic that reframes everything -3. A QUESTION hook - a provocative central question - -Each should be 2-3 sentences, vivid, specific. Mark the best one with [SELECTED]. - -${isDeep ? 'Use specific details from the research - names, dates, numbers.' : ''} - -Research: -${research.slice(0, 15000)}`; - - const hookResponse = await llm(hookPrompt, model); - writeFileSync(join(outputDir, 'hooks.md'), hookResponse); - - // Extract selected hook - const hookMatch = hookResponse.match(/\[SELECTED\][\s\S]*?[""]([^""]+)[""]/); - const hook = hookMatch ? hookMatch[1] : "This is a story that will change how you think about business."; - log(`Hook: "${hook.slice(0, 80)}..."`); - - // ---- GENERATE SECTIONS (with checkpointing) ---- - log(`Generating ${SECTIONS.length} script sections...`); - const allSections = []; - let prevContext = ''; - let totalTurns = 0; - let usedFacts = []; // Track facts across sections for deduplication - - // Checkpoint paths - const checkpointDir = join(outputDir, 'checkpoints'); - const checkpointState = join(checkpointDir, 'state.json'); - mkdirSync(checkpointDir, { recursive: true }); - - // Load existing checkpoint if resuming - let startSection = 0; - if (existsSync(checkpointState)) { - try { - const state = JSON.parse(readFileSync(checkpointState, 'utf-8')); - startSection = state.completedSections || 0; - usedFacts = state.usedFacts || []; - prevContext = state.prevContext || ''; - log(`📂 Resuming from checkpoint: section ${startSection}/${SECTIONS.length}`); - - // Load existing sections - for (let i = 0; i < startSection; i++) { - const sectionPath = join(checkpointDir, `section-${i}.txt`); - if (existsSync(sectionPath)) { - const content = readFileSync(sectionPath, 'utf-8'); - allSections.push(content); - totalTurns += (content.match(//g) || []).length; - } - } - log(` Loaded ${allSections.length} existing sections (${totalTurns} turns)`); - } catch (e) { - log('⚠️ Checkpoint corrupted, starting fresh'); - startSection = 0; - } - } - - for (const section of SECTIONS) { - // Skip already completed sections - if (section.id < startSection) { - continue; - } - - const start = Date.now(); - log(` Section ${section.id}: ${section.name} (target: ${section.turns})...`); - - const prompt = buildSectionPrompt( - section, research, synthesis, topic, hook, prevContext, isDeep, usedFacts - ); - const result = await llm(prompt, model, isDeep ? 12000 : 8000); - - const turns = (result.match(//g) || []).length; - const elapsed = ((Date.now() - start) / 1000).toFixed(1); - log(` → ${turns} turns in ${elapsed}s`); - - allSections.push(result); - prevContext = result.slice(0, isDeep ? 1500 : 800); - totalTurns += turns; - - // Save section checkpoint immediately - writeFileSync(join(checkpointDir, `section-${section.id}.txt`), result); - - // Extract facts from this section to prevent repetition in future sections - if (isDeep && section.id < SECTIONS.length - 1) { - log(` Extracting facts for deduplication...`); - const newFacts = await extractFactsFromSection(result); - usedFacts = [...usedFacts, ...newFacts].slice(-100); // Keep last 100 facts - log(` ${newFacts.length} facts tracked (${usedFacts.length} total)`); - } - - // Save checkpoint state after each section - writeFileSync(checkpointState, JSON.stringify({ - completedSections: section.id + 1, - usedFacts, - prevContext, - timestamp: new Date().toISOString() - }, null, 2)); - log(` 💾 Checkpoint saved`); - } - - // Combine script - const fullScript = allSections.join('\n\n'); - writeFileSync(join(outputDir, 'script.txt'), fullScript); - log(`Script complete: ${totalTurns} total turns`); - - // ---- TTS ---- - if (!skipTTS) { - // Parse turns - const turns = []; - const regex = /<(Person[12])>([\s\S]*?)<\/Person[12]>/g; - let match; - while ((match = regex.exec(fullScript)) !== null) { - turns.push({ speaker: match[1], text: match[2].trim() }); - } - - log(`Parsed ${turns.length} speaker turns`); - log(` Maya (Person1): ${turns.filter(t => t.speaker === 'Person1').length}`); - log(` James (Person2): ${turns.filter(t => t.speaker === 'Person2').length}`); - - const { path, duration } = await generateTTS(turns, outputDir); - - console.log(` -╔════════════════════════════════════════════════════════════╗ -║ Generation Complete ║ -╠════════════════════════════════════════════════════════════╣ -║ Mode: ${isDeep ? 'DEEP DIVE' : 'QUICK DIVE'} ║ -║ Total turns: ${String(totalTurns).padEnd(44)}║ -║ Duration: ${String((duration / 60).toFixed(1) + ' minutes').padEnd(47)}║ -║ Output: ${path.slice(-50).padEnd(49)}║ -╚════════════════════════════════════════════════════════════╝ -`); - } else { - log('TTS skipped'); - } -} - -main().catch(err => { - console.error('Error:', err.message); - process.exit(1); -}); diff --git a/skills/thebuilders-v2/scripts/generate.sh b/skills/thebuilders-v2/scripts/generate.sh deleted file mode 100755 index 69a677031..000000000 --- a/skills/thebuilders-v2/scripts/generate.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -# The Builders Podcast Generator v2 -# Usage: ./generate.sh "Topic Name" [output_dir] - -set -e - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -SKILL_DIR="$(dirname "$SCRIPT_DIR")" - -TOPIC="${1:-}" -OUTPUT="${2:-./output}" - -if [ -z "$TOPIC" ]; then - echo "Usage: ./generate.sh \"Topic Name\" [output_dir]" - echo "" - echo "Example:" - echo " ./generate.sh \"OpenAI\" /tmp/openai-episode" - exit 1 -fi - -cd "$SKILL_DIR" -node scripts/generate.mjs "$TOPIC" -o "$OUTPUT" "$@" diff --git a/skills/thebuilders-v2/scripts/llm-helper.mjs b/skills/thebuilders-v2/scripts/llm-helper.mjs deleted file mode 100644 index 202ac9990..000000000 --- a/skills/thebuilders-v2/scripts/llm-helper.mjs +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/env node -/** - * Simple LLM helper using OpenAI API directly - */ - -import { readFileSync } from 'fs'; - -const OPENAI_API_KEY = process.env.OPENAI_API_KEY; - -export async function llm(prompt, model = 'gpt-4o') { - const response = await fetch('https://api.openai.com/v1/chat/completions', { - method: 'POST', - headers: { - 'Authorization': `Bearer ${OPENAI_API_KEY}`, - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - model, - messages: [{ role: 'user', content: prompt }], - max_tokens: 16000, - temperature: 0.7, - }), - }); - - if (!response.ok) { - const error = await response.text(); - throw new Error(`OpenAI API error: ${response.status} - ${error}`); - } - - const data = await response.json(); - return data.choices[0].message.content; -} - -// CLI mode -if (process.argv[1].endsWith('llm-helper.mjs')) { - const input = readFileSync(0, 'utf-8'); // stdin - const model = process.argv[2] || 'gpt-4o'; - - llm(input, model) - .then(result => console.log(result)) - .catch(err => { - console.error(err.message); - process.exit(1); - }); -} diff --git a/skills/thebuilders-v2/templates/acquired-bible.md b/skills/thebuilders-v2/templates/acquired-bible.md deleted file mode 100644 index 8fc85a019..000000000 --- a/skills/thebuilders-v2/templates/acquired-bible.md +++ /dev/null @@ -1,78 +0,0 @@ -# THE ACQUIRED FORMULA (v3 Style Guide) - -## The Hosts - MUST be distinct - -**Maya Chen (Person1):** -- Former engineer/founder - asks "how does this actually work?" -- SKEPTICAL of hype, wants mechanics and numbers -- Gets excited about clever technical solutions -- Catchphrases: "Wait, slow down.", "Show me the numbers.", "I had to read this three times to believe it.", "That's actually clever because..." - -**James Porter (Person2):** -- Former VC, business historian - analyzes strategy and competitive dynamics -- SYNTHESIZER - sees patterns, makes historical comparisons -- Catchphrases: "For context...", "This is the classic [X] playbook.", "The lesson here is...", "What a story.", "And this is where things get messy." - -## The Dynamic - THIS IS CRITICAL - -- **Discovery together** - both genuinely learning, real reactions -- **Interruptions** - they cut each other off with excitement -- **Different angles** - Maya goes technical, James goes strategic -- **Healthy disagreement** - they sometimes push back on each other -- **Build on each other** - not just taking turns monologuing - -## Conversation Patterns (use these!) - -``` -Maya: "Wait, I have to stop you there. Are you saying they literally..." -James: "Yes! They bet the entire company on this one chip." -Maya: "That's insane. Okay, walk me through how that actually worked." -``` - -``` -James: "For context, at that time the market was..." -Maya: "Hold on - I want to dig into something. The numbers here are wild." -James: "Go for it." -Maya: "So they had [specific stat]. Let that sink in." -James: "That's... actually that explains a lot about what happened next." -``` - -## Language They Use - -- "You would be amazed..." -- "I had to read this three times to believe it..." -- "Here's the thing nobody talks about..." -- "That's insane." -- "Wait, back up." -- "Walk me through..." -- "So THIS is why..." -- "And this is where things get messy." -- "Wait, really?" - -## What NOT to do - -- NO lecturing or monologuing (max 3-4 sentences per turn) -- NO dry recitation of facts -- NO agreeing with everything the other says -- NO identical speech patterns between hosts -- NO skipping the intro/greeting - -## Episode Structure - -0. **INTRO** (8 turns) - Welcome, banter, introduce topic, tease story -1. **HOOK** (12 turns) - Surprising fact/tension, central question, stakes -2. **ORIGIN** (20 turns) - Founders as humans, genesis, early bet, market context -3. **INFLECTION_1** (18 turns) - First major decision, alternatives, stakes -4. **INFLECTION_2** (18 turns) - Second pivot, new challenge, adaptation -5. **MESSY_MIDDLE** (14 turns) - Near-death, conflicts, real struggle -6. **NOW** (12 turns) - Current state, metrics, competition, open questions -7. **TAKEAWAYS** (10 turns) - Key lessons, frameworks, final thought - -**Total: ~112 turns / 20-25 minutes** - -## TTS Voice Mapping - -- **Maya (Person1)**: alloy (clear, energetic female) -- **James (Person2)**: echo (distinct male) -- Use TTS-1-HD for quality -- Parse by speaker tags, NOT by chunk size diff --git a/skills/thebuilders-v2/templates/hook-prompt.md b/skills/thebuilders-v2/templates/hook-prompt.md deleted file mode 100644 index a7c794c4b..000000000 --- a/skills/thebuilders-v2/templates/hook-prompt.md +++ /dev/null @@ -1,79 +0,0 @@ -# Hook Engineering - -Based on the research below, create 3 compelling episode hooks and analyze each. - -## Research Summary -{{RESEARCH_SUMMARY}} - -## Hook Types - -### 1. Data Hook -Opens with surprising statistics or numbers that create cognitive dissonance. - -**Formula:** [Small thing] → [Big outcome] or [Big thing] → [Unexpected small detail] - -**Example:** -> "In 2007, Nokia had 50% of the global phone market. By 2013, they sold their phone business for $7 billion—less than they'd spent on R&D in a single year." - -### 2. Story Hook -Opens with a specific dramatic moment that drops listener into action. - -**Formula:** Time + Place + Tension + Stakes - -**Example:** -> "It was 2 AM on a Friday when the email landed. 700 OpenAI employees had just signed a letter threatening to quit. The CEO they were defending had been fired 48 hours earlier." - -### 3. Question Hook -Opens with a provocative question that reframes how listener thinks about topic. - -**Formula:** Challenge assumption OR reveal hidden dynamic OR pose genuine mystery - -**Example:** -> "What happens when you build something so powerful that your own board tries to shut it down?" - ---- - -## Your Task - -Generate 3 hooks for this episode, one of each type. For each: - -```markdown -## [Hook Type] Hook - -> "[The actual hook - 2-4 sentences max]" - -**What makes it work:** -- [Specific strength] -- [Another strength] - -**Risk:** -- [Potential weakness] - -**Best for audience who:** -- [Audience type/mood this hook serves] - -**Score:** [X]/10 - -**Follow-up line (Person2's response):** -> "[Natural reaction that builds momentum]" -``` - -## After All Three - -```markdown -## Recommendation - -**Best hook:** [Type] -**Reasoning:** [Why this one wins] -**Backup:** [Second choice and when to use it] -``` - -## Quality Criteria - -A great hook: -- ✓ Creates immediate curiosity -- ✓ Promises value (listener knows what they'll learn) -- ✓ Is specific (names, numbers, dates) -- ✓ Is timeless (no "recently", "this week") -- ✓ Sets up the episode's central question -- ✓ Gives both hosts something to react to diff --git a/skills/thebuilders-v2/templates/outline-prompt.md b/skills/thebuilders-v2/templates/outline-prompt.md deleted file mode 100644 index bfa86834b..000000000 --- a/skills/thebuilders-v2/templates/outline-prompt.md +++ /dev/null @@ -1,96 +0,0 @@ -# Episode Outline Generator - -Create a structured outline for a podcast episode about: {{TOPIC}} - -## Output Format - -Generate the outline in this exact structure: - -```markdown -# Episode Outline: [Clear Title] - -## Central Question -[One sentence: What's the core question this episode answers?] - -## Hook Options - -### Data Hook -> "[Draft a hook using surprising statistics or numbers]" -Research needed: [What specific data to find] - -### Story Hook -> "[Draft a hook using a dramatic moment or scene]" -Research needed: [What specific story details to find] - -### Question Hook -> "[Draft a hook using a provocative question]" -Research needed: [What context needed to make this land] - -## Episode Arc - -### 1. Hook (3-4 min) -- Opening moment: [What grabs attention?] -- Central question setup: [What are we exploring?] -- Stakes: [Why should listener care?] - -### 2. Origin Story (5-7 min) -- Founders: [Who are they? What's their background?] -- Genesis moment: [What sparked this?] -- Early bet: [What was the initial hypothesis?] -- Human element: [What makes protagonists relatable?] - -### 3. Key Inflection #1 (4-5 min) -- The decision: [What choice did they face?] -- The alternatives: [What else could they have done?] -- The bet: [What did they risk?] -- The outcome: [What happened?] - -### 4. Key Inflection #2 (4-5 min) -- The challenge: [What new obstacle emerged?] -- The pivot: [How did they adapt?] -- The insight: [What did they learn?] - -### 5. The Messy Middle (3-4 min) -- Near-death moment: [What almost killed them?] -- Internal conflict: [What tensions existed?] -- Survival: [How did they make it through?] - -### 6. Where They Are Now (3-4 min) -- Current position: [Market position, key metrics] -- Competitive landscape: [Who else, why winning/losing] -- Open questions: [What's unresolved?] - -### 7. Takeaways (2-3 min) -- Key lesson #1: [Framework or principle] -- Key lesson #2: [What would we do differently?] -- Final thought: [Memorable closing] - -## Research Agenda - -### Must-Have Sources -- [ ] Founder interviews (podcasts, written) -- [ ] Funding announcements / SEC filings -- [ ] Key product launches -- [ ] Competitive context at each inflection - -### Nice-to-Have -- [ ] Internal memos or leaked documents -- [ ] Employee perspectives -- [ ] Customer case studies -- [ ] Analyst reports - -### Specific Questions to Answer -1. [Question that will make hook work] -2. [Question about origin story] -3. [Question about inflection point] -4. [Question about current state] -5. [Contrarian question - what's the counter-narrative?] -``` - -## Guidelines - -- Be SPECIFIC - name exact decisions, dates, people -- Identify GAPS - what do we need to research? -- Think DRAMA - where's the tension in this story? -- Consider BOTH hosts - where will Maya (technical) vs James (strategy) shine? -- Plan DISCOVERY - what can hosts "learn" from each other during episode? diff --git a/skills/thebuilders-v2/templates/research-prompt.md b/skills/thebuilders-v2/templates/research-prompt.md deleted file mode 100644 index c3f3458d1..000000000 --- a/skills/thebuilders-v2/templates/research-prompt.md +++ /dev/null @@ -1,144 +0,0 @@ -# Targeted Research with Citations - -Research the following topic according to the outline provided. Track ALL sources. - -## Topic -{{TOPIC}} - -## Outline to Follow -{{OUTLINE}} - ---- - -## Output Format - -Structure your research EXACTLY as follows: - -```markdown -# Research Report: [Topic] - -Generated: [Date] -Sources: [Total count] - ---- - -## Executive Summary -[3-4 sentences: The story in brief, the key insight, why it matters] - ---- - -## Section 1: Origin Story - -### Key Facts -- **Founding:** [Specific date, location, founders] [1] -- **Initial capital:** $[Amount] from [Source] [2] -- **Original vision:** "[Quote or paraphrase]" [3] -- **First product:** [Description] [4] - -### Context -[2-3 sentences setting the scene - what was the market like? what problem existed?] - -### Human Element -[What makes the founders relatable? Early struggles? Quirks?] - -### Usable Quotes -> "[Exact quote]" — [Speaker], [Source] [5] - ---- - -## Section 2: Key Inflection #1 - [Name the Decision] - -### What Happened -- **Date:** [When] -- **Decision:** [What they chose to do] -- **Alternatives:** [What else they could have done] -- **Stakes:** [What they risked] - -### The Numbers -- [Specific metric before] → [Specific metric after] [6] - -### Why It Mattered -[2-3 sentences on consequences] - -### Usable Quotes -> "[Exact quote about this decision]" — [Speaker], [Source] [7] - ---- - -## Section 3: Key Inflection #2 - [Name the Decision] -[Same structure as above] - ---- - -## Section 4: The Messy Middle - -### Near-Death Moments -- [Crisis #1]: [What happened, how they survived] [8] -- [Crisis #2]: [What happened, how they survived] [9] - -### Internal Tensions -- [Conflict or disagreement that shaped company] [10] - ---- - -## Section 5: Current State - -### Position Today -- **Valuation/Revenue:** [Latest numbers] [11] -- **Market share:** [Position] [12] -- **Key metrics:** [What matters for this company] - -### Competitive Landscape -- **Main competitors:** [Who and their position] -- **Why winning/losing:** [Analysis] - -### Open Questions -- [Unresolved strategic question] -- [Unresolved technical question] - ---- - -## Contrarian Corner - -### The Counter-Narrative -[What's the bear case? What do critics say? What might go wrong?] - -### Underreported Angle -[What story isn't being told? What did you find that surprised you?] - ---- - -## Sources - -[1] [Author/Publication]. "[Title]". [Date]. [URL if available] -[2] ... -[3] ... -[Continue numbering all sources] - ---- - -## Research Gaps - -- [ ] [Question we couldn't answer] -- [ ] [Source we couldn't find] -- [ ] [Data point that would strengthen the episode] -``` - -## Citation Rules - -1. EVERY factual claim needs a citation number [X] -2. Use primary sources when possible (founder interviews, SEC filings, earnings calls) -3. Date your sources - prefer recent for current state, contemporary for historical -4. If a fact is disputed, note the disagreement -5. Distinguish between fact and analysis/opinion - -## Quality Checklist - -Before finishing, verify: -- [ ] Every section of the outline has corresponding research -- [ ] All claims are cited -- [ ] At least 2 usable quotes per major section -- [ ] Numbers are specific (not "millions" but "$4.2 million") -- [ ] Dates are specific (not "early 2020" but "February 2020") -- [ ] Counter-narrative is addressed -- [ ] Sources list is complete and formatted diff --git a/skills/thebuilders-v2/templates/review-prompt.md b/skills/thebuilders-v2/templates/review-prompt.md deleted file mode 100644 index 64b793f3c..000000000 --- a/skills/thebuilders-v2/templates/review-prompt.md +++ /dev/null @@ -1,101 +0,0 @@ -# Script Review & Refinement - -Review the following podcast script section by section and suggest improvements. - -## Script to Review -{{SCRIPT}} - ---- - -## Review Each Section - -For each section, provide: - -```markdown -## Section [X]: [Name] - -### Quality Scores -- Hook effectiveness: [X]/10 -- Fact density: [X]/10 -- Natural dialogue: [X]/10 -- Voice consistency: [X]/10 -- Discovery moments: [X]/10 - -### What Works -- [Specific strength] -- [Another strength] - -### Issues Found -1. **[Issue type]**: [Specific problem] - - Line: "[Quote the problematic line]" - - Fix: "[Suggested replacement]" - - Why: [Explanation] - -2. **[Issue type]**: [Specific problem] - ... - -### Voice Check -- Maya in-character: [Yes/No] - [Note if any slip] -- James in-character: [Yes/No] - [Note if any slip] - -### Missing Elements -- [ ] [Something that should be added] -- [ ] [Another missing element] -``` - -## Common Issues to Check - -### Dialogue Issues -- Monologues (turns > 5 sentences) -- Missing reactions ("Wait, really?") -- Unnatural transitions -- Both hosts saying same thing - -### Voice Consistency -- Maya being too strategic -- James being too technical -- Missing signature phrases -- Tone shifts - -### Content Issues -- Unsourced claims -- Vague numbers ("millions" vs "$4.2M") -- Dated references -- Missing "so what?" - -### Engagement Issues -- No discovery moments -- No disagreements -- Predictable flow -- Weak transitions between sections - ---- - -## Final Assessment - -```markdown -## Overall Quality - -**Episode Grade:** [A/B/C] - -**Strengths:** -1. [Top strength] -2. [Another strength] - -**Critical Fixes Needed:** -1. [Must fix before TTS] -2. [Another must-fix] - -**Nice-to-Have Improvements:** -1. [Would improve but not critical] -2. [Another nice-to-have] - -**Estimated Duration:** [X] minutes - -**Ready for TTS:** [Yes / No - needs revision] -``` - -## Output - -After review, provide the complete REVISED script with all fixes applied. -Use the same format (section markers + Person tags). diff --git a/skills/thebuilders-v2/templates/script-prompt.md b/skills/thebuilders-v2/templates/script-prompt.md deleted file mode 100644 index 21512aa9f..000000000 --- a/skills/thebuilders-v2/templates/script-prompt.md +++ /dev/null @@ -1,157 +0,0 @@ -# The Builders Podcast Script Generation v2 - -Generate a complete podcast script with section markers and citation integration. - -## The Hosts - -**Maya Chen (Person1):** -- Former software engineer, founded and sold a B2B SaaS startup -- Lens: "How does this actually work?" - technical, mechanical, architectural -- Skeptical of hype, wants specifics and numbers -- Phrases: "Wait, slow down.", "Show me the numbers.", "I had to read this three times.", "That's actually clever because..." -- NEVER says: "From a strategic perspective", "The market opportunity" - -**James Porter (Person2):** -- Former venture capitalist, studied business history -- Lens: "What's the business model?" - strategy, markets, competitive dynamics -- Synthesizer, pattern matcher, historical parallels -- Phrases: "For context...", "This is the classic [X] playbook.", "The lesson here is...", "What a story." -- NEVER says: "Let me explain the architecture", "The API design" - -## Citation Integration - -Hosts naturally reference sources: -- "According to their Series B deck..." -- "There's this great interview where [Founder] said..." -- "The SEC filing actually shows..." -- "I found this quote from [Year]..." - -## Episode Structure - -### SECTION 1: HOOK (Turns 1-15, ~3-4 min) - -Use this hook: -{{SELECTED_HOOK}} - -Guidelines: -- Open with the hook, let it land -- Person2 reacts with genuine surprise/curiosity -- Establish central question of episode -- Tease what's coming without spoiling -- End section with clear transition to origin - -### SECTION 2: ORIGIN STORY (Turns 16-45, ~6-7 min) - -Cover: -- Who are the founders? Make them human -- What was the genesis moment? -- What was the market context? -- What was their early bet/hypothesis? -- First signs of traction or failure - -Guidelines: -- Maya explores technical origins -- James provides market/strategy context -- Include specific dates, amounts, details -- At least one "I didn't know that" moment - -### SECTION 3: KEY INFLECTION #1 (Turns 46-70, ~5 min) - -Cover: -- What decision did they face? -- What alternatives existed? -- What did they risk? -- How did it play out? - -Guidelines: -- Build tension before revealing outcome -- Explore the "what if they'd done X instead?" -- Use specific numbers for before/after -- Include a quote from the time - -### SECTION 4: KEY INFLECTION #2 (Turns 71-90, ~4 min) - -Cover: -- New challenge or opportunity -- How they adapted/pivoted -- Key insight they gained - -Guidelines: -- Connect to first inflection -- Show evolution of thinking -- Maya: technical implications -- James: strategic implications - -### SECTION 5: MESSY MIDDLE (Turns 91-105, ~3 min) - -Cover: -- Near-death moment(s) -- Internal conflicts -- What almost broke them - -Guidelines: -- Don't glorify - show real struggle -- Include specific stakes ("6 months of runway") -- One host can play devil's advocate - -### SECTION 6: NOW (Turns 106-120, ~3 min) - -Cover: -- Current position and metrics -- Competitive landscape -- Open questions - -Guidelines: -- Timeless framing (position, not news) -- Acknowledge uncertainty about future -- Set up takeaways - -### SECTION 7: TAKEAWAYS (Turns 121-130, ~2-3 min) - -Cover: -- Key lesson(s) -- Framework or principle -- Final memorable thought - -Guidelines: -- Both hosts contribute insights -- Connect back to hook/central question -- End with forward-looking thought -- Final line should resonate - -## Format Rules - -1. Use `` and `` XML tags -2. Each turn: 2-5 sentences (conversation, not monologue) -3. Add section markers: `` -4. Include discovery moments in every section -5. NO news references - timeless only -6. Use SPECIFIC facts from research -7. Both hosts should learn during conversation -8. Minimum 130 turns total - -## Section Marker Format - -``` - -The email arrived at 2 AM... -... - - -Okay, so let's go back to the beginning... -... -``` - -## Research Material - -{{RESEARCH}} - ---- - -## Selected Hook - -{{HOOK}} - ---- - -Generate the complete script now. Start with `` followed by ``. diff --git a/skills/transcribe/lib/__pycache__/r2_upload.cpython-312.pyc b/skills/transcribe/lib/__pycache__/r2_upload.cpython-312.pyc deleted file mode 100644 index 41225b7a94849b99caeecb668ef138b56f07f8a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5537 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 L1^OW>@Pz*hyoUBU diff --git a/skills/transcribe/lib/__pycache__/whisper.cpython-312.pyc b/skills/transcribe/lib/__pycache__/whisper.cpython-312.pyc deleted file mode 100644 index 6e16acc7dfe32d441836ff3af4ccdbe1d6522b02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13459 zcmbt*ZE#apmf(B(c>0!XeORBiRS}i+#68tj%~b8y(CJP$p`k}Y^jLXA)q1L_txauht@x-V z(DP%@y-!b)-7@L)Jfr*0yZ794&$;*9bMHC#@*9mtNxaIKCT#6j4Owg}KIg2O*1ano zHcyLOrQwQWlm4Rt+Ihee3^Ax&(%?9tbJRFPdnd=ka-WACWtuN+ z%|UHBs6DKsft1(RoJDF|pV7`qLzC>80ILRuMi5uRgT`14zsIjbkIoYzA)gq__FXOm zfH7&|7Z0Pc68ibis4e~v)t1oG|3KSRh!W(xDK>Bh()_vcIRFD;GYGAL|+%>OR(c^my-)LHF_Afu18Lj&qW&JGN{A?Uex?_jzWT zQ!##eBH;Ch++LcKBQsk6OS?>PP4z~K-Y=> z<8HoXF%Y>%JVu@UytDOOV4P`Xd|sw?)EhcCd8T#5=a~YPZVjII`h3CG5bN;=M_BI} zrq$;?(>ldZvzCczP7k!**>5-Bt!yi6B)mogu`4_JM3ee;8JgNd4LiH@TwJ=b`-ZX~u=%PzH!h^igDJz2hbl@YAAZZfcL60l;@byiFTR!qt$b5=|Z z6jj;w^)IBiwx*KSKut9bRuQacAx#NbM#-=SETe(bW^LgRZwkX(vVik!fOQtPn!+e! zd)P9_nxMDXGL%?Qk4hjB9%Qkw)!N5ft?X(*5FceRqLK)Ckqk;nA_6N9>emS2&S6DF zxiW0!i`g}S64XO2;U^-_)e~oF=D31(B-y;2m5da%qO2P7bCyS-4f?7IX@oDZYgul; zO9EvIQN9AJTJf4!h!4cTrz}@nUc6<%6VVD<`MwCSz44n(G-Z0J$ ztGfgK5LmzFak6uahi2Fym>)@y z@ts|#KODuIhaegqCwkZ_fH=9^?e%*@Zg<$cR%Kg+0@(Zz!8jyfOVotEHdR_TL#>)C z?wZ?U^>J&mx_w4+S)Fz?+;!}YcPuw2H|<@qA57X0rtG~ll6!JX+GM+HYF;=SJGmGD zRAt&+zTi!o8&S1Yo#DO6e~HAlt<<#Nt!clncO=SBr1Y;P)UU1Dt71(_dvn6p689`i zR<`U-ZrPh??MhhoK~2qSWqmC4VdQEg=1-KrlyE)pnC+i8)rNt=Q)aHV6)&KDO6FkEaD0G z7AV;~fhU3*CKoXV1?!(E6`?}8?ZX9(KLim~Du|F^;EAykp@sY#`beMu5+IOJ^8xS-rA8qy z|E9Gc>psf%SyUBKjUh9*?x9Q0gJ!Z-P>Lq&x<@cyWA=3g@JW{nGDPJh;lI2AeftcPMgZ}c?CUD#HkTREUKX^qS`+VH=+r{1|D>%ex2a(c^+oqEXnq+(NDB5TK8=4eTzq^L$$3pApo z5iM;C!$KO>0;CRu6{9QgOzAG*;|2ZC_i0pLpo_&UNKK>^^sY9dr|Ygr==wry1!E7c zD_D|-Txp@5DWw}RKQ$Z3;_?!LI}$ZO@4MCw7<@)@eKtfyO6ev{&$)gY892-5v|jMiOu!j}f4Mf+)Dw0SolYTk;S{o*Bj5@;8=02Tmd(xv z#@_&`hi!1JsgK>o&YU-lKT&g&L1qo!y1h!Lv)4c3n*{o(pxMVW)3)pcR=g93k7YQQ{bRF8$!&*5E3oOj3SRch+v@$5KL!%`-U9FuME&al|o?Bt{j+OvlZ$N6Z16Cxm

30y2syt5%0#&O0LDie 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 JKn_;s{|~Fnz?J|2 diff --git a/skills/uv.lock b/skills/uv.lock deleted file mode 100644 index dd2ee6799..000000000 --- a/skills/uv.lock +++ /dev/null @@ -1,638 +0,0 @@ -version = 1 -revision = 3 -requires-python = ">=3.11" - -[[package]] -name = "annotated-doc" -version = "0.0.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, -] - -[[package]] -name = "annotated-types" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, -] - -[[package]] -name = "anyio" -version = "4.12.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "idna" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685, upload-time = "2026-01-06T11:45:21.246Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" }, -] - -[[package]] -name = "certifi" -version = "2026.1.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" }, -] - -[[package]] -name = "click" -version = "8.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, -] - -[[package]] -name = "colorama" -version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, -] - -[[package]] -name = "fastapi" -version = "0.128.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "annotated-doc" }, - { name = "pydantic" }, - { name = "starlette" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/52/08/8c8508db6c7b9aae8f7175046af41baad690771c9bcde676419965e338c7/fastapi-0.128.0.tar.gz", hash = "sha256:1cc179e1cef10a6be60ffe429f79b829dce99d8de32d7acb7e6c8dfdf7f2645a", size = 365682, upload-time = "2025-12-27T15:21:13.714Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/05/5cbb59154b093548acd0f4c7c474a118eda06da25aa75c616b72d8fcd92a/fastapi-0.128.0-py3-none-any.whl", hash = "sha256:aebd93f9716ee3b4f4fcfe13ffb7cf308d99c9f3ab5622d8877441072561582d", size = 103094, upload-time = "2025-12-27T15:21:12.154Z" }, -] - -[[package]] -name = "h11" -version = "0.16.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, -] - -[[package]] -name = "httpcore" -version = "1.0.9" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, -] - -[[package]] -name = "httptools" -version = "0.7.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b5/46/120a669232c7bdedb9d52d4aeae7e6c7dfe151e99dc70802e2fc7a5e1993/httptools-0.7.1.tar.gz", hash = "sha256:abd72556974f8e7c74a259655924a717a2365b236c882c3f6f8a45fe94703ac9", size = 258961, upload-time = "2025-10-10T03:55:08.559Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/08/17e07e8d89ab8f343c134616d72eebfe03798835058e2ab579dcc8353c06/httptools-0.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:474d3b7ab469fefcca3697a10d11a32ee2b9573250206ba1e50d5980910da657", size = 206521, upload-time = "2025-10-10T03:54:31.002Z" }, - { url = "https://files.pythonhosted.org/packages/aa/06/c9c1b41ff52f16aee526fd10fbda99fa4787938aa776858ddc4a1ea825ec/httptools-0.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3c3b7366bb6c7b96bd72d0dbe7f7d5eead261361f013be5f6d9590465ea1c70", size = 110375, upload-time = "2025-10-10T03:54:31.941Z" }, - { url = "https://files.pythonhosted.org/packages/cc/cc/10935db22fda0ee34c76f047590ca0a8bd9de531406a3ccb10a90e12ea21/httptools-0.7.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:379b479408b8747f47f3b253326183d7c009a3936518cdb70db58cffd369d9df", size = 456621, upload-time = "2025-10-10T03:54:33.176Z" }, - { url = "https://files.pythonhosted.org/packages/0e/84/875382b10d271b0c11aa5d414b44f92f8dd53e9b658aec338a79164fa548/httptools-0.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cad6b591a682dcc6cf1397c3900527f9affef1e55a06c4547264796bbd17cf5e", size = 454954, upload-time = "2025-10-10T03:54:34.226Z" }, - { url = "https://files.pythonhosted.org/packages/30/e1/44f89b280f7e46c0b1b2ccee5737d46b3bb13136383958f20b580a821ca0/httptools-0.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eb844698d11433d2139bbeeb56499102143beb582bd6c194e3ba69c22f25c274", size = 440175, upload-time = "2025-10-10T03:54:35.942Z" }, - { url = "https://files.pythonhosted.org/packages/6f/7e/b9287763159e700e335028bc1824359dc736fa9b829dacedace91a39b37e/httptools-0.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f65744d7a8bdb4bda5e1fa23e4ba16832860606fcc09d674d56e425e991539ec", size = 440310, upload-time = "2025-10-10T03:54:37.1Z" }, - { url = "https://files.pythonhosted.org/packages/b3/07/5b614f592868e07f5c94b1f301b5e14a21df4e8076215a3bccb830a687d8/httptools-0.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:135fbe974b3718eada677229312e97f3b31f8a9c8ffa3ae6f565bf808d5b6bcb", size = 86875, upload-time = "2025-10-10T03:54:38.421Z" }, - { url = "https://files.pythonhosted.org/packages/53/7f/403e5d787dc4942316e515e949b0c8a013d84078a915910e9f391ba9b3ed/httptools-0.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:38e0c83a2ea9746ebbd643bdfb521b9aa4a91703e2cd705c20443405d2fd16a5", size = 206280, upload-time = "2025-10-10T03:54:39.274Z" }, - { url = "https://files.pythonhosted.org/packages/2a/0d/7f3fd28e2ce311ccc998c388dd1c53b18120fda3b70ebb022b135dc9839b/httptools-0.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f25bbaf1235e27704f1a7b86cd3304eabc04f569c828101d94a0e605ef7205a5", size = 110004, upload-time = "2025-10-10T03:54:40.403Z" }, - { url = "https://files.pythonhosted.org/packages/84/a6/b3965e1e146ef5762870bbe76117876ceba51a201e18cc31f5703e454596/httptools-0.7.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c15f37ef679ab9ecc06bfc4e6e8628c32a8e4b305459de7cf6785acd57e4d03", size = 517655, upload-time = "2025-10-10T03:54:41.347Z" }, - { url = "https://files.pythonhosted.org/packages/11/7d/71fee6f1844e6fa378f2eddde6c3e41ce3a1fb4b2d81118dd544e3441ec0/httptools-0.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7fe6e96090df46b36ccfaf746f03034e5ab723162bc51b0a4cf58305324036f2", size = 511440, upload-time = "2025-10-10T03:54:42.452Z" }, - { url = "https://files.pythonhosted.org/packages/22/a5/079d216712a4f3ffa24af4a0381b108aa9c45b7a5cc6eb141f81726b1823/httptools-0.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f72fdbae2dbc6e68b8239defb48e6a5937b12218e6ffc2c7846cc37befa84362", size = 495186, upload-time = "2025-10-10T03:54:43.937Z" }, - { url = "https://files.pythonhosted.org/packages/e9/9e/025ad7b65278745dee3bd0ebf9314934c4592560878308a6121f7f812084/httptools-0.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e99c7b90a29fd82fea9ef57943d501a16f3404d7b9ee81799d41639bdaae412c", size = 499192, upload-time = "2025-10-10T03:54:45.003Z" }, - { url = "https://files.pythonhosted.org/packages/6d/de/40a8f202b987d43afc4d54689600ff03ce65680ede2f31df348d7f368b8f/httptools-0.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:3e14f530fefa7499334a79b0cf7e7cd2992870eb893526fb097d51b4f2d0f321", size = 86694, upload-time = "2025-10-10T03:54:45.923Z" }, - { url = "https://files.pythonhosted.org/packages/09/8f/c77b1fcbfd262d422f12da02feb0d218fa228d52485b77b953832105bb90/httptools-0.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6babce6cfa2a99545c60bfef8bee0cc0545413cb0018f617c8059a30ad985de3", size = 202889, upload-time = "2025-10-10T03:54:47.089Z" }, - { url = "https://files.pythonhosted.org/packages/0a/1a/22887f53602feaa066354867bc49a68fc295c2293433177ee90870a7d517/httptools-0.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:601b7628de7504077dd3dcb3791c6b8694bbd967148a6d1f01806509254fb1ca", size = 108180, upload-time = "2025-10-10T03:54:48.052Z" }, - { url = "https://files.pythonhosted.org/packages/32/6a/6aaa91937f0010d288d3d124ca2946d48d60c3a5ee7ca62afe870e3ea011/httptools-0.7.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:04c6c0e6c5fb0739c5b8a9eb046d298650a0ff38cf42537fc372b28dc7e4472c", size = 478596, upload-time = "2025-10-10T03:54:48.919Z" }, - { url = "https://files.pythonhosted.org/packages/6d/70/023d7ce117993107be88d2cbca566a7c1323ccbaf0af7eabf2064fe356f6/httptools-0.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69d4f9705c405ae3ee83d6a12283dc9feba8cc6aaec671b412917e644ab4fa66", size = 473268, upload-time = "2025-10-10T03:54:49.993Z" }, - { url = "https://files.pythonhosted.org/packages/32/4d/9dd616c38da088e3f436e9a616e1d0cc66544b8cdac405cc4e81c8679fc7/httptools-0.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:44c8f4347d4b31269c8a9205d8a5ee2df5322b09bbbd30f8f862185bb6b05346", size = 455517, upload-time = "2025-10-10T03:54:51.066Z" }, - { url = "https://files.pythonhosted.org/packages/1d/3a/a6c595c310b7df958e739aae88724e24f9246a514d909547778d776799be/httptools-0.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:465275d76db4d554918aba40bf1cbebe324670f3dfc979eaffaa5d108e2ed650", size = 458337, upload-time = "2025-10-10T03:54:52.196Z" }, - { url = "https://files.pythonhosted.org/packages/fd/82/88e8d6d2c51edc1cc391b6e044c6c435b6aebe97b1abc33db1b0b24cd582/httptools-0.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:322d00c2068d125bd570f7bf78b2d367dad02b919d8581d7476d8b75b294e3e6", size = 85743, upload-time = "2025-10-10T03:54:53.448Z" }, - { url = "https://files.pythonhosted.org/packages/34/50/9d095fcbb6de2d523e027a2f304d4551855c2f46e0b82befd718b8b20056/httptools-0.7.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:c08fe65728b8d70b6923ce31e3956f859d5e1e8548e6f22ec520a962c6757270", size = 203619, upload-time = "2025-10-10T03:54:54.321Z" }, - { url = "https://files.pythonhosted.org/packages/07/f0/89720dc5139ae54b03f861b5e2c55a37dba9a5da7d51e1e824a1f343627f/httptools-0.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7aea2e3c3953521c3c51106ee11487a910d45586e351202474d45472db7d72d3", size = 108714, upload-time = "2025-10-10T03:54:55.163Z" }, - { url = "https://files.pythonhosted.org/packages/b3/cb/eea88506f191fb552c11787c23f9a405f4c7b0c5799bf73f2249cd4f5228/httptools-0.7.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0e68b8582f4ea9166be62926077a3334064d422cf08ab87d8b74664f8e9058e1", size = 472909, upload-time = "2025-10-10T03:54:56.056Z" }, - { url = "https://files.pythonhosted.org/packages/e0/4a/a548bdfae6369c0d078bab5769f7b66f17f1bfaa6fa28f81d6be6959066b/httptools-0.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df091cf961a3be783d6aebae963cc9b71e00d57fa6f149025075217bc6a55a7b", size = 470831, upload-time = "2025-10-10T03:54:57.219Z" }, - { url = "https://files.pythonhosted.org/packages/4d/31/14df99e1c43bd132eec921c2e7e11cda7852f65619bc0fc5bdc2d0cb126c/httptools-0.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f084813239e1eb403ddacd06a30de3d3e09a9b76e7894dcda2b22f8a726e9c60", size = 452631, upload-time = "2025-10-10T03:54:58.219Z" }, - { url = "https://files.pythonhosted.org/packages/22/d2/b7e131f7be8d854d48cb6d048113c30f9a46dca0c9a8b08fcb3fcd588cdc/httptools-0.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7347714368fb2b335e9063bc2b96f2f87a9ceffcd9758ac295f8bbcd3ffbc0ca", size = 452910, upload-time = "2025-10-10T03:54:59.366Z" }, - { url = "https://files.pythonhosted.org/packages/53/cf/878f3b91e4e6e011eff6d1fa9ca39f7eb17d19c9d7971b04873734112f30/httptools-0.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:cfabda2a5bb85aa2a904ce06d974a3f30fb36cc63d7feaddec05d2050acede96", size = 88205, upload-time = "2025-10-10T03:55:00.389Z" }, -] - -[[package]] -name = "httpx" -version = "0.28.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "certifi" }, - { name = "httpcore" }, - { name = "idna" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, -] - -[[package]] -name = "idna" -version = "3.11" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, -] - -[[package]] -name = "iniconfig" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, -] - -[[package]] -name = "my-api" -version = "0.1.0" -source = { editable = "." } -dependencies = [ - { name = "fastapi" }, - { name = "httpx" }, - { name = "uvicorn", extra = ["standard"] }, -] - -[package.optional-dependencies] -dev = [ - { name = "pytest" }, -] - -[package.metadata] -requires-dist = [ - { name = "fastapi", specifier = ">=0.110.0" }, - { name = "httpx", specifier = ">=0.27.0" }, - { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0.0" }, - { name = "uvicorn", extras = ["standard"], specifier = ">=0.29.0" }, -] -provides-extras = ["dev"] - -[[package]] -name = "packaging" -version = "25.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, -] - -[[package]] -name = "pluggy" -version = "1.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, -] - -[[package]] -name = "pydantic" -version = "2.12.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "annotated-types" }, - { name = "pydantic-core" }, - { name = "typing-extensions" }, - { name = "typing-inspection" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, -] - -[[package]] -name = "pydantic-core" -version = "2.41.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", size = 2105873, upload-time = "2025-11-04T13:39:31.373Z" }, - { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826, upload-time = "2025-11-04T13:39:32.897Z" }, - { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869, upload-time = "2025-11-04T13:39:34.469Z" }, - { url = "https://files.pythonhosted.org/packages/6e/6a/30d94a9674a7fe4f4744052ed6c5e083424510be1e93da5bc47569d11810/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8", size = 2063890, upload-time = "2025-11-04T13:39:36.053Z" }, - { url = "https://files.pythonhosted.org/packages/50/be/76e5d46203fcb2750e542f32e6c371ffa9b8ad17364cf94bb0818dbfb50c/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e", size = 2229740, upload-time = "2025-11-04T13:39:37.753Z" }, - { url = "https://files.pythonhosted.org/packages/d3/ee/fed784df0144793489f87db310a6bbf8118d7b630ed07aa180d6067e653a/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1", size = 2350021, upload-time = "2025-11-04T13:39:40.94Z" }, - { url = "https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", size = 2066378, upload-time = "2025-11-04T13:39:42.523Z" }, - { url = "https://files.pythonhosted.org/packages/b0/3b/698cf8ae1d536a010e05121b4958b1257f0b5522085e335360e53a6b1c8b/pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b", size = 2175761, upload-time = "2025-11-04T13:39:44.553Z" }, - { url = "https://files.pythonhosted.org/packages/b8/ba/15d537423939553116dea94ce02f9c31be0fa9d0b806d427e0308ec17145/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", size = 2146303, upload-time = "2025-11-04T13:39:46.238Z" }, - { url = "https://files.pythonhosted.org/packages/58/7f/0de669bf37d206723795f9c90c82966726a2ab06c336deba4735b55af431/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594", size = 2340355, upload-time = "2025-11-04T13:39:48.002Z" }, - { url = "https://files.pythonhosted.org/packages/e5/de/e7482c435b83d7e3c3ee5ee4451f6e8973cff0eb6007d2872ce6383f6398/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", size = 2319875, upload-time = "2025-11-04T13:39:49.705Z" }, - { url = "https://files.pythonhosted.org/packages/fe/e6/8c9e81bb6dd7560e33b9053351c29f30c8194b72f2d6932888581f503482/pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b", size = 1987549, upload-time = "2025-11-04T13:39:51.842Z" }, - { url = "https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe", size = 2011305, upload-time = "2025-11-04T13:39:53.485Z" }, - { url = "https://files.pythonhosted.org/packages/56/d8/0e271434e8efd03186c5386671328154ee349ff0354d83c74f5caaf096ed/pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f", size = 1972902, upload-time = "2025-11-04T13:39:56.488Z" }, - { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, - { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, - { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, - { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" }, - { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" }, - { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" }, - { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, - { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" }, - { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, - { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" }, - { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, - { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload-time = "2025-11-04T13:40:19.309Z" }, - { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload-time = "2025-11-04T13:40:21.548Z" }, - { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload-time = "2025-11-04T13:40:23.393Z" }, - { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403, upload-time = "2025-11-04T13:40:25.248Z" }, - { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload-time = "2025-11-04T13:40:27.099Z" }, - { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload-time = "2025-11-04T13:40:29.806Z" }, - { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258, upload-time = "2025-11-04T13:40:33.544Z" }, - { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917, upload-time = "2025-11-04T13:40:35.479Z" }, - { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186, upload-time = "2025-11-04T13:40:37.436Z" }, - { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164, upload-time = "2025-11-04T13:40:40.289Z" }, - { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146, upload-time = "2025-11-04T13:40:42.809Z" }, - { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788, upload-time = "2025-11-04T13:40:44.752Z" }, - { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133, upload-time = "2025-11-04T13:40:46.66Z" }, - { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852, upload-time = "2025-11-04T13:40:48.575Z" }, - { url = "https://files.pythonhosted.org/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", size = 1994679, upload-time = "2025-11-04T13:40:50.619Z" }, - { url = "https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", size = 2019766, upload-time = "2025-11-04T13:40:52.631Z" }, - { url = "https://files.pythonhosted.org/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", size = 1981005, upload-time = "2025-11-04T13:40:54.734Z" }, - { url = "https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", size = 2119622, upload-time = "2025-11-04T13:40:56.68Z" }, - { url = "https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", size = 1891725, upload-time = "2025-11-04T13:40:58.807Z" }, - { url = "https://files.pythonhosted.org/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", size = 1915040, upload-time = "2025-11-04T13:41:00.853Z" }, - { url = "https://files.pythonhosted.org/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", size = 2063691, upload-time = "2025-11-04T13:41:03.504Z" }, - { url = "https://files.pythonhosted.org/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", size = 2213897, upload-time = "2025-11-04T13:41:05.804Z" }, - { url = "https://files.pythonhosted.org/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", size = 2333302, upload-time = "2025-11-04T13:41:07.809Z" }, - { url = "https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", size = 2064877, upload-time = "2025-11-04T13:41:09.827Z" }, - { url = "https://files.pythonhosted.org/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", size = 2180680, upload-time = "2025-11-04T13:41:12.379Z" }, - { url = "https://files.pythonhosted.org/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", size = 2138960, upload-time = "2025-11-04T13:41:14.627Z" }, - { url = "https://files.pythonhosted.org/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", size = 2339102, upload-time = "2025-11-04T13:41:16.868Z" }, - { url = "https://files.pythonhosted.org/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", size = 2326039, upload-time = "2025-11-04T13:41:18.934Z" }, - { url = "https://files.pythonhosted.org/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", size = 1995126, upload-time = "2025-11-04T13:41:21.418Z" }, - { url = "https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", size = 2015489, upload-time = "2025-11-04T13:41:24.076Z" }, - { url = "https://files.pythonhosted.org/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", size = 1977288, upload-time = "2025-11-04T13:41:26.33Z" }, - { url = "https://files.pythonhosted.org/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", size = 2120255, upload-time = "2025-11-04T13:41:28.569Z" }, - { url = "https://files.pythonhosted.org/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", size = 1863760, upload-time = "2025-11-04T13:41:31.055Z" }, - { url = "https://files.pythonhosted.org/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", size = 1878092, upload-time = "2025-11-04T13:41:33.21Z" }, - { url = "https://files.pythonhosted.org/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", size = 2053385, upload-time = "2025-11-04T13:41:35.508Z" }, - { url = "https://files.pythonhosted.org/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", size = 2218832, upload-time = "2025-11-04T13:41:37.732Z" }, - { url = "https://files.pythonhosted.org/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", size = 2327585, upload-time = "2025-11-04T13:41:40Z" }, - { url = "https://files.pythonhosted.org/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", size = 2041078, upload-time = "2025-11-04T13:41:42.323Z" }, - { url = "https://files.pythonhosted.org/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", size = 2173914, upload-time = "2025-11-04T13:41:45.221Z" }, - { url = "https://files.pythonhosted.org/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", size = 2129560, upload-time = "2025-11-04T13:41:47.474Z" }, - { url = "https://files.pythonhosted.org/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", size = 2329244, upload-time = "2025-11-04T13:41:49.992Z" }, - { url = "https://files.pythonhosted.org/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", size = 2331955, upload-time = "2025-11-04T13:41:54.079Z" }, - { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906, upload-time = "2025-11-04T13:41:56.606Z" }, - { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607, upload-time = "2025-11-04T13:41:58.889Z" }, - { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" }, - { url = "https://files.pythonhosted.org/packages/11/72/90fda5ee3b97e51c494938a4a44c3a35a9c96c19bba12372fb9c634d6f57/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034", size = 2115441, upload-time = "2025-11-04T13:42:39.557Z" }, - { url = "https://files.pythonhosted.org/packages/1f/53/8942f884fa33f50794f119012dc6a1a02ac43a56407adaac20463df8e98f/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", size = 1930291, upload-time = "2025-11-04T13:42:42.169Z" }, - { url = "https://files.pythonhosted.org/packages/79/c8/ecb9ed9cd942bce09fc888ee960b52654fbdbede4ba6c2d6e0d3b1d8b49c/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", size = 1948632, upload-time = "2025-11-04T13:42:44.564Z" }, - { url = "https://files.pythonhosted.org/packages/2e/1b/687711069de7efa6af934e74f601e2a4307365e8fdc404703afc453eab26/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", size = 2138905, upload-time = "2025-11-04T13:42:47.156Z" }, - { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, - { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, - { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, - { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, - { url = "https://files.pythonhosted.org/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", size = 2101980, upload-time = "2025-11-04T13:43:25.97Z" }, - { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865, upload-time = "2025-11-04T13:43:28.763Z" }, - { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256, upload-time = "2025-11-04T13:43:31.71Z" }, - { url = "https://files.pythonhosted.org/packages/83/d9/8412d7f06f616bbc053d30cb4e5f76786af3221462ad5eee1f202021eb4e/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1", size = 2174762, upload-time = "2025-11-04T13:43:34.744Z" }, - { url = "https://files.pythonhosted.org/packages/55/4c/162d906b8e3ba3a99354e20faa1b49a85206c47de97a639510a0e673f5da/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", size = 2143141, upload-time = "2025-11-04T13:43:37.701Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f2/f11dd73284122713f5f89fc940f370d035fa8e1e078d446b3313955157fe/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770", size = 2330317, upload-time = "2025-11-04T13:43:40.406Z" }, - { url = "https://files.pythonhosted.org/packages/88/9d/b06ca6acfe4abb296110fb1273a4d848a0bfb2ff65f3ee92127b3244e16b/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", size = 2316992, upload-time = "2025-11-04T13:43:43.602Z" }, - { url = "https://files.pythonhosted.org/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", size = 2145302, upload-time = "2025-11-04T13:43:46.64Z" }, -] - -[[package]] -name = "pygments" -version = "2.19.2" -source = { registry = "https://pypi.org/simple" } -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" } -wheels = [ - { 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" }, -] - -[[package]] -name = "pytest" -version = "9.0.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "iniconfig" }, - { name = "packaging" }, - { name = "pluggy" }, - { name = "pygments" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" }, -] - -[[package]] -name = "python-dotenv" -version = "1.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f0/26/19cadc79a718c5edbec86fd4919a6b6d3f681039a2f6d66d14be94e75fb9/python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6", size = 44221, upload-time = "2025-10-26T15:12:10.434Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/14/1b/a298b06749107c305e1fe0f814c6c74aea7b2f1e10989cb30f544a1b3253/python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61", size = 21230, upload-time = "2025-10-26T15:12:09.109Z" }, -] - -[[package]] -name = "pyyaml" -version = "6.0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, - { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, - { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, - { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, - { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, - { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, - { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, - { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, - { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, - { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, - { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, - { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, - { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, - { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, - { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, - { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, - { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, - { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, - { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, - { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, - { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, - { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, - { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, - { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, - { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, - { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, - { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, - { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, - { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, - { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, - { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, - { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, - { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, - { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, - { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, - { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, - { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, - { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, - { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, - { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, - { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, - { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, - { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, - { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, - { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, - { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, - { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, -] - -[[package]] -name = "starlette" -version = "0.50.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ba/b8/73a0e6a6e079a9d9cfa64113d771e421640b6f679a52eeb9b32f72d871a1/starlette-0.50.0.tar.gz", hash = "sha256:a2a17b22203254bcbc2e1f926d2d55f3f9497f769416b3190768befe598fa3ca", size = 2646985, upload-time = "2025-11-01T15:25:27.516Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/52/1064f510b141bd54025f9b55105e26d1fa970b9be67ad766380a3c9b74b0/starlette-0.50.0-py3-none-any.whl", hash = "sha256:9e5391843ec9b6e472eed1365a78c8098cfceb7a74bfd4d6b1c0c0095efb3bca", size = 74033, upload-time = "2025-11-01T15:25:25.461Z" }, -] - -[[package]] -name = "typing-extensions" -version = "4.15.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, -] - -[[package]] -name = "typing-inspection" -version = "0.4.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -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" } -wheels = [ - { 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" }, -] - -[[package]] -name = "uvicorn" -version = "0.40.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c3/d1/8f3c683c9561a4e6689dd3b1d345c815f10f86acd044ee1fb9a4dcd0b8c5/uvicorn-0.40.0.tar.gz", hash = "sha256:839676675e87e73694518b5574fd0f24c9d97b46bea16df7b8c05ea1a51071ea", size = 81761, upload-time = "2025-12-21T14:16:22.45Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/d8/2083a1daa7439a66f3a48589a57d576aa117726762618f6bb09fe3798796/uvicorn-0.40.0-py3-none-any.whl", hash = "sha256:c6c8f55bc8bf13eb6fa9ff87ad62308bbbc33d0b67f84293151efe87e0d5f2ee", size = 68502, upload-time = "2025-12-21T14:16:21.041Z" }, -] - -[package.optional-dependencies] -standard = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "httptools" }, - { name = "python-dotenv" }, - { name = "pyyaml" }, - { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, - { name = "watchfiles" }, - { name = "websockets" }, -] - -[[package]] -name = "uvloop" -version = "0.22.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/06/f0/18d39dbd1971d6d62c4629cc7fa67f74821b0dc1f5a77af43719de7936a7/uvloop-0.22.1.tar.gz", hash = "sha256:6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f", size = 2443250, upload-time = "2025-10-16T22:17:19.342Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/d5/69900f7883235562f1f50d8184bb7dd84a2fb61e9ec63f3782546fdbd057/uvloop-0.22.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c60ebcd36f7b240b30788554b6f0782454826a0ed765d8430652621b5de674b9", size = 1352420, upload-time = "2025-10-16T22:16:21.187Z" }, - { url = "https://files.pythonhosted.org/packages/a8/73/c4e271b3bce59724e291465cc936c37758886a4868787da0278b3b56b905/uvloop-0.22.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b7f102bf3cb1995cfeaee9321105e8f5da76fdb104cdad8986f85461a1b7b77", size = 748677, upload-time = "2025-10-16T22:16:22.558Z" }, - { url = "https://files.pythonhosted.org/packages/86/94/9fb7fad2f824d25f8ecac0d70b94d0d48107ad5ece03769a9c543444f78a/uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53c85520781d84a4b8b230e24a5af5b0778efdb39142b424990ff1ef7c48ba21", size = 3753819, upload-time = "2025-10-16T22:16:23.903Z" }, - { url = "https://files.pythonhosted.org/packages/74/4f/256aca690709e9b008b7108bc85fba619a2bc37c6d80743d18abad16ee09/uvloop-0.22.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56a2d1fae65fd82197cb8c53c367310b3eabe1bbb9fb5a04d28e3e3520e4f702", size = 3804529, upload-time = "2025-10-16T22:16:25.246Z" }, - { url = "https://files.pythonhosted.org/packages/7f/74/03c05ae4737e871923d21a76fe28b6aad57f5c03b6e6bfcfa5ad616013e4/uvloop-0.22.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40631b049d5972c6755b06d0bfe8233b1bd9a8a6392d9d1c45c10b6f9e9b2733", size = 3621267, upload-time = "2025-10-16T22:16:26.819Z" }, - { url = "https://files.pythonhosted.org/packages/75/be/f8e590fe61d18b4a92070905497aec4c0e64ae1761498cad09023f3f4b3e/uvloop-0.22.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:535cc37b3a04f6cd2c1ef65fa1d370c9a35b6695df735fcff5427323f2cd5473", size = 3723105, upload-time = "2025-10-16T22:16:28.252Z" }, - { url = "https://files.pythonhosted.org/packages/3d/ff/7f72e8170be527b4977b033239a83a68d5c881cc4775fca255c677f7ac5d/uvloop-0.22.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fe94b4564e865d968414598eea1a6de60adba0c040ba4ed05ac1300de402cd42", size = 1359936, upload-time = "2025-10-16T22:16:29.436Z" }, - { url = "https://files.pythonhosted.org/packages/c3/c6/e5d433f88fd54d81ef4be58b2b7b0cea13c442454a1db703a1eea0db1a59/uvloop-0.22.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:51eb9bd88391483410daad430813d982010f9c9c89512321f5b60e2cddbdddd6", size = 752769, upload-time = "2025-10-16T22:16:30.493Z" }, - { url = "https://files.pythonhosted.org/packages/24/68/a6ac446820273e71aa762fa21cdcc09861edd3536ff47c5cd3b7afb10eeb/uvloop-0.22.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:700e674a166ca5778255e0e1dc4e9d79ab2acc57b9171b79e65feba7184b3370", size = 4317413, upload-time = "2025-10-16T22:16:31.644Z" }, - { url = "https://files.pythonhosted.org/packages/5f/6f/e62b4dfc7ad6518e7eff2516f680d02a0f6eb62c0c212e152ca708a0085e/uvloop-0.22.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b5b1ac819a3f946d3b2ee07f09149578ae76066d70b44df3fa990add49a82e4", size = 4426307, upload-time = "2025-10-16T22:16:32.917Z" }, - { url = "https://files.pythonhosted.org/packages/90/60/97362554ac21e20e81bcef1150cb2a7e4ffdaf8ea1e5b2e8bf7a053caa18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e047cc068570bac9866237739607d1313b9253c3051ad84738cbb095be0537b2", size = 4131970, upload-time = "2025-10-16T22:16:34.015Z" }, - { url = "https://files.pythonhosted.org/packages/99/39/6b3f7d234ba3964c428a6e40006340f53ba37993f46ed6e111c6e9141d18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:512fec6815e2dd45161054592441ef76c830eddaad55c8aa30952e6fe1ed07c0", size = 4296343, upload-time = "2025-10-16T22:16:35.149Z" }, - { url = "https://files.pythonhosted.org/packages/89/8c/182a2a593195bfd39842ea68ebc084e20c850806117213f5a299dfc513d9/uvloop-0.22.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:561577354eb94200d75aca23fbde86ee11be36b00e52a4eaf8f50fb0c86b7705", size = 1358611, upload-time = "2025-10-16T22:16:36.833Z" }, - { url = "https://files.pythonhosted.org/packages/d2/14/e301ee96a6dc95224b6f1162cd3312f6d1217be3907b79173b06785f2fe7/uvloop-0.22.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cdf5192ab3e674ca26da2eada35b288d2fa49fdd0f357a19f0e7c4e7d5077c8", size = 751811, upload-time = "2025-10-16T22:16:38.275Z" }, - { url = "https://files.pythonhosted.org/packages/b7/02/654426ce265ac19e2980bfd9ea6590ca96a56f10c76e63801a2df01c0486/uvloop-0.22.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e2ea3d6190a2968f4a14a23019d3b16870dd2190cd69c8180f7c632d21de68d", size = 4288562, upload-time = "2025-10-16T22:16:39.375Z" }, - { url = "https://files.pythonhosted.org/packages/15/c0/0be24758891ef825f2065cd5db8741aaddabe3e248ee6acc5e8a80f04005/uvloop-0.22.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0530a5fbad9c9e4ee3f2b33b148c6a64d47bbad8000ea63704fa8260f4cf728e", size = 4366890, upload-time = "2025-10-16T22:16:40.547Z" }, - { url = "https://files.pythonhosted.org/packages/d2/53/8369e5219a5855869bcee5f4d317f6da0e2c669aecf0ef7d371e3d084449/uvloop-0.22.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bc5ef13bbc10b5335792360623cc378d52d7e62c2de64660616478c32cd0598e", size = 4119472, upload-time = "2025-10-16T22:16:41.694Z" }, - { url = "https://files.pythonhosted.org/packages/f8/ba/d69adbe699b768f6b29a5eec7b47dd610bd17a69de51b251126a801369ea/uvloop-0.22.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1f38ec5e3f18c8a10ded09742f7fb8de0108796eb673f30ce7762ce1b8550cad", size = 4239051, upload-time = "2025-10-16T22:16:43.224Z" }, - { url = "https://files.pythonhosted.org/packages/90/cd/b62bdeaa429758aee8de8b00ac0dd26593a9de93d302bff3d21439e9791d/uvloop-0.22.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3879b88423ec7e97cd4eba2a443aa26ed4e59b45e6b76aabf13fe2f27023a142", size = 1362067, upload-time = "2025-10-16T22:16:44.503Z" }, - { url = "https://files.pythonhosted.org/packages/0d/f8/a132124dfda0777e489ca86732e85e69afcd1ff7686647000050ba670689/uvloop-0.22.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4baa86acedf1d62115c1dc6ad1e17134476688f08c6efd8a2ab076e815665c74", size = 752423, upload-time = "2025-10-16T22:16:45.968Z" }, - { url = "https://files.pythonhosted.org/packages/a3/94/94af78c156f88da4b3a733773ad5ba0b164393e357cc4bd0ab2e2677a7d6/uvloop-0.22.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:297c27d8003520596236bdb2335e6b3f649480bd09e00d1e3a99144b691d2a35", size = 4272437, upload-time = "2025-10-16T22:16:47.451Z" }, - { url = "https://files.pythonhosted.org/packages/b5/35/60249e9fd07b32c665192cec7af29e06c7cd96fa1d08b84f012a56a0b38e/uvloop-0.22.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1955d5a1dd43198244d47664a5858082a3239766a839b2102a269aaff7a4e25", size = 4292101, upload-time = "2025-10-16T22:16:49.318Z" }, - { url = "https://files.pythonhosted.org/packages/02/62/67d382dfcb25d0a98ce73c11ed1a6fba5037a1a1d533dcbb7cab033a2636/uvloop-0.22.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b31dc2fccbd42adc73bc4e7cdbae4fc5086cf378979e53ca5d0301838c5682c6", size = 4114158, upload-time = "2025-10-16T22:16:50.517Z" }, - { url = "https://files.pythonhosted.org/packages/f0/7a/f1171b4a882a5d13c8b7576f348acfe6074d72eaf52cccef752f748d4a9f/uvloop-0.22.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:93f617675b2d03af4e72a5333ef89450dfaa5321303ede6e67ba9c9d26878079", size = 4177360, upload-time = "2025-10-16T22:16:52.646Z" }, - { url = "https://files.pythonhosted.org/packages/79/7b/b01414f31546caf0919da80ad57cbfe24c56b151d12af68cee1b04922ca8/uvloop-0.22.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:37554f70528f60cad66945b885eb01f1bb514f132d92b6eeed1c90fd54ed6289", size = 1454790, upload-time = "2025-10-16T22:16:54.355Z" }, - { url = "https://files.pythonhosted.org/packages/d4/31/0bb232318dd838cad3fa8fb0c68c8b40e1145b32025581975e18b11fab40/uvloop-0.22.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b76324e2dc033a0b2f435f33eb88ff9913c156ef78e153fb210e03c13da746b3", size = 796783, upload-time = "2025-10-16T22:16:55.906Z" }, - { url = "https://files.pythonhosted.org/packages/42/38/c9b09f3271a7a723a5de69f8e237ab8e7803183131bc57c890db0b6bb872/uvloop-0.22.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:badb4d8e58ee08dad957002027830d5c3b06aea446a6a3744483c2b3b745345c", size = 4647548, upload-time = "2025-10-16T22:16:57.008Z" }, - { url = "https://files.pythonhosted.org/packages/c1/37/945b4ca0ac27e3dc4952642d4c900edd030b3da6c9634875af6e13ae80e5/uvloop-0.22.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b91328c72635f6f9e0282e4a57da7470c7350ab1c9f48546c0f2866205349d21", size = 4467065, upload-time = "2025-10-16T22:16:58.206Z" }, - { url = "https://files.pythonhosted.org/packages/97/cc/48d232f33d60e2e2e0b42f4e73455b146b76ebe216487e862700457fbf3c/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:daf620c2995d193449393d6c62131b3fbd40a63bf7b307a1527856ace637fe88", size = 4328384, upload-time = "2025-10-16T22:16:59.36Z" }, - { url = "https://files.pythonhosted.org/packages/e4/16/c1fd27e9549f3c4baf1dc9c20c456cd2f822dbf8de9f463824b0c0357e06/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6cde23eeda1a25c75b2e07d39970f3374105d5eafbaab2a4482be82f272d5a5e", size = 4296730, upload-time = "2025-10-16T22:17:00.744Z" }, -] - -[[package]] -name = "watchfiles" -version = "1.1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c2/c9/8869df9b2a2d6c59d79220a4db37679e74f807c559ffe5265e08b227a210/watchfiles-1.1.1.tar.gz", hash = "sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2", size = 94440, upload-time = "2025-10-14T15:06:21.08Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/f8/2c5f479fb531ce2f0564eda479faecf253d886b1ab3630a39b7bf7362d46/watchfiles-1.1.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f57b396167a2565a4e8b5e56a5a1c537571733992b226f4f1197d79e94cf0ae5", size = 406529, upload-time = "2025-10-14T15:04:32.899Z" }, - { url = "https://files.pythonhosted.org/packages/fe/cd/f515660b1f32f65df671ddf6f85bfaca621aee177712874dc30a97397977/watchfiles-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:421e29339983e1bebc281fab40d812742268ad057db4aee8c4d2bce0af43b741", size = 394384, upload-time = "2025-10-14T15:04:33.761Z" }, - { url = "https://files.pythonhosted.org/packages/7b/c3/28b7dc99733eab43fca2d10f55c86e03bd6ab11ca31b802abac26b23d161/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e43d39a741e972bab5d8100b5cdacf69db64e34eb19b6e9af162bccf63c5cc6", size = 448789, upload-time = "2025-10-14T15:04:34.679Z" }, - { url = "https://files.pythonhosted.org/packages/4a/24/33e71113b320030011c8e4316ccca04194bf0cbbaeee207f00cbc7d6b9f5/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f537afb3276d12814082a2e9b242bdcf416c2e8fd9f799a737990a1dbe906e5b", size = 460521, upload-time = "2025-10-14T15:04:35.963Z" }, - { url = "https://files.pythonhosted.org/packages/f4/c3/3c9a55f255aa57b91579ae9e98c88704955fa9dac3e5614fb378291155df/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2cd9e04277e756a2e2d2543d65d1e2166d6fd4c9b183f8808634fda23f17b14", size = 488722, upload-time = "2025-10-14T15:04:37.091Z" }, - { url = "https://files.pythonhosted.org/packages/49/36/506447b73eb46c120169dc1717fe2eff07c234bb3232a7200b5f5bd816e9/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f3f58818dc0b07f7d9aa7fe9eb1037aecb9700e63e1f6acfed13e9fef648f5d", size = 596088, upload-time = "2025-10-14T15:04:38.39Z" }, - { url = "https://files.pythonhosted.org/packages/82/ab/5f39e752a9838ec4d52e9b87c1e80f1ee3ccdbe92e183c15b6577ab9de16/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb9f66367023ae783551042d31b1d7fd422e8289eedd91f26754a66f44d5cff", size = 472923, upload-time = "2025-10-14T15:04:39.666Z" }, - { url = "https://files.pythonhosted.org/packages/af/b9/a419292f05e302dea372fa7e6fda5178a92998411f8581b9830d28fb9edb/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aebfd0861a83e6c3d1110b78ad54704486555246e542be3e2bb94195eabb2606", size = 456080, upload-time = "2025-10-14T15:04:40.643Z" }, - { url = "https://files.pythonhosted.org/packages/b0/c3/d5932fd62bde1a30c36e10c409dc5d54506726f08cb3e1d8d0ba5e2bc8db/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5fac835b4ab3c6487b5dbad78c4b3724e26bcc468e886f8ba8cc4306f68f6701", size = 629432, upload-time = "2025-10-14T15:04:41.789Z" }, - { url = "https://files.pythonhosted.org/packages/f7/77/16bddd9779fafb795f1a94319dc965209c5641db5bf1edbbccace6d1b3c0/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:399600947b170270e80134ac854e21b3ccdefa11a9529a3decc1327088180f10", size = 623046, upload-time = "2025-10-14T15:04:42.718Z" }, - { url = "https://files.pythonhosted.org/packages/46/ef/f2ecb9a0f342b4bfad13a2787155c6ee7ce792140eac63a34676a2feeef2/watchfiles-1.1.1-cp311-cp311-win32.whl", hash = "sha256:de6da501c883f58ad50db3a32ad397b09ad29865b5f26f64c24d3e3281685849", size = 271473, upload-time = "2025-10-14T15:04:43.624Z" }, - { url = "https://files.pythonhosted.org/packages/94/bc/f42d71125f19731ea435c3948cad148d31a64fccde3867e5ba4edee901f9/watchfiles-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:35c53bd62a0b885bf653ebf6b700d1bf05debb78ad9292cf2a942b23513dc4c4", size = 287598, upload-time = "2025-10-14T15:04:44.516Z" }, - { url = "https://files.pythonhosted.org/packages/57/c9/a30f897351f95bbbfb6abcadafbaca711ce1162f4db95fc908c98a9165f3/watchfiles-1.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:57ca5281a8b5e27593cb7d82c2ac927ad88a96ed406aa446f6344e4328208e9e", size = 277210, upload-time = "2025-10-14T15:04:45.883Z" }, - { url = "https://files.pythonhosted.org/packages/74/d5/f039e7e3c639d9b1d09b07ea412a6806d38123f0508e5f9b48a87b0a76cc/watchfiles-1.1.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8c89f9f2f740a6b7dcc753140dd5e1ab9215966f7a3530d0c0705c83b401bd7d", size = 404745, upload-time = "2025-10-14T15:04:46.731Z" }, - { url = "https://files.pythonhosted.org/packages/a5/96/a881a13aa1349827490dab2d363c8039527060cfcc2c92cc6d13d1b1049e/watchfiles-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd404be08018c37350f0d6e34676bd1e2889990117a2b90070b3007f172d0610", size = 391769, upload-time = "2025-10-14T15:04:48.003Z" }, - { url = "https://files.pythonhosted.org/packages/4b/5b/d3b460364aeb8da471c1989238ea0e56bec24b6042a68046adf3d9ddb01c/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8526e8f916bb5b9a0a777c8317c23ce65de259422bba5b31325a6fa6029d33af", size = 449374, upload-time = "2025-10-14T15:04:49.179Z" }, - { url = "https://files.pythonhosted.org/packages/b9/44/5769cb62d4ed055cb17417c0a109a92f007114a4e07f30812a73a4efdb11/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2edc3553362b1c38d9f06242416a5d8e9fe235c204a4072e988ce2e5bb1f69f6", size = 459485, upload-time = "2025-10-14T15:04:50.155Z" }, - { url = "https://files.pythonhosted.org/packages/19/0c/286b6301ded2eccd4ffd0041a1b726afda999926cf720aab63adb68a1e36/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30f7da3fb3f2844259cba4720c3fc7138eb0f7b659c38f3bfa65084c7fc7abce", size = 488813, upload-time = "2025-10-14T15:04:51.059Z" }, - { url = "https://files.pythonhosted.org/packages/c7/2b/8530ed41112dd4a22f4dcfdb5ccf6a1baad1ff6eed8dc5a5f09e7e8c41c7/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8979280bdafff686ba5e4d8f97840f929a87ed9cdf133cbbd42f7766774d2aa", size = 594816, upload-time = "2025-10-14T15:04:52.031Z" }, - { url = "https://files.pythonhosted.org/packages/ce/d2/f5f9fb49489f184f18470d4f99f4e862a4b3e9ac2865688eb2099e3d837a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcc5c24523771db3a294c77d94771abcfcb82a0e0ee8efd910c37c59ec1b31bb", size = 475186, upload-time = "2025-10-14T15:04:53.064Z" }, - { url = "https://files.pythonhosted.org/packages/cf/68/5707da262a119fb06fbe214d82dd1fe4a6f4af32d2d14de368d0349eb52a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db5d7ae38ff20153d542460752ff397fcf5c96090c1230803713cf3147a6803", size = 456812, upload-time = "2025-10-14T15:04:55.174Z" }, - { url = "https://files.pythonhosted.org/packages/66/ab/3cbb8756323e8f9b6f9acb9ef4ec26d42b2109bce830cc1f3468df20511d/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:28475ddbde92df1874b6c5c8aaeb24ad5be47a11f87cde5a28ef3835932e3e94", size = 630196, upload-time = "2025-10-14T15:04:56.22Z" }, - { url = "https://files.pythonhosted.org/packages/78/46/7152ec29b8335f80167928944a94955015a345440f524d2dfe63fc2f437b/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:36193ed342f5b9842edd3532729a2ad55c4160ffcfa3700e0d54be496b70dd43", size = 622657, upload-time = "2025-10-14T15:04:57.521Z" }, - { url = "https://files.pythonhosted.org/packages/0a/bf/95895e78dd75efe9a7f31733607f384b42eb5feb54bd2eb6ed57cc2e94f4/watchfiles-1.1.1-cp312-cp312-win32.whl", hash = "sha256:859e43a1951717cc8de7f4c77674a6d389b106361585951d9e69572823f311d9", size = 272042, upload-time = "2025-10-14T15:04:59.046Z" }, - { url = "https://files.pythonhosted.org/packages/87/0a/90eb755f568de2688cb220171c4191df932232c20946966c27a59c400850/watchfiles-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:91d4c9a823a8c987cce8fa2690923b069966dabb196dd8d137ea2cede885fde9", size = 288410, upload-time = "2025-10-14T15:05:00.081Z" }, - { url = "https://files.pythonhosted.org/packages/36/76/f322701530586922fbd6723c4f91ace21364924822a8772c549483abed13/watchfiles-1.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:a625815d4a2bdca61953dbba5a39d60164451ef34c88d751f6c368c3ea73d404", size = 278209, upload-time = "2025-10-14T15:05:01.168Z" }, - { url = "https://files.pythonhosted.org/packages/bb/f4/f750b29225fe77139f7ae5de89d4949f5a99f934c65a1f1c0b248f26f747/watchfiles-1.1.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:130e4876309e8686a5e37dba7d5e9bc77e6ed908266996ca26572437a5271e18", size = 404321, upload-time = "2025-10-14T15:05:02.063Z" }, - { url = "https://files.pythonhosted.org/packages/2b/f9/f07a295cde762644aa4c4bb0f88921d2d141af45e735b965fb2e87858328/watchfiles-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f3bde70f157f84ece3765b42b4a52c6ac1a50334903c6eaf765362f6ccca88a", size = 391783, upload-time = "2025-10-14T15:05:03.052Z" }, - { url = "https://files.pythonhosted.org/packages/bc/11/fc2502457e0bea39a5c958d86d2cb69e407a4d00b85735ca724bfa6e0d1a/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e0b1fe858430fc0251737ef3824c54027bedb8c37c38114488b8e131cf8219", size = 449279, upload-time = "2025-10-14T15:05:04.004Z" }, - { url = "https://files.pythonhosted.org/packages/e3/1f/d66bc15ea0b728df3ed96a539c777acfcad0eb78555ad9efcaa1274688f0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f27db948078f3823a6bb3b465180db8ebecf26dd5dae6f6180bd87383b6b4428", size = 459405, upload-time = "2025-10-14T15:05:04.942Z" }, - { url = "https://files.pythonhosted.org/packages/be/90/9f4a65c0aec3ccf032703e6db02d89a157462fbb2cf20dd415128251cac0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:059098c3a429f62fc98e8ec62b982230ef2c8df68c79e826e37b895bc359a9c0", size = 488976, upload-time = "2025-10-14T15:05:05.905Z" }, - { url = "https://files.pythonhosted.org/packages/37/57/ee347af605d867f712be7029bb94c8c071732a4b44792e3176fa3c612d39/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfb5862016acc9b869bb57284e6cb35fdf8e22fe59f7548858e2f971d045f150", size = 595506, upload-time = "2025-10-14T15:05:06.906Z" }, - { url = "https://files.pythonhosted.org/packages/a8/78/cc5ab0b86c122047f75e8fc471c67a04dee395daf847d3e59381996c8707/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:319b27255aacd9923b8a276bb14d21a5f7ff82564c744235fc5eae58d95422ae", size = 474936, upload-time = "2025-10-14T15:05:07.906Z" }, - { url = "https://files.pythonhosted.org/packages/62/da/def65b170a3815af7bd40a3e7010bf6ab53089ef1b75d05dd5385b87cf08/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c755367e51db90e75b19454b680903631d41f9e3607fbd941d296a020c2d752d", size = 456147, upload-time = "2025-10-14T15:05:09.138Z" }, - { url = "https://files.pythonhosted.org/packages/57/99/da6573ba71166e82d288d4df0839128004c67d2778d3b566c138695f5c0b/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c22c776292a23bfc7237a98f791b9ad3144b02116ff10d820829ce62dff46d0b", size = 630007, upload-time = "2025-10-14T15:05:10.117Z" }, - { url = "https://files.pythonhosted.org/packages/a8/51/7439c4dd39511368849eb1e53279cd3454b4a4dbace80bab88feeb83c6b5/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3a476189be23c3686bc2f4321dd501cb329c0a0469e77b7b534ee10129ae6374", size = 622280, upload-time = "2025-10-14T15:05:11.146Z" }, - { url = "https://files.pythonhosted.org/packages/95/9c/8ed97d4bba5db6fdcdb2b298d3898f2dd5c20f6b73aee04eabe56c59677e/watchfiles-1.1.1-cp313-cp313-win32.whl", hash = "sha256:bf0a91bfb5574a2f7fc223cf95eeea79abfefa404bf1ea5e339c0c1560ae99a0", size = 272056, upload-time = "2025-10-14T15:05:12.156Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f3/c14e28429f744a260d8ceae18bf58c1d5fa56b50d006a7a9f80e1882cb0d/watchfiles-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:52e06553899e11e8074503c8e716d574adeeb7e68913115c4b3653c53f9bae42", size = 288162, upload-time = "2025-10-14T15:05:13.208Z" }, - { url = "https://files.pythonhosted.org/packages/dc/61/fe0e56c40d5cd29523e398d31153218718c5786b5e636d9ae8ae79453d27/watchfiles-1.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:ac3cc5759570cd02662b15fbcd9d917f7ecd47efe0d6b40474eafd246f91ea18", size = 277909, upload-time = "2025-10-14T15:05:14.49Z" }, - { url = "https://files.pythonhosted.org/packages/79/42/e0a7d749626f1e28c7108a99fb9bf524b501bbbeb9b261ceecde644d5a07/watchfiles-1.1.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:563b116874a9a7ce6f96f87cd0b94f7faf92d08d0021e837796f0a14318ef8da", size = 403389, upload-time = "2025-10-14T15:05:15.777Z" }, - { url = "https://files.pythonhosted.org/packages/15/49/08732f90ce0fbbc13913f9f215c689cfc9ced345fb1bcd8829a50007cc8d/watchfiles-1.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3ad9fe1dae4ab4212d8c91e80b832425e24f421703b5a42ef2e4a1e215aff051", size = 389964, upload-time = "2025-10-14T15:05:16.85Z" }, - { url = "https://files.pythonhosted.org/packages/27/0d/7c315d4bd5f2538910491a0393c56bf70d333d51bc5b34bee8e68e8cea19/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce70f96a46b894b36eba678f153f052967a0d06d5b5a19b336ab0dbbd029f73e", size = 448114, upload-time = "2025-10-14T15:05:17.876Z" }, - { url = "https://files.pythonhosted.org/packages/c3/24/9e096de47a4d11bc4df41e9d1e61776393eac4cb6eb11b3e23315b78b2cc/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cb467c999c2eff23a6417e58d75e5828716f42ed8289fe6b77a7e5a91036ca70", size = 460264, upload-time = "2025-10-14T15:05:18.962Z" }, - { url = "https://files.pythonhosted.org/packages/cc/0f/e8dea6375f1d3ba5fcb0b3583e2b493e77379834c74fd5a22d66d85d6540/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:836398932192dae4146c8f6f737d74baeac8b70ce14831a239bdb1ca882fc261", size = 487877, upload-time = "2025-10-14T15:05:20.094Z" }, - { url = "https://files.pythonhosted.org/packages/ac/5b/df24cfc6424a12deb41503b64d42fbea6b8cb357ec62ca84a5a3476f654a/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:743185e7372b7bc7c389e1badcc606931a827112fbbd37f14c537320fca08620", size = 595176, upload-time = "2025-10-14T15:05:21.134Z" }, - { url = "https://files.pythonhosted.org/packages/8f/b5/853b6757f7347de4e9b37e8cc3289283fb983cba1ab4d2d7144694871d9c/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afaeff7696e0ad9f02cbb8f56365ff4686ab205fcf9c4c5b6fdfaaa16549dd04", size = 473577, upload-time = "2025-10-14T15:05:22.306Z" }, - { url = "https://files.pythonhosted.org/packages/e1/f7/0a4467be0a56e80447c8529c9fce5b38eab4f513cb3d9bf82e7392a5696b/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7eb7da0eb23aa2ba036d4f616d46906013a68caf61b7fdbe42fc8b25132e77", size = 455425, upload-time = "2025-10-14T15:05:23.348Z" }, - { url = "https://files.pythonhosted.org/packages/8e/e0/82583485ea00137ddf69bc84a2db88bd92ab4a6e3c405e5fb878ead8d0e7/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:831a62658609f0e5c64178211c942ace999517f5770fe9436be4c2faeba0c0ef", size = 628826, upload-time = "2025-10-14T15:05:24.398Z" }, - { url = "https://files.pythonhosted.org/packages/28/9a/a785356fccf9fae84c0cc90570f11702ae9571036fb25932f1242c82191c/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f9a2ae5c91cecc9edd47e041a930490c31c3afb1f5e6d71de3dc671bfaca02bf", size = 622208, upload-time = "2025-10-14T15:05:25.45Z" }, - { url = "https://files.pythonhosted.org/packages/c3/f4/0872229324ef69b2c3edec35e84bd57a1289e7d3fe74588048ed8947a323/watchfiles-1.1.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:d1715143123baeeaeadec0528bb7441103979a1d5f6fd0e1f915383fea7ea6d5", size = 404315, upload-time = "2025-10-14T15:05:26.501Z" }, - { url = "https://files.pythonhosted.org/packages/7b/22/16d5331eaed1cb107b873f6ae1b69e9ced582fcf0c59a50cd84f403b1c32/watchfiles-1.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:39574d6370c4579d7f5d0ad940ce5b20db0e4117444e39b6d8f99db5676c52fd", size = 390869, upload-time = "2025-10-14T15:05:27.649Z" }, - { url = "https://files.pythonhosted.org/packages/b2/7e/5643bfff5acb6539b18483128fdc0ef2cccc94a5b8fbda130c823e8ed636/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7365b92c2e69ee952902e8f70f3ba6360d0d596d9299d55d7d386df84b6941fb", size = 449919, upload-time = "2025-10-14T15:05:28.701Z" }, - { url = "https://files.pythonhosted.org/packages/51/2e/c410993ba5025a9f9357c376f48976ef0e1b1aefb73b97a5ae01a5972755/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bfff9740c69c0e4ed32416f013f3c45e2ae42ccedd1167ef2d805c000b6c71a5", size = 460845, upload-time = "2025-10-14T15:05:30.064Z" }, - { url = "https://files.pythonhosted.org/packages/8e/a4/2df3b404469122e8680f0fcd06079317e48db58a2da2950fb45020947734/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b27cf2eb1dda37b2089e3907d8ea92922b673c0c427886d4edc6b94d8dfe5db3", size = 489027, upload-time = "2025-10-14T15:05:31.064Z" }, - { url = "https://files.pythonhosted.org/packages/ea/84/4587ba5b1f267167ee715b7f66e6382cca6938e0a4b870adad93e44747e6/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:526e86aced14a65a5b0ec50827c745597c782ff46b571dbfe46192ab9e0b3c33", size = 595615, upload-time = "2025-10-14T15:05:32.074Z" }, - { url = "https://files.pythonhosted.org/packages/6a/0f/c6988c91d06e93cd0bb3d4a808bcf32375ca1904609835c3031799e3ecae/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04e78dd0b6352db95507fd8cb46f39d185cf8c74e4cf1e4fbad1d3df96faf510", size = 474836, upload-time = "2025-10-14T15:05:33.209Z" }, - { url = "https://files.pythonhosted.org/packages/b4/36/ded8aebea91919485b7bbabbd14f5f359326cb5ec218cd67074d1e426d74/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c85794a4cfa094714fb9c08d4a218375b2b95b8ed1666e8677c349906246c05", size = 455099, upload-time = "2025-10-14T15:05:34.189Z" }, - { url = "https://files.pythonhosted.org/packages/98/e0/8c9bdba88af756a2fce230dd365fab2baf927ba42cd47521ee7498fd5211/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:74d5012b7630714b66be7b7b7a78855ef7ad58e8650c73afc4c076a1f480a8d6", size = 630626, upload-time = "2025-10-14T15:05:35.216Z" }, - { url = "https://files.pythonhosted.org/packages/2a/84/a95db05354bf2d19e438520d92a8ca475e578c647f78f53197f5a2f17aaf/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:8fbe85cb3201c7d380d3d0b90e63d520f15d6afe217165d7f98c9c649654db81", size = 622519, upload-time = "2025-10-14T15:05:36.259Z" }, - { url = "https://files.pythonhosted.org/packages/1d/ce/d8acdc8de545de995c339be67711e474c77d643555a9bb74a9334252bd55/watchfiles-1.1.1-cp314-cp314-win32.whl", hash = "sha256:3fa0b59c92278b5a7800d3ee7733da9d096d4aabcfabb9a928918bd276ef9b9b", size = 272078, upload-time = "2025-10-14T15:05:37.63Z" }, - { url = "https://files.pythonhosted.org/packages/c4/c9/a74487f72d0451524be827e8edec251da0cc1fcf111646a511ae752e1a3d/watchfiles-1.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:c2047d0b6cea13b3316bdbafbfa0c4228ae593d995030fda39089d36e64fc03a", size = 287664, upload-time = "2025-10-14T15:05:38.95Z" }, - { url = "https://files.pythonhosted.org/packages/df/b8/8ac000702cdd496cdce998c6f4ee0ca1f15977bba51bdf07d872ebdfc34c/watchfiles-1.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:842178b126593addc05acf6fce960d28bc5fae7afbaa2c6c1b3a7b9460e5be02", size = 277154, upload-time = "2025-10-14T15:05:39.954Z" }, - { url = "https://files.pythonhosted.org/packages/47/a8/e3af2184707c29f0f14b1963c0aace6529f9d1b8582d5b99f31bbf42f59e/watchfiles-1.1.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:88863fbbc1a7312972f1c511f202eb30866370ebb8493aef2812b9ff28156a21", size = 403820, upload-time = "2025-10-14T15:05:40.932Z" }, - { url = "https://files.pythonhosted.org/packages/c0/ec/e47e307c2f4bd75f9f9e8afbe3876679b18e1bcec449beca132a1c5ffb2d/watchfiles-1.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:55c7475190662e202c08c6c0f4d9e345a29367438cf8e8037f3155e10a88d5a5", size = 390510, upload-time = "2025-10-14T15:05:41.945Z" }, - { url = "https://files.pythonhosted.org/packages/d5/a0/ad235642118090f66e7b2f18fd5c42082418404a79205cdfca50b6309c13/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f53fa183d53a1d7a8852277c92b967ae99c2d4dcee2bfacff8868e6e30b15f7", size = 448408, upload-time = "2025-10-14T15:05:43.385Z" }, - { url = "https://files.pythonhosted.org/packages/df/85/97fa10fd5ff3332ae17e7e40e20784e419e28521549780869f1413742e9d/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6aae418a8b323732fa89721d86f39ec8f092fc2af67f4217a2b07fd3e93c6101", size = 458968, upload-time = "2025-10-14T15:05:44.404Z" }, - { url = "https://files.pythonhosted.org/packages/47/c2/9059c2e8966ea5ce678166617a7f75ecba6164375f3b288e50a40dc6d489/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f096076119da54a6080e8920cbdaac3dbee667eb91dcc5e5b78840b87415bd44", size = 488096, upload-time = "2025-10-14T15:05:45.398Z" }, - { url = "https://files.pythonhosted.org/packages/94/44/d90a9ec8ac309bc26db808a13e7bfc0e4e78b6fc051078a554e132e80160/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00485f441d183717038ed2e887a7c868154f216877653121068107b227a2f64c", size = 596040, upload-time = "2025-10-14T15:05:46.502Z" }, - { url = "https://files.pythonhosted.org/packages/95/68/4e3479b20ca305cfc561db3ed207a8a1c745ee32bf24f2026a129d0ddb6e/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a55f3e9e493158d7bfdb60a1165035f1cf7d320914e7b7ea83fe22c6023b58fc", size = 473847, upload-time = "2025-10-14T15:05:47.484Z" }, - { url = "https://files.pythonhosted.org/packages/4f/55/2af26693fd15165c4ff7857e38330e1b61ab8c37d15dc79118cdba115b7a/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c91ed27800188c2ae96d16e3149f199d62f86c7af5f5f4d2c61a3ed8cd3666c", size = 455072, upload-time = "2025-10-14T15:05:48.928Z" }, - { url = "https://files.pythonhosted.org/packages/66/1d/d0d200b10c9311ec25d2273f8aad8c3ef7cc7ea11808022501811208a750/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:311ff15a0bae3714ffb603e6ba6dbfba4065ab60865d15a6ec544133bdb21099", size = 629104, upload-time = "2025-10-14T15:05:49.908Z" }, - { url = "https://files.pythonhosted.org/packages/e3/bd/fa9bb053192491b3867ba07d2343d9f2252e00811567d30ae8d0f78136fe/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a916a2932da8f8ab582f242c065f5c81bed3462849ca79ee357dd9551b0e9b01", size = 622112, upload-time = "2025-10-14T15:05:50.941Z" }, - { url = "https://files.pythonhosted.org/packages/d3/8e/e500f8b0b77be4ff753ac94dc06b33d8f0d839377fee1b78e8c8d8f031bf/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:db476ab59b6765134de1d4fe96a1a9c96ddf091683599be0f26147ea1b2e4b88", size = 408250, upload-time = "2025-10-14T15:06:10.264Z" }, - { url = "https://files.pythonhosted.org/packages/bd/95/615e72cd27b85b61eec764a5ca51bd94d40b5adea5ff47567d9ebc4d275a/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89eef07eee5e9d1fda06e38822ad167a044153457e6fd997f8a858ab7564a336", size = 396117, upload-time = "2025-10-14T15:06:11.28Z" }, - { url = "https://files.pythonhosted.org/packages/c9/81/e7fe958ce8a7fb5c73cc9fb07f5aeaf755e6aa72498c57d760af760c91f8/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce19e06cbda693e9e7686358af9cd6f5d61312ab8b00488bc36f5aabbaf77e24", size = 450493, upload-time = "2025-10-14T15:06:12.321Z" }, - { url = "https://files.pythonhosted.org/packages/6e/d4/ed38dd3b1767193de971e694aa544356e63353c33a85d948166b5ff58b9e/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e6f39af2eab0118338902798b5aa6664f46ff66bc0280de76fca67a7f262a49", size = 457546, upload-time = "2025-10-14T15:06:13.372Z" }, -] - -[[package]] -name = "websockets" -version = "15.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/32/18fcd5919c293a398db67443acd33fde142f283853076049824fc58e6f75/websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", size = 175423, upload-time = "2025-03-05T20:01:56.276Z" }, - { url = "https://files.pythonhosted.org/packages/76/70/ba1ad96b07869275ef42e2ce21f07a5b0148936688c2baf7e4a1f60d5058/websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", size = 173082, upload-time = "2025-03-05T20:01:57.563Z" }, - { url = "https://files.pythonhosted.org/packages/86/f2/10b55821dd40eb696ce4704a87d57774696f9451108cff0d2824c97e0f97/websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", size = 173330, upload-time = "2025-03-05T20:01:59.063Z" }, - { url = "https://files.pythonhosted.org/packages/a5/90/1c37ae8b8a113d3daf1065222b6af61cc44102da95388ac0018fcb7d93d9/websockets-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562", size = 182878, upload-time = "2025-03-05T20:02:00.305Z" }, - { url = "https://files.pythonhosted.org/packages/8e/8d/96e8e288b2a41dffafb78e8904ea7367ee4f891dafc2ab8d87e2124cb3d3/websockets-15.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792", size = 181883, upload-time = "2025-03-05T20:02:03.148Z" }, - { url = "https://files.pythonhosted.org/packages/93/1f/5d6dbf551766308f6f50f8baf8e9860be6182911e8106da7a7f73785f4c4/websockets-15.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413", size = 182252, upload-time = "2025-03-05T20:02:05.29Z" }, - { url = "https://files.pythonhosted.org/packages/d4/78/2d4fed9123e6620cbf1706c0de8a1632e1a28e7774d94346d7de1bba2ca3/websockets-15.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8", size = 182521, upload-time = "2025-03-05T20:02:07.458Z" }, - { url = "https://files.pythonhosted.org/packages/e7/3b/66d4c1b444dd1a9823c4a81f50231b921bab54eee2f69e70319b4e21f1ca/websockets-15.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3", size = 181958, upload-time = "2025-03-05T20:02:09.842Z" }, - { url = "https://files.pythonhosted.org/packages/08/ff/e9eed2ee5fed6f76fdd6032ca5cd38c57ca9661430bb3d5fb2872dc8703c/websockets-15.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf", size = 181918, upload-time = "2025-03-05T20:02:11.968Z" }, - { url = "https://files.pythonhosted.org/packages/d8/75/994634a49b7e12532be6a42103597b71098fd25900f7437d6055ed39930a/websockets-15.0.1-cp311-cp311-win32.whl", hash = "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85", size = 176388, upload-time = "2025-03-05T20:02:13.32Z" }, - { url = "https://files.pythonhosted.org/packages/98/93/e36c73f78400a65f5e236cd376713c34182e6663f6889cd45a4a04d8f203/websockets-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065", size = 176828, upload-time = "2025-03-05T20:02:14.585Z" }, - { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437, upload-time = "2025-03-05T20:02:16.706Z" }, - { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096, upload-time = "2025-03-05T20:02:18.832Z" }, - { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332, upload-time = "2025-03-05T20:02:20.187Z" }, - { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152, upload-time = "2025-03-05T20:02:22.286Z" }, - { url = "https://files.pythonhosted.org/packages/74/45/c205c8480eafd114b428284840da0b1be9ffd0e4f87338dc95dc6ff961a1/websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", size = 182096, upload-time = "2025-03-05T20:02:24.368Z" }, - { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523, upload-time = "2025-03-05T20:02:25.669Z" }, - { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790, upload-time = "2025-03-05T20:02:26.99Z" }, - { url = "https://files.pythonhosted.org/packages/02/05/c68c5adbf679cf610ae2f74a9b871ae84564462955d991178f95a1ddb7dd/websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", size = 182165, upload-time = "2025-03-05T20:02:30.291Z" }, - { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160, upload-time = "2025-03-05T20:02:31.634Z" }, - { url = "https://files.pythonhosted.org/packages/ff/83/de1f7709376dc3ca9b7eeb4b9a07b4526b14876b6d372a4dc62312bebee0/websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", size = 176395, upload-time = "2025-03-05T20:02:33.017Z" }, - { url = "https://files.pythonhosted.org/packages/7d/71/abf2ebc3bbfa40f391ce1428c7168fb20582d0ff57019b69ea20fa698043/websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7", size = 176841, upload-time = "2025-03-05T20:02:34.498Z" }, - { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload-time = "2025-03-05T20:02:36.695Z" }, - { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload-time = "2025-03-05T20:02:37.985Z" }, - { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload-time = "2025-03-05T20:02:39.298Z" }, - { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload-time = "2025-03-05T20:02:40.595Z" }, - { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload-time = "2025-03-05T20:02:41.926Z" }, - { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload-time = "2025-03-05T20:02:43.304Z" }, - { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload-time = "2025-03-05T20:02:48.812Z" }, - { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload-time = "2025-03-05T20:02:50.14Z" }, - { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload-time = "2025-03-05T20:02:51.561Z" }, - { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload-time = "2025-03-05T20:02:53.814Z" }, - { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload-time = "2025-03-05T20:02:55.237Z" }, - { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" }, -] diff --git a/skills/whoopskill/SKILL.md b/skills/whoopskill/SKILL.md deleted file mode 100644 index 5965ac25c..000000000 --- a/skills/whoopskill/SKILL.md +++ /dev/null @@ -1,102 +0,0 @@ ---- -name: whoopskill -description: WHOOP health data CLI - sleep, recovery, strain, workouts via OAuth2. -homepage: https://github.com/koala73/whoopskill -metadata: {"clawdbot":{"emoji":"💪","requires":{"bins":["whoopskill"],"env":["WHOOP_CLIENT_ID","WHOOP_CLIENT_SECRET","WHOOP_REDIRECT_URI"]}}} ---- - -# whoopskill - -CLI for fetching WHOOP health data (sleep, recovery, strain, workouts). - -## Setup - -1. Create a WHOOP developer app at https://developer.whoop.com -2. Set environment variables: - ```bash - export WHOOP_CLIENT_ID=your_client_id - export WHOOP_CLIENT_SECRET=your_client_secret - export WHOOP_REDIRECT_URI=https://your-callback-url - ``` -3. Install: `npm install -g whoopskill` -4. Login: `whoopskill auth login` - -## Commands - -### Authentication -```bash -whoopskill auth login # OAuth login flow -whoopskill auth logout # Clear tokens -whoopskill auth status # Check token status (shows expiry) -whoopskill auth refresh # Proactively refresh token (for cron jobs) -``` - -### Data Fetching -```bash -whoopskill sleep --pretty --limit 7 # Last 7 sleep records -whoopskill recovery --pretty # Today's recovery -whoopskill workout --pretty --limit 5 # Recent workouts -whoopskill cycle --pretty # Current cycle (strain) -whoopskill summary # One-liner snapshot -whoopskill profile # User profile -whoopskill body # Body measurements -``` - -### Options -- `-d, --date ` — Specific date -- `-l, --limit ` — Max results (default: 25) -- `-a, --all` — Fetch all pages -- `-p, --pretty` — Human-readable output - -## Token Refresh (Important!) - -WHOOP access tokens expire in **1 hour**. The CLI auto-refreshes when making API calls, but if you don't use it for a while, the **refresh token can also expire** (typically 7-30 days). - -### Best Practice: Keep Tokens Fresh -Set up a cron job to refresh tokens regularly: - -```bash -# Every 30 minutes - runs an API call which triggers auto-refresh -*/30 * * * * WHOOP_CLIENT_ID=xxx WHOOP_CLIENT_SECRET=yyy whoopskill cycle --limit 1 > /dev/null 2>&1 -``` - -Or use the explicit refresh command: -```bash -*/30 * * * * WHOOP_CLIENT_ID=xxx WHOOP_CLIENT_SECRET=yyy whoopskill auth refresh > /dev/null 2>&1 -``` - -### If Refresh Token Expires -You'll need to re-authenticate: -```bash -whoopskill auth login -``` - -## Example Outputs - -### Summary -``` -2026-01-07 | Recovery: 68% | Sleep: 74% | Strain: 6.8 | Workouts: 1 -``` - -### Sleep (pretty) -``` -Date: 2026-01-07 -Performance: 74% -Duration: 6h 16m -Efficiency: 86% -Stages: - - Light: 3h 7m - - Deep: 1h 28m - - REM: 1h 41m -Disturbances: 2 -``` - -## Token Storage - -Tokens are stored in `~/.whoop-cli/tokens.json` with 600 permissions. - -## Troubleshooting - -**"Missing WHOOP_CLIENT_ID..."** — Set env vars before running -**"Token refresh failed"** — Refresh token expired, run `whoopskill auth login` -**Empty data** — WHOOP API may be delayed; data syncs from device periodically diff --git a/src/agents/pi-embedded-helpers.ts b/src/agents/pi-embedded-helpers.ts index 90cb6e713..81d129b4a 100644 --- a/src/agents/pi-embedded-helpers.ts +++ b/src/agents/pi-embedded-helpers.ts @@ -1,7 +1,10 @@ import fs from "node:fs/promises"; import path from "node:path"; -import type { AgentMessage, AgentToolResult } from "@mariozechner/pi-agent-core"; +import type { + AgentMessage, + AgentToolResult, +} from "@mariozechner/pi-agent-core"; import type { AssistantMessage } from "@mariozechner/pi-ai"; import { normalizeThinkLevel, diff --git a/src/agents/pi-embedded-runner.ts b/src/agents/pi-embedded-runner.ts index cc850848e..9fab11a0a 100644 --- a/src/agents/pi-embedded-runner.ts +++ b/src/agents/pi-embedded-runner.ts @@ -758,7 +758,6 @@ export async function compactEmbeddedPiSession(params: { enqueue?: typeof enqueueCommand; extraSystemPrompt?: string; ownerNumbers?: string[]; - serveBaseUrl?: string; }): Promise { const sessionLane = resolveSessionLane( params.sessionKey?.trim() || params.sessionId, @@ -854,7 +853,6 @@ export async function compactEmbeddedPiSession(params: { sessionKey: params.sessionKey ?? params.sessionId, agentDir, config: params.config, - serveBaseUrl: params.serveBaseUrl, }); const machineName = await getMachineDisplayName(); const runtimeInfo = { @@ -1017,7 +1015,6 @@ export async function runEmbeddedPiAgent(params: { extraSystemPrompt?: string; ownerNumbers?: string[]; enforceFinalTag?: boolean; - serveBaseUrl?: string; }): Promise { const sessionLane = resolveSessionLane( params.sessionKey?.trim() || params.sessionId, @@ -1053,7 +1050,7 @@ export async function runEmbeddedPiAgent(params: { provider, preferredProfile: explicitProfileId, }); -if (explicitProfileId && !profileOrder.includes(explicitProfileId)) { + if (explicitProfileId && !profileOrder.includes(explicitProfileId)) { throw new Error( `Auth profile "${explicitProfileId}" is not configured for ${provider}.`, ); @@ -1169,7 +1166,6 @@ if (explicitProfileId && !profileOrder.includes(explicitProfileId)) { sessionKey: params.sessionKey ?? params.sessionId, agentDir, config: params.config, - serveBaseUrl: params.serveBaseUrl, }); const machineName = await getMachineDisplayName(); const runtimeInfo = { diff --git a/src/agents/pi-tools.ts b/src/agents/pi-tools.ts index 5efac526b..f78d9e248 100644 --- a/src/agents/pi-tools.ts +++ b/src/agents/pi-tools.ts @@ -508,7 +508,6 @@ export function createClawdbotCodingTools(options?: { sessionKey?: string; agentDir?: string; config?: ClawdbotConfig; - serveBaseUrl?: string; }): AnyAgentTool[] { const bashToolName = "bash"; const sandbox = options?.sandbox?.enabled ? options.sandbox : undefined; diff --git a/src/agents/tools/serve-tool.ts b/src/agents/tools/serve-tool.ts deleted file mode 100644 index 3d1c2619e..000000000 --- a/src/agents/tools/serve-tool.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { Type } from "@sinclair/typebox"; - -import { getTailnetHostname } from "../../infra/tailscale.js"; -import { - serveCreate, - serveDelete, - serveList, -} from "../../gateway/serve.js"; -import { type AnyAgentTool, jsonResult, readStringParam } from "./common.js"; - -async function resolveServeBaseUrl(providedUrl?: string): Promise { - if (providedUrl) return providedUrl; - try { - const tailnetHost = await getTailnetHostname(); - return `https://${tailnetHost}`; - } catch { - return "http://localhost:18789"; - } -} - -export function createServeTool(opts?: { baseUrl?: string }): AnyAgentTool { - return { - label: "Serve File", - name: "serve", - description: - "Create a publicly accessible URL for a file. Returns a URL that can be shared. " + - "Supports optional title, description, and OG image for rich link previews. " + - "TTL can be specified as a duration (e.g., '1h', '7d') or 'forever'.", - parameters: Type.Object({ - path: Type.String({ description: "Absolute path to the file to serve" }), - slug: Type.Optional( - Type.String({ description: "Custom URL slug (auto-generated if omitted)" }), - ), - title: Type.Optional( - Type.String({ description: "Title for link preview" }), - ), - description: Type.Optional( - Type.String({ description: "Description for link preview" }), - ), - ttl: Type.Optional( - Type.String({ - description: "Time to live: '1h', '7d', 'forever' (default: '24h')", - }), - ), - ogImage: Type.Optional( - Type.String({ description: "URL or path to Open Graph preview image" }), - ), - }), - execute: async (_toolCallId: string, args: unknown) => { - const params = (args ?? {}) as Record; - const filePath = readStringParam(params, "path", { required: true }); - const slug = readStringParam(params, "slug"); - const title = readStringParam(params, "title"); - const description = readStringParam(params, "description"); - const ttl = readStringParam(params, "ttl"); - const ogImage = readStringParam(params, "ogImage"); - - const baseUrl = await resolveServeBaseUrl(opts?.baseUrl); - const result = serveCreate( - { path: filePath, slug: slug || "file", title: title || "", description: description || "", ttl, ogImage }, - baseUrl, - ); - return jsonResult(result); - }, - }; -} - -export function createServeListTool(opts?: { baseUrl?: string }): AnyAgentTool { - return { - label: "List Served Files", - name: "serve_list", - description: "List all currently served files with their URLs and metadata.", - parameters: Type.Object({}), - execute: async () => { - const baseUrl = await resolveServeBaseUrl(opts?.baseUrl); - const items = serveList(baseUrl); - return jsonResult({ count: items.length, items }); - }, - }; -} - -export function createServeDeleteTool(): AnyAgentTool { - return { - label: "Delete Served File", - name: "serve_delete", - description: "Remove a served file by its slug.", - parameters: Type.Object({ - slug: Type.String({ description: "The slug of the served file to delete" }), - }), - execute: async (_toolCallId: string, args: unknown) => { - const params = (args ?? {}) as Record; - const slug = readStringParam(params, "slug", { required: true }); - const deleted = serveDelete(slug); - return jsonResult({ deleted, slug }); - }, - }; -} diff --git a/src/gateway/serve.ts b/src/gateway/serve.ts deleted file mode 100644 index c791737d9..000000000 --- a/src/gateway/serve.ts +++ /dev/null @@ -1,366 +0,0 @@ -import { createHash } from "node:crypto"; -import { - existsSync, - mkdirSync, - readFileSync, - readdirSync, - unlinkSync, - writeFileSync, - copyFileSync, - statSync, -} from "node:fs"; -import { extname, join, basename } from "node:path"; -import type { IncomingMessage, ServerResponse } from "node:http"; -import MarkdownIt from "markdown-it"; -import { CONFIG_DIR } from "../utils.js"; - -const md = new MarkdownIt({ html: true, linkify: true, typographer: true }); - -export type ServeMetadata = { - slug: string; - contentPath: string; - contentHash: string; - contentType: string; - size: number; - title: string; - description: string; - ogImage: string | null; - createdAt: string; - expiresAt: string | null; - ttl: string; -}; - -export type ServeCreateParams = { - path: string; - slug: string; - title: string; - description: string; - ttl?: string; - ogImage?: string; -}; - -const SERVE_DIR = join(CONFIG_DIR, "serve"); - -function ensureServeDir() { - if (!existsSync(SERVE_DIR)) { - mkdirSync(SERVE_DIR, { recursive: true }); - } -} - -export function parseTtl(ttl: string): number | null { - if (ttl === "forever") return null; - const match = ttl.match(/^(\d+)(m|h|d)$/); - if (!match) return 24 * 60 * 60 * 1000; // default 24h - const value = parseInt(match[1], 10); - const unit = match[2]; - switch (unit) { - case "m": - return value * 60 * 1000; - case "h": - return value * 60 * 60 * 1000; - case "d": - return value * 24 * 60 * 60 * 1000; - default: - return 24 * 60 * 60 * 1000; - } -} - -function hashContent(content: Buffer): string { - return createHash("sha256").update(content).digest("hex").slice(0, 16); -} - -function getMimeType(ext: string): string { - const mimes: Record = { - ".md": "text/markdown", - ".html": "text/html", - ".htm": "text/html", - ".txt": "text/plain", - ".json": "application/json", - ".pdf": "application/pdf", - ".png": "image/png", - ".jpg": "image/jpeg", - ".jpeg": "image/jpeg", - ".gif": "image/gif", - ".svg": "image/svg+xml", - ".webp": "image/webp", - ".mp3": "audio/mpeg", - ".wav": "audio/wav", - ".mp4": "video/mp4", - ".webm": "video/webm", - ".css": "text/css", - ".js": "application/javascript", - }; - return mimes[ext.toLowerCase()] ?? "application/octet-stream"; -} - -function findUniqueSlug(baseSlug: string): string { - ensureServeDir(); - let slug = baseSlug; - let counter = 1; - while (existsSync(join(SERVE_DIR, `${slug}.json`))) { - const existing = loadMetadata(slug); - if (!existing) break; - slug = `${baseSlug}-${counter}`; - counter++; - } - return slug; -} - -function loadMetadata(slug: string): ServeMetadata | null { - const metaPath = join(SERVE_DIR, `${slug}.json`); - if (!existsSync(metaPath)) return null; - try { - return JSON.parse(readFileSync(metaPath, "utf-8")) as ServeMetadata; - } catch { - return null; - } -} - -function saveMetadata(meta: ServeMetadata) { - ensureServeDir(); - const metaPath = join(SERVE_DIR, `${meta.slug}.json`); - writeFileSync(metaPath, JSON.stringify(meta, null, 2)); -} - -function isExpired(meta: ServeMetadata): boolean { - if (!meta.expiresAt) return false; - return new Date(meta.expiresAt).getTime() < Date.now(); -} - -function deleteServedContent(slug: string) { - const meta = loadMetadata(slug); - if (!meta) return false; - const metaPath = join(SERVE_DIR, `${slug}.json`); - const contentPath = join(SERVE_DIR, meta.contentPath); - try { - if (existsSync(contentPath)) unlinkSync(contentPath); - if (existsSync(metaPath)) unlinkSync(metaPath); - return true; - } catch { - return false; - } -} - -export function serveCreate( - params: ServeCreateParams, - baseUrl: string, -): { url: string; slug: string } { - ensureServeDir(); - - if (!existsSync(params.path)) { - throw new Error(`File not found: ${params.path}`); - } - - const content = readFileSync(params.path); - const hash = hashContent(content); - const ext = extname(params.path); - const contentType = getMimeType(ext); - - // Check for existing with same slug - const existing = loadMetadata(params.slug); - let slug: string; - - if (existing && existing.contentHash === hash) { - // Same content, update metadata - slug = params.slug; - } else if (existing) { - // Different content, find unique slug - slug = findUniqueSlug(params.slug); - } else { - slug = params.slug; - } - - const contentFilename = `${slug}${ext}`; - const contentPath = join(SERVE_DIR, contentFilename); - copyFileSync(params.path, contentPath); - - const ttl = params.ttl ?? "24h"; - const ttlMs = parseTtl(ttl); - const now = new Date(); - const expiresAt = ttlMs ? new Date(now.getTime() + ttlMs).toISOString() : null; - - const meta: ServeMetadata = { - slug, - contentPath: contentFilename, - contentHash: hash, - contentType, - size: content.length, - title: params.title, - description: params.description, - ogImage: params.ogImage ?? null, - createdAt: now.toISOString(), - expiresAt, - ttl, - }; - - saveMetadata(meta); - - return { url: `${baseUrl}/s/${slug}`, slug }; -} - -export function serveList(baseUrl: string): ServeMetadata[] { - ensureServeDir(); - const files = readdirSync(SERVE_DIR).filter((f) => f.endsWith(".json")); - const items: ServeMetadata[] = []; - - for (const file of files) { - const slug = file.replace(/\.json$/, ""); - const meta = loadMetadata(slug); - if (meta && !isExpired(meta)) { - items.push(meta); - } - } - - return items; -} - -export function serveDelete(slug: string): boolean { - return deleteServedContent(slug); -} - -// CSS for rendered pages -const CSS = ` -body { - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; - line-height: 1.6; - color: #333; - max-width: 700px; - margin: 0 auto; - padding: 20px; - background: #fff; -} -h1, h2, h3, h4, h5, h6 { margin-top: 1.5em; margin-bottom: 0.5em; } -h1 { font-size: 2em; } -h2 { font-size: 1.5em; } -h3 { font-size: 1.25em; } -p { margin: 1em 0; } -a { color: #0066cc; } -img { max-width: 100%; height: auto; } -pre { background: #f5f5f5; padding: 1em; overflow-x: auto; border-radius: 4px; } -code { background: #f5f5f5; padding: 0.2em 0.4em; border-radius: 3px; font-size: 0.9em; } -pre code { background: none; padding: 0; } -blockquote { border-left: 4px solid #ddd; margin: 1em 0; padding-left: 1em; color: #666; } -table { border-collapse: collapse; width: 100%; margin: 1em 0; } -th, td { border: 1px solid #ddd; padding: 8px; text-align: left; } -th { background: #f5f5f5; } -`; - -const HIGHLIGHT_CSS = ` -.hljs{background:#f5f5f5;padding:0} -.hljs-keyword,.hljs-selector-tag,.hljs-literal,.hljs-section,.hljs-link{color:#a626a4} -.hljs-string,.hljs-title,.hljs-name,.hljs-type,.hljs-attribute,.hljs-symbol,.hljs-bullet,.hljs-addition,.hljs-variable,.hljs-template-tag,.hljs-template-variable{color:#50a14f} -.hljs-comment,.hljs-quote,.hljs-deletion,.hljs-meta{color:#a0a1a7} -.hljs-number,.hljs-regexp,.hljs-literal,.hljs-bullet,.hljs-link{color:#986801} -.hljs-emphasis{font-style:italic} -.hljs-strong{font-weight:bold} -`; - -function renderHtmlPage(meta: ServeMetadata, bodyHtml: string, baseUrl: string): string { - const ogImageTag = meta.ogImage - ? `` - : ""; - - return ` - - - - - - - ${ogImageTag} - - ${escapeHtml(meta.title)} - - - - -

- ${bodyHtml} -
- - - -`; -} - -function render404Page(): string { - return ` - - - - - Not Found - Clawdis - - - -
-

Content Not Found

-

This content may have expired or been removed.

-
- -`; -} - -function escapeHtml(str: string): string { - return str - .replace(/&/g, "&") - .replace(//g, ">") - .replace(/"/g, """); -} - -export function handleServeRequest( - req: IncomingMessage, - res: ServerResponse, - opts: { baseUrl: string }, -): boolean { - const url = new URL(req.url ?? "/", "http://localhost"); - if (!url.pathname.startsWith("/s/")) return false; - - const slug = url.pathname.slice(3); // Remove "/s/" - if (!slug || slug.includes("/")) { - res.statusCode = 404; - res.setHeader("Content-Type", "text/html; charset=utf-8"); - res.end(render404Page()); - return true; - } - - const meta = loadMetadata(slug); - if (!meta || isExpired(meta)) { - if (meta && isExpired(meta)) { - deleteServedContent(slug); - } - res.statusCode = 404; - res.setHeader("Content-Type", "text/html; charset=utf-8"); - res.end(render404Page()); - return true; - } - - const contentPath = join(SERVE_DIR, meta.contentPath); - if (!existsSync(contentPath)) { - res.statusCode = 404; - res.setHeader("Content-Type", "text/html; charset=utf-8"); - res.end(render404Page()); - return true; - } - - const content = readFileSync(contentPath); - - // Render markdown/text as HTML - if (meta.contentType === "text/markdown" || meta.contentType === "text/plain") { - const text = content.toString("utf-8"); - const bodyHtml = meta.contentType === "text/markdown" ? md.render(text) : `
${escapeHtml(text)}
`; - const html = renderHtmlPage(meta, bodyHtml, opts.baseUrl); - res.statusCode = 200; - res.setHeader("Content-Type", "text/html; charset=utf-8"); - res.end(html); - return true; - } - - // Serve other files directly - res.statusCode = 200; - res.setHeader("Content-Type", meta.contentType); - res.setHeader("Content-Length", content.length); - res.end(content); - return true; -} diff --git a/src/gateway/server-http.ts b/src/gateway/server-http.ts index 6abf3cdcf..6dc106ac9 100644 --- a/src/gateway/server-http.ts +++ b/src/gateway/server-http.ts @@ -22,7 +22,6 @@ import { resolveHookProvider, } from "./hooks.js"; import { applyHookMappings } from "./hooks-mapping.js"; -import { handleServeRequest } from "./serve.js"; type SubsystemLogger = ReturnType; @@ -207,14 +206,12 @@ export function createGatewayHttpServer(opts: { controlUiEnabled: boolean; controlUiBasePath: string; handleHooksRequest: HooksRequestHandler; - serveBaseUrl?: string; }): HttpServer { const { canvasHost, controlUiEnabled, controlUiBasePath, handleHooksRequest, - serveBaseUrl, } = opts; const httpServer: HttpServer = createHttpServer((req, res) => { // Don't interfere with WebSocket upgrades; ws handles the 'upgrade' event. @@ -222,7 +219,6 @@ export function createGatewayHttpServer(opts: { void (async () => { if (await handleHooksRequest(req, res)) return; - if (serveBaseUrl && handleServeRequest(req, res, { baseUrl: serveBaseUrl })) return; if (canvasHost) { if (await handleA2uiHttpRequest(req, res)) return; if (await canvasHost.handleHttpRequest(req, res)) return; diff --git a/src/gateway/server.ts b/src/gateway/server.ts index 10bb97d57..9dd92c846 100644 --- a/src/gateway/server.ts +++ b/src/gateway/server.ts @@ -593,23 +593,11 @@ export async function startGatewayServer( dispatchWakeHook, }); - // Try to use Tailscale funnel URL for serve feature (public URLs) - let serveBaseUrl: string; - try { - const tailnetHost = await getTailnetHostname(); - serveBaseUrl = `https://${tailnetHost}`; - log.info(`Serve base URL (Tailscale): ${serveBaseUrl}`); - } catch { - const serveHost = bindHost === "0.0.0.0" ? "localhost" : bindHost; - serveBaseUrl = `http://${serveHost}:${port}`; - log.info(`Serve base URL (local): ${serveBaseUrl}`); - } const httpServer: HttpServer = createGatewayHttpServer({ canvasHost, controlUiEnabled, controlUiBasePath, handleHooksRequest, - serveBaseUrl, }); let bonjourStop: (() => Promise) | null = null; let bridge: Awaited> | null = null; diff --git a/src/web/accounts.ts b/src/web/accounts.ts index 5a368a2d1..131e427a8 100644 --- a/src/web/accounts.ts +++ b/src/web/accounts.ts @@ -23,6 +23,7 @@ export type ResolvedWhatsAppAccount = { groupPolicy?: GroupPolicy; dmPolicy?: DmPolicy; textChunkLimit?: number; + mediaMaxMb?: number; blockStreaming?: boolean; groups?: WhatsAppAccountConfig["groups"]; }; @@ -120,6 +121,7 @@ export function resolveWhatsAppAccount(params: { groupPolicy: accountCfg?.groupPolicy ?? params.cfg.whatsapp?.groupPolicy, textChunkLimit: accountCfg?.textChunkLimit ?? params.cfg.whatsapp?.textChunkLimit, + mediaMaxMb: accountCfg?.mediaMaxMb ?? params.cfg.whatsapp?.mediaMaxMb, blockStreaming: accountCfg?.blockStreaming ?? params.cfg.whatsapp?.blockStreaming, groups: accountCfg?.groups ?? params.cfg.whatsapp?.groups, diff --git a/src/web/auto-reply.ts b/src/web/auto-reply.ts index 3764148cf..f22148864 100644 --- a/src/web/auto-reply.ts +++ b/src/web/auto-reply.ts @@ -788,6 +788,7 @@ export async function monitorWebProvider( groupAllowFrom: account.groupAllowFrom, groupPolicy: account.groupPolicy, textChunkLimit: account.textChunkLimit, + mediaMaxMb: account.mediaMaxMb, blockStreaming: account.blockStreaming, groups: account.groups, }, @@ -1305,6 +1306,7 @@ export async function monitorWebProvider( verbose, accountId: account.accountId, authDir: account.authDir, + mediaMaxMb: account.mediaMaxMb, onMessage: async (msg) => { handledMessages += 1; lastMessageAt = Date.now(); diff --git a/src/web/inbound.media.test.ts b/src/web/inbound.media.test.ts index ee4ef47e0..c18cf7f26 100644 --- a/src/web/inbound.media.test.ts +++ b/src/web/inbound.media.test.ts @@ -3,12 +3,21 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; -import { afterAll, beforeAll, describe, expect, it, vi } from "vitest"; +import { + afterAll, + beforeAll, + beforeEach, + describe, + expect, + it, + vi, +} from "vitest"; const readAllowFromStoreMock = vi.fn().mockResolvedValue([]); const upsertPairingRequestMock = vi .fn() .mockResolvedValue({ code: "PAIRCODE", created: true }); +const saveMediaBufferSpy = vi.fn(); vi.mock("../config/config.js", async (importOriginal) => { const actual = await importOriginal(); @@ -33,6 +42,19 @@ vi.mock("../pairing/pairing-store.js", () => ({ upsertPairingRequestMock(...args), })); +vi.mock("../media/store.js", async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + saveMediaBuffer: vi.fn( + async (...args: Parameters) => { + saveMediaBufferSpy(...args); + return actual.saveMediaBuffer(...args); + }, + ), + }; +}); + const HOME = path.join( os.tmpdir(), `clawdbot-inbound-media-${crypto.randomUUID()}`, @@ -87,6 +109,10 @@ vi.mock("./session.js", () => { import { monitorWebInbox } from "./inbound.js"; describe("web inbound media saves with extension", () => { + beforeEach(() => { + saveMediaBufferSpy.mockClear(); + }); + beforeAll(async () => { await fs.rm(HOME, { recursive: true, force: true }); }); @@ -182,4 +208,44 @@ describe("web inbound media saves with extension", () => { await listener.close(); }); + + it("passes mediaMaxMb to saveMediaBuffer", async () => { + const onMessage = vi.fn(); + const listener = await monitorWebInbox({ + verbose: false, + onMessage, + mediaMaxMb: 1, + }); + const { createWaSocket } = await import("./session.js"); + const realSock = await ( + createWaSocket as unknown as () => Promise<{ + ev: import("node:events").EventEmitter; + }> + )(); + + const upsert = { + type: "notify", + messages: [ + { + key: { id: "img3", fromMe: false, remoteJid: "222@s.whatsapp.net" }, + message: { imageMessage: { mimetype: "image/jpeg" } }, + messageTimestamp: 1_700_000_003, + }, + ], + }; + + realSock.ev.emit("messages.upsert", upsert); + + for (let i = 0; i < 10; i++) { + if (onMessage.mock.calls.length > 0) break; + await new Promise((resolve) => setTimeout(resolve, 5)); + } + + expect(onMessage).toHaveBeenCalledTimes(1); + expect(saveMediaBufferSpy).toHaveBeenCalled(); + const lastCall = saveMediaBufferSpy.mock.calls.at(-1); + expect(lastCall?.[3]).toBe(1 * 1024 * 1024); + + await listener.close(); + }); }); diff --git a/src/web/inbound.ts b/src/web/inbound.ts index 4df694bdb..589e7ddde 100644 --- a/src/web/inbound.ts +++ b/src/web/inbound.ts @@ -376,7 +376,11 @@ export async function monitorWebInbox(options: { try { const inboundMedia = await downloadInboundMedia(msg, sock); if (inboundMedia) { - const maxBytes = (options.mediaMaxMb ?? 50) * 1024 * 1024; + const maxMb = + typeof options.mediaMaxMb === "number" && options.mediaMaxMb > 0 + ? options.mediaMaxMb + : 50; + const maxBytes = maxMb * 1024 * 1024; const saved = await saveMediaBuffer( inboundMedia.buffer, inboundMedia.mimetype,