From 273e49f678ae4fa725e5dedac05d694ba9b02e17 Mon Sep 17 00:00:00 2001 From: yushen Date: Tue, 3 Feb 2026 14:22:49 +0800 Subject: [PATCH 01/25] feat(agent): stream raw AgentEvent from engine to Hub via Gateway Expose PiAgentCore events through the full backend pipeline: - Agent.subscribe() transparently forwards engine events - AsyncAgent pushes all AgentEvent into Channel alongside error Messages - Hub discriminates ChannelItem and forwards events via StreamAction Co-Authored-By: Claude Opus 4.5 --- src/agent/async-agent.ts | 19 +++++++++++++------ src/agent/runner.ts | 5 +++++ src/hub/hub.ts | 19 +++++++++++++++---- 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/agent/async-agent.ts b/src/agent/async-agent.ts index 06f753bb..97b47378 100644 --- a/src/agent/async-agent.ts +++ b/src/agent/async-agent.ts @@ -1,13 +1,17 @@ import { v7 as uuidv7 } from "uuid"; +import type { AgentEvent } from "@mariozechner/pi-agent-core"; import { Agent } from "./runner.js"; import { Channel } from "./channel.js"; import type { AgentOptions, Message } from "./types.js"; const devNull = { write: () => true } as NodeJS.WritableStream; +/** Discriminated union of legacy Message (error fallback) and raw AgentEvent */ +export type ChannelItem = Message | AgentEvent; + export class AsyncAgent { private readonly agent: Agent; - private readonly channel = new Channel(); + private readonly channel = new Channel(); private _closed = false; private queue: Promise = Promise.resolve(); readonly sessionId: string; @@ -18,6 +22,11 @@ export class AsyncAgent { logger: { stdout: devNull, stderr: devNull }, }); this.sessionId = this.agent.sessionId; + + // Forward raw AgentEvent into the channel + this.agent.subscribe((event: AgentEvent) => { + this.channel.send(event); + }); } get closed(): boolean { @@ -32,9 +41,7 @@ export class AsyncAgent { .then(async () => { if (this._closed) return; const result = await this.agent.run(content); - if (result.text) { - this.channel.send({ id: uuidv7(), content: result.text }); - } + // Normal text is delivered via message_end event; only handle errors here if (result.error) { this.channel.send({ id: uuidv7(), content: `[error] ${result.error}` }); } @@ -45,8 +52,8 @@ export class AsyncAgent { }); } - /** Continuously read message stream */ - read(): AsyncIterable { + /** Continuously read channel stream (AgentEvent + error Messages) */ + read(): AsyncIterable { return this.channel; } diff --git a/src/agent/runner.ts b/src/agent/runner.ts index bf73268f..dfccb9bc 100644 --- a/src/agent/runner.ts +++ b/src/agent/runner.ts @@ -234,6 +234,11 @@ export class Agent { }); } + /** Subscribe to raw AgentEvent from the underlying engine */ + subscribe(fn: (event: AgentEvent) => void): () => void { + return this.agent.subscribe(fn); + } + async run(prompt: string): Promise { this.output.state.lastAssistantText = ""; await this.agent.prompt(prompt); diff --git a/src/hub/hub.ts b/src/hub/hub.ts index 984082a2..bee58b66 100644 --- a/src/hub/hub.ts +++ b/src/hub/hub.ts @@ -3,9 +3,11 @@ import { type ConnectionState, RequestAction, ResponseAction, + StreamAction, type RequestPayload, type ResponseSuccessPayload, type ResponseErrorPayload, + type StreamPayload, } from "@multica/sdk"; import { AsyncAgent } from "../agent/async-agent.js"; import { getHubId } from "./hub-identity.js"; @@ -152,13 +154,22 @@ export class Hub { /** Internally read agent output and send via Gateway */ private async consumeAgent(agent: AsyncAgent): Promise { - for await (const msg of agent.read()) { - console.log(`[${agent.sessionId}] ${msg.content}`); + for await (const item of agent.read()) { const targetDeviceId = this.agentSenders.get(agent.sessionId); - if (targetDeviceId) { + if (!targetDeviceId) continue; + + if ("content" in item) { + // Legacy Message (error fallback) + console.log(`[${agent.sessionId}] ${item.content}`); this.client.send(targetDeviceId, "message", { agentId: agent.sessionId, - content: msg.content, + content: item.content, + }); + } else { + // Raw AgentEvent — forward via StreamAction + this.client.send(targetDeviceId, StreamAction, { + streamId: agent.sessionId, + data: item, }); } } From 203d7600348b8f4a4283119f1e8ad6548212c3d2 Mon Sep 17 00:00:00 2001 From: yushen Date: Tue, 3 Feb 2026 15:08:46 +0800 Subject: [PATCH 02/25] feat(hub): filter forwarded events to 5 types useful for frontend Only forward message_start/update/end (assistant role) and tool_execution_start/end to clients. Drop agent_start, agent_end, turn_start, turn_end, and tool_execution_update at the Hub layer. Co-Authored-By: Claude Opus 4.5 --- src/hub/hub.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/hub/hub.ts b/src/hub/hub.ts index 3d5deb71..10236ff3 100644 --- a/src/hub/hub.ts +++ b/src/hub/hub.ts @@ -196,19 +196,25 @@ export class Hub { content: item.content, }); } else { + // Filter: only forward events useful for frontend rendering const maybeMessage = (item as { message?: { role?: string } }).message; const isAssistantMessage = maybeMessage?.role === "assistant"; - if (item.type === "message_start" && isAssistantMessage) { + const shouldForward = + ((item.type === "message_start" || item.type === "message_update" || item.type === "message_end") && isAssistantMessage) + || item.type === "tool_execution_start" + || item.type === "tool_execution_end"; + if (!shouldForward) continue; + + if (item.type === "message_start") { this.beginStream(agent.sessionId, item); } const streamId = this.getActiveStreamId(agent.sessionId, item); - // Raw AgentEvent — forward via StreamAction this.client.send(targetDeviceId, StreamAction, { streamId, agentId: agent.sessionId, event: item, }); - if (item.type === "message_end" && isAssistantMessage) { + if (item.type === "message_end") { this.endStream(agent.sessionId); } } From 01c82b296d286f170f3d58ddd111e8bfafad2806 Mon Sep 17 00:00:00 2001 From: Naiyuan Qing <145280634+NevilleQingNY@users.noreply.github.com> Date: Tue, 3 Feb 2026 16:39:53 +0800 Subject: [PATCH 03/25] =?UTF-8?q?feat(mobile):=20=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E7=AB=AF=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.5 --- apps/mobile/.gitignore | 43 + apps/mobile/.vscode/extensions.json | 1 + apps/mobile/.vscode/settings.json | 7 + apps/mobile/README.md | 50 + apps/mobile/app.json | 48 + apps/mobile/app/_layout.tsx | 21 + apps/mobile/app/index.tsx | 167 + .../assets/images/android-icon-background.png | Bin 0 -> 17549 bytes .../assets/images/android-icon-foreground.png | Bin 0 -> 78796 bytes .../assets/images/android-icon-monochrome.png | Bin 0 -> 4140 bytes apps/mobile/assets/images/favicon.png | Bin 0 -> 1129 bytes apps/mobile/assets/images/icon.png | Bin 0 -> 393493 bytes .../assets/images/partial-react-logo.png | Bin 0 -> 5075 bytes apps/mobile/assets/images/react-logo.png | Bin 0 -> 6341 bytes apps/mobile/assets/images/react-logo@2x.png | Bin 0 -> 14225 bytes apps/mobile/assets/images/react-logo@3x.png | Bin 0 -> 21252 bytes apps/mobile/assets/images/splash-icon.png | Bin 0 -> 17547 bytes apps/mobile/babel.config.js | 9 + apps/mobile/components.json | 19 + apps/mobile/components/ui/button.tsx | 108 + apps/mobile/components/ui/card.tsx | 52 + apps/mobile/components/ui/collapsible.tsx | 45 + apps/mobile/components/ui/icon-symbol.ios.tsx | 32 + apps/mobile/components/ui/icon-symbol.tsx | 41 + apps/mobile/components/ui/input.tsx | 29 + apps/mobile/components/ui/text.tsx | 89 + apps/mobile/eslint.config.js | 10 + apps/mobile/global.css | 61 + apps/mobile/lib/theme.ts | 71 + apps/mobile/lib/utils.ts | 6 + apps/mobile/metro.config.js | 6 + apps/mobile/nativewind-env.d.ts | 1 + apps/mobile/package.json | 60 + apps/mobile/scripts/reset-project.js | 112 + apps/mobile/tailwind.config.js | 59 + apps/mobile/tsconfig.json | 18 + docs/mobile/app-store-submission-guide.md | 234 + pnpm-lock.yaml | 5752 ++++++++++++++++- 38 files changed, 7115 insertions(+), 36 deletions(-) create mode 100644 apps/mobile/.gitignore create mode 100644 apps/mobile/.vscode/extensions.json create mode 100644 apps/mobile/.vscode/settings.json create mode 100644 apps/mobile/README.md create mode 100644 apps/mobile/app.json create mode 100644 apps/mobile/app/_layout.tsx create mode 100644 apps/mobile/app/index.tsx create mode 100644 apps/mobile/assets/images/android-icon-background.png create mode 100644 apps/mobile/assets/images/android-icon-foreground.png create mode 100644 apps/mobile/assets/images/android-icon-monochrome.png create mode 100644 apps/mobile/assets/images/favicon.png create mode 100644 apps/mobile/assets/images/icon.png create mode 100644 apps/mobile/assets/images/partial-react-logo.png create mode 100644 apps/mobile/assets/images/react-logo.png create mode 100644 apps/mobile/assets/images/react-logo@2x.png create mode 100644 apps/mobile/assets/images/react-logo@3x.png create mode 100644 apps/mobile/assets/images/splash-icon.png create mode 100644 apps/mobile/babel.config.js create mode 100644 apps/mobile/components.json create mode 100644 apps/mobile/components/ui/button.tsx create mode 100644 apps/mobile/components/ui/card.tsx create mode 100644 apps/mobile/components/ui/collapsible.tsx create mode 100644 apps/mobile/components/ui/icon-symbol.ios.tsx create mode 100644 apps/mobile/components/ui/icon-symbol.tsx create mode 100644 apps/mobile/components/ui/input.tsx create mode 100644 apps/mobile/components/ui/text.tsx create mode 100644 apps/mobile/eslint.config.js create mode 100644 apps/mobile/global.css create mode 100644 apps/mobile/lib/theme.ts create mode 100644 apps/mobile/lib/utils.ts create mode 100644 apps/mobile/metro.config.js create mode 100644 apps/mobile/nativewind-env.d.ts create mode 100644 apps/mobile/package.json create mode 100755 apps/mobile/scripts/reset-project.js create mode 100644 apps/mobile/tailwind.config.js create mode 100644 apps/mobile/tsconfig.json create mode 100644 docs/mobile/app-store-submission-guide.md diff --git a/apps/mobile/.gitignore b/apps/mobile/.gitignore new file mode 100644 index 00000000..f8c6c2e8 --- /dev/null +++ b/apps/mobile/.gitignore @@ -0,0 +1,43 @@ +# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files + +# dependencies +node_modules/ + +# Expo +.expo/ +dist/ +web-build/ +expo-env.d.ts + +# Native +.kotlin/ +*.orig.* +*.jks +*.p8 +*.p12 +*.key +*.mobileprovision + +# Metro +.metro-health-check* + +# debug +npm-debug.* +yarn-debug.* +yarn-error.* + +# macOS +.DS_Store +*.pem + +# local env files +.env*.local + +# typescript +*.tsbuildinfo + +app-example + +# generated native folders +/ios +/android diff --git a/apps/mobile/.vscode/extensions.json b/apps/mobile/.vscode/extensions.json new file mode 100644 index 00000000..b7ed8377 --- /dev/null +++ b/apps/mobile/.vscode/extensions.json @@ -0,0 +1 @@ +{ "recommendations": ["expo.vscode-expo-tools"] } diff --git a/apps/mobile/.vscode/settings.json b/apps/mobile/.vscode/settings.json new file mode 100644 index 00000000..e2798e42 --- /dev/null +++ b/apps/mobile/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "editor.codeActionsOnSave": { + "source.fixAll": "explicit", + "source.organizeImports": "explicit", + "source.sortMembers": "explicit" + } +} diff --git a/apps/mobile/README.md b/apps/mobile/README.md new file mode 100644 index 00000000..48dd63ff --- /dev/null +++ b/apps/mobile/README.md @@ -0,0 +1,50 @@ +# Welcome to your Expo app 👋 + +This is an [Expo](https://expo.dev) project created with [`create-expo-app`](https://www.npmjs.com/package/create-expo-app). + +## Get started + +1. Install dependencies + + ```bash + npm install + ``` + +2. Start the app + + ```bash + npx expo start + ``` + +In the output, you'll find options to open the app in a + +- [development build](https://docs.expo.dev/develop/development-builds/introduction/) +- [Android emulator](https://docs.expo.dev/workflow/android-studio-emulator/) +- [iOS simulator](https://docs.expo.dev/workflow/ios-simulator/) +- [Expo Go](https://expo.dev/go), a limited sandbox for trying out app development with Expo + +You can start developing by editing the files inside the **app** directory. This project uses [file-based routing](https://docs.expo.dev/router/introduction). + +## Get a fresh project + +When you're ready, run: + +```bash +npm run reset-project +``` + +This command will move the starter code to the **app-example** directory and create a blank **app** directory where you can start developing. + +## Learn more + +To learn more about developing your project with Expo, look at the following resources: + +- [Expo documentation](https://docs.expo.dev/): Learn fundamentals, or go into advanced topics with our [guides](https://docs.expo.dev/guides). +- [Learn Expo tutorial](https://docs.expo.dev/tutorial/introduction/): Follow a step-by-step tutorial where you'll create a project that runs on Android, iOS, and the web. + +## Join the community + +Join our community of developers creating universal apps. + +- [Expo on GitHub](https://github.com/expo/expo): View our open source platform and contribute. +- [Discord community](https://chat.expo.dev): Chat with Expo users and ask questions. diff --git a/apps/mobile/app.json b/apps/mobile/app.json new file mode 100644 index 00000000..e83b960b --- /dev/null +++ b/apps/mobile/app.json @@ -0,0 +1,48 @@ +{ + "expo": { + "name": "Multica", + "slug": "multica-mobile", + "version": "1.0.0", + "orientation": "portrait", + "icon": "./assets/images/icon.png", + "scheme": "mobile", + "userInterfaceStyle": "automatic", + "newArchEnabled": true, + "ios": { + "supportsTablet": true + }, + "android": { + "adaptiveIcon": { + "backgroundColor": "#E6F4FE", + "foregroundImage": "./assets/images/android-icon-foreground.png", + "backgroundImage": "./assets/images/android-icon-background.png", + "monochromeImage": "./assets/images/android-icon-monochrome.png" + }, + "edgeToEdgeEnabled": true, + "predictiveBackGestureEnabled": false + }, + "web": { + "output": "static", + "favicon": "./assets/images/favicon.png" + }, + "plugins": [ + "expo-router", + [ + "expo-splash-screen", + { + "image": "./assets/images/splash-icon.png", + "imageWidth": 200, + "resizeMode": "contain", + "backgroundColor": "#ffffff", + "dark": { + "backgroundColor": "#000000" + } + } + ] + ], + "experiments": { + "typedRoutes": true, + "reactCompiler": true + } + } +} diff --git a/apps/mobile/app/_layout.tsx b/apps/mobile/app/_layout.tsx new file mode 100644 index 00000000..0028f87e --- /dev/null +++ b/apps/mobile/app/_layout.tsx @@ -0,0 +1,21 @@ +import "../global.css"; +import { ThemeProvider } from "@react-navigation/native"; +import { PortalHost } from "@rn-primitives/portal"; +import { Stack } from "expo-router"; +import { StatusBar } from "expo-status-bar"; +import { useColorScheme } from "nativewind"; +import "react-native-reanimated"; + +import { NAV_THEME } from "@/lib/theme"; + +export default function RootLayout() { + const { colorScheme } = useColorScheme(); + + return ( + + + + + + ); +} diff --git a/apps/mobile/app/index.tsx b/apps/mobile/app/index.tsx new file mode 100644 index 00000000..4cb92f6e --- /dev/null +++ b/apps/mobile/app/index.tsx @@ -0,0 +1,167 @@ +import { useState, useRef, useCallback } from "react"; +import { + View, + ScrollView, + KeyboardAvoidingView, + Platform, + TextInput, + Pressable, + LayoutAnimation, + UIManager, +} from "react-native"; +import { SafeAreaView } from "react-native-safe-area-context"; +import { Text } from "@/components/ui/text"; +import { HugeiconsIcon } from "@hugeicons/react-native"; +import { ArrowUp01Icon } from "@hugeicons/core-free-icons"; + +// Enable LayoutAnimation on Android +if (Platform.OS === "android" && UIManager.setLayoutAnimationEnabledExperimental) { + UIManager.setLayoutAnimationEnabledExperimental(true); +} + +const INPUT_MAX_HEIGHT = 120; +const SINGLE_LINE_HEIGHT = 20; // approximate single line content height + +const MOCK_MESSAGES = [ + { id: "1", role: "user", content: "Hello, can you help me with a task?" }, + { + id: "2", + role: "assistant", + content: + "Of course! I'd be happy to help. What would you like me to do?", + }, + { id: "3", role: "user", content: "Explain how WebSockets work." }, + { + id: "4", + role: "assistant", + content: + "WebSockets provide full-duplex communication channels over a single TCP connection. Unlike HTTP, which is request-response based, WebSockets allow both the client and server to send messages independently at any time.\n\nThe connection starts as a standard HTTP request, then upgrades to a persistent WebSocket connection via a handshake.", + }, +]; + +export default function Index() { + const [input, setInput] = useState(""); + const [messages, setMessages] = useState(MOCK_MESSAGES); + const [contentHeight, setContentHeight] = useState(SINGLE_LINE_HEIGHT); + const scrollRef = useRef(null); + + const isMultiline = contentHeight > SINGLE_LINE_HEIGHT + 4; + + const handleContentSizeChange = useCallback( + (e: { nativeEvent: { contentSize: { height: number } } }) => { + const newHeight = e.nativeEvent.contentSize.height; + if (newHeight !== contentHeight) { + LayoutAnimation.configureNext( + LayoutAnimation.create(150, "easeInEaseOut", "opacity") + ); + setContentHeight(newHeight); + } + }, + [contentHeight] + ); + + function handleSend() { + const trimmed = input.trim(); + if (!trimmed) return; + + setMessages((prev) => [ + ...prev, + { id: String(Date.now()), role: "user", content: trimmed }, + ]); + setInput(""); + LayoutAnimation.configureNext( + LayoutAnimation.create(150, "easeInEaseOut", "opacity") + ); + setContentHeight(SINGLE_LINE_HEIGHT); + setTimeout(() => scrollRef.current?.scrollToEnd({ animated: true }), 100); + } + + const canSend = input.trim().length > 0; + + return ( + + + {/* Header */} + + Multica + Agent connected + + + {/* Messages */} + + {messages.map((msg) => + msg.role === "user" ? ( + + + + {msg.content} + + + + ) : ( + + + {msg.content} + + + ) + )} + + + {/* Input bar */} + + + = INPUT_MAX_HEIGHT} + textAlignVertical="top" + selectionColor="hsl(243.5, 75.2%, 58.5%)" + underlineColorAndroid="transparent" + style={{ + maxHeight: INPUT_MAX_HEIGHT, + paddingTop: 0, + paddingBottom: 0, + // @ts-ignore web-only: remove browser default outline/border + outline: "none", + borderWidth: 0, + boxShadow: "none", + }} + /> + + + + + + + + ); +} diff --git a/apps/mobile/assets/images/android-icon-background.png b/apps/mobile/assets/images/android-icon-background.png new file mode 100644 index 0000000000000000000000000000000000000000..5ffefc5bb57a3d7b39ec6ff4e96979226522cc49 GIT binary patch literal 17549 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

f!0B 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 literal 0 HcmV?d00001 diff --git a/apps/mobile/assets/images/android-icon-monochrome.png b/apps/mobile/assets/images/android-icon-monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..77484ebdbca253297baea4a7d416233aa47a45c0 GIT binary patch literal 4140 zcmds4`#;nD``_G?M(cKNH;M{5n{L+KorqWtQBFDAMuoN!a)@COO1e8JiX5_%Lu_&w zVuqV?OF3_C4wZ9SzO~SheO~K+e7`?^|ANmRkN0Em_w~LG&*$~JuIu%FT|Mc13?Z!| z4S_%q_I5U|5D1hmzP4@wl9$dXJ@5xVZ|5BaffzW7FX-dLIpshIjdDF^4XJ*uwg4Vr z!B$RI5J=4pnGL)o1oCUUy^WQ79F#wPI98Qiu;qVbTx=VBN_q0@@RCT??3)$*Q6o3_ zChT_aGStaF=bZO=%-LrCs4ipw-~VU{;MUPb{MQGiQX=>Lw$T49AYBvHC`w3fiz4g1 zxV0P@vdjE;!8TV35ca?4$GK-OVKLvHDzz@`t;#jVPBceMb*qmqMz5}}hejpk9oJ6o z5lz(Q9|$j;QC~8Ls%x>{?QHJ<=aSi*$qm{D+u-{ANTp}+!T!xU24l4VmAa~cJ8!ka zuL(ZhyF1d7)Nsas#D4p;jFfFjjub27jK2*S)!~8zPs&kEw+_dBn;+i6bFt}TXtAE6A;jap7sj;sp5ja4aL zlTH1ENx?+3pG%~B2InPzo}7c^Ylqx}Q0=dEefT3;Xxe4Q5C7xRS-w`takgJTYy7f* zW_WyD+;_pk!osg`l}DEb9(?}hTk#@7^hh@3F9=ol*s)^*_jj)sRhpmc6lsUtgiy_1 zlv_j{xX`}`iuqlShz*}sJ{5%Ol!BvtTm@E40=^c8ki(fioLyPYQ^pWr$f}U{?<|Ho zLasun@rHFYb{)!R4=cpVQ7YOn>+Duk#i-@}b9pKyX#>(wOnozH`1Jn!PgX+krdAY} zs*!Wi2h2v90l@qcgzA7`h|MeZvC3R0kCc|v-V56I)?yzOq{jd=DF`b=J@xZ;q9-H3RSSwSTYK|&-o6R6KaIVr;EtiVAozdX$KGnC7Ac#l$rw9(LMRlIEfS z#e`hz3e0JHC4V#&?|zgb$34AYh>p+&o@8;Cqc2=AJ#pQVzM2VuYp|}oD#-A>%?BMt#7bLRE)X22(>NL6gkiBYrLR6$ol)^SV9JObVi4M;311p>qpD-70*?F{61`ytpXx zG^|5q?q%s%BiPKy)D7JOcQX4@FiH6g>Vlz!7gF~Ek zVaVsoYdDTs1-XxKUT3CwT|3#klrxJ>63$e?4r#ME_Z_(G+G=nA*+bK;^*xfg$%rj; zpB_Mha!VLA!Lb{=4%_7p`|I~UkuQ48IV)tFIMR=TaAgk@qhoiL>Nj5$%%;vWMxQHp zSHn>;THo4fgp;|4qvKpQnU+=T#W!w5ALJn|7IHkWX1;@vm+~>sE$rmvBSQSf_b>aC zg+`L4X*G@#SuWA4C2A0XqF1c`Ml_dgJC4}d&H&AIXfF#na<0BPKM=dFQYTcYNGII` zp|+wh3ayF$F#5x?ojBumW}j|Z zl3>}JdwV8QIMv?Xz9hIIP}eP8c>n(Wwa@Kca7@W1lg#<0ep)REks=NOD%_WC*-9=< zY5qJ*D3fl$4jg5@Xk6^g9D`| zqRHfP%Zk~`|7ptOi0&fIbZ_a99Y9awryhn<6Y8>LKGyS7i_T1QQXt-g1O=_Fm^rn7 ziU*kAkvPm7zIas_GGB37!(;fms=9ofD(F~_DYP2{3&YwHndu)H_}wS8&f$r9kRUhf zT@M_%WW>n0?r#@VN9*a{DPRWs`3|pmaQ_#J6To8KnCjXljK7&8-GaymsJ`xOC zm_TXycg7|@JbX!TMabyyasM+1w>Agw!Xyk@GlbIX7kz1lpjozW-@cjCCM?p; zStvLZTR2xFx|l-fXEi<(&uU2m)&-3{YCA4YT?%B%p?T$QC$2E1N9uK;`i^K1D+azg zErKMGr4Q#aUl*BQbRFxAr|Ex0AD5YGh9PrD88j)~dsoCc4Ffr?wxvXb%1s_THcmz; zMXToIZw$daHCc^!HZR5q6z#r&LXczNg>8LRNtw`GZSbO)ufG8p7xPf;jz;-Is4a`J z*nPS=dH|H;YyypJ1b5T4;XIKV#U#ziG8kWgY*5-zs+++>IfyV{}4{UnmEXY)1hnl(1 zBv3oA8q-#Eo^=S0O4{qQ{!FN1#1-fEC=9tIKU<6!L>~mSz#g(Hhud&?v~oreZ8p$= zZ%RvRx_>1Cj+#&|Pkc-EccGIw2BO$Pt+;EDsp~j4lgO;z%|*YeM@@hgak-LuxsQDo zCPu#jSgJGEK2|2^+JSJ~2X^B6Veqx`*yA(x0W{IR=g5T`p}5nPBOk-02SF^f@t_#=9_VNz7$B)^b4i?_erJ0F zsGTqA5Q5)o|FB{)z)A9aB<@;*#8do_dYY`dFJ4fec&Pzj+ZFgFwB#ZXUz+IQlCNtF zq79_@LpB1K7jN}e~_om2L!D*1CqWBm@<~!dZdByG^B^^Dr0V(3k;;vtfCo>7MLxdE0;5&nv%k zFHs&vLPyg-@N)Y+g?osdYszRR@B!sf9gZDxN9EIyDa6i|#4(3MFs~n(o1H{~lH*Mh z$4`ck3aRwE3Ccj}_+>GUEznbpL6IzvEU9?<=Nu_HC-KzvF~c~Y#sO|4WuE7j7%-;he19q{tgq-Ysm;L@d5h` z(0L37a#HQL44Zlwl3F9IaJ%ycLA8*0YJE^Mb8MbN9;qA#3Vp41?v9j^1@pTvW-9|9 zhjo5k=&J=LUTJGNwa3%w!gEKj^5|r=HO1pN#Y3-6HK|Yyl4~jfNWP(hlPvD;;w0R7 zsFBFzyhXn{P2DN+6p`$_w?_D(WGAuH*)Nuq0U;dOekZ%ed4@y&(qIDS)r&Q^lHU@p zeiV;W3*mHja?ftGqwnx!^TrFG2;Oo$D_4~gBJ z^xupa$0%kcle0v=&%M4K>d*M3d%kl#O%^xub^~kn+U|xX#P5D#*$~3ZhOlymFtCh7 z>ipUkdmntx6J9A#lyk`@oSX)HSV1_b!dKe9z=>x~4=Cp~E`jbZ@zm-^=mWt8Ct<<2 z9TUPxrTjndHU`jIx2S5fREB?CY6It?U^cvFBT@a&=$9VLw00hN`fN78*Nuy|H`Q0S zDHZPgwAy6vl#x{QnKEQ%{Ju-uZ`q79e%rW37WarsrCzkqQA?iJ7*sbcj81irReKg1 zkm{EP1`YXSR literal 0 HcmV?d00001 diff --git a/apps/mobile/assets/images/favicon.png b/apps/mobile/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..408bd746615785760b09e6f23fa8378d3e614331 GIT binary patch literal 1129 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
    H|zz{j8vX-lqku;-NW2E3;BMf3f>Jhxt3 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
    %-(a@!i`89VK;?-qg=ZiR0A&pVk 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

    wrV@M0ad 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 literal 0 HcmV?d00001 diff --git a/apps/mobile/assets/images/partial-react-logo.png b/apps/mobile/assets/images/partial-react-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..66fd9570e4fac42bca15352def191c563100b2ed GIT binary patch literal 5075 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 literal 0 HcmV?d00001 diff --git a/apps/mobile/assets/images/react-logo.png b/apps/mobile/assets/images/react-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9d72a9ffcbb39d89709073e1a7edd8ba414932c1 GIT binary patch literal 6341 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

    OG^bt6yG2??7FhdGVc8feK}syBta)V!iG4 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]:px-3' })), + sm: cn('h-9 gap-1.5 rounded-md px-3 sm:h-8', Platform.select({ web: 'has-[>svg]:px-2.5' })), + lg: cn('h-11 rounded-md px-6 sm:h-10', Platform.select({ web: 'has-[>svg]:px-4' })), + icon: 'h-10 w-10 sm:h-9 sm:w-9', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + } +); + +const buttonTextVariants = cva( + cn( + 'text-foreground text-sm font-medium', + Platform.select({ web: 'pointer-events-none transition-colors' }) + ), + { + variants: { + variant: { + default: 'text-primary-foreground', + destructive: 'text-white', + outline: cn( + 'group-active:text-accent-foreground', + Platform.select({ web: 'group-hover:text-accent-foreground' }) + ), + secondary: 'text-secondary-foreground', + ghost: 'group-active:text-accent-foreground', + link: cn( + 'text-primary group-active:underline', + Platform.select({ web: 'underline-offset-4 hover:underline group-hover:underline' }) + ), + }, + size: { + default: '', + sm: '', + lg: '', + icon: '', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + } +); + +type ButtonProps = React.ComponentProps & + React.RefAttributes & + VariantProps; + +function Button({ className, variant, size, ...props }: ButtonProps) { + return ( + + + + ); +} + +export { Button, buttonTextVariants, buttonVariants }; +export type { ButtonProps }; diff --git a/apps/mobile/components/ui/card.tsx b/apps/mobile/components/ui/card.tsx new file mode 100644 index 00000000..e3c2e303 --- /dev/null +++ b/apps/mobile/components/ui/card.tsx @@ -0,0 +1,52 @@ +import { Text, TextClassContext } from '@/components/ui/text'; +import { cn } from '@/lib/utils'; +import { View, type ViewProps } from 'react-native'; + +function Card({ className, ...props }: ViewProps & React.RefAttributes) { + return ( + + + + ); +} + +function CardHeader({ className, ...props }: ViewProps & React.RefAttributes) { + return ; +} + +function CardTitle({ + className, + ...props +}: React.ComponentProps & React.RefAttributes) { + return ( + + ); +} + +function CardDescription({ + className, + ...props +}: React.ComponentProps & React.RefAttributes) { + return ; +} + +function CardContent({ className, ...props }: ViewProps & React.RefAttributes) { + return ; +} + +function CardFooter({ className, ...props }: ViewProps & React.RefAttributes) { + return ; +} + +export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle }; diff --git a/apps/mobile/components/ui/collapsible.tsx b/apps/mobile/components/ui/collapsible.tsx new file mode 100644 index 00000000..6345fdeb --- /dev/null +++ b/apps/mobile/components/ui/collapsible.tsx @@ -0,0 +1,45 @@ +import { PropsWithChildren, useState } from 'react'; +import { StyleSheet, TouchableOpacity } from 'react-native'; + +import { ThemedText } from '@/components/themed-text'; +import { ThemedView } from '@/components/themed-view'; +import { IconSymbol } from '@/components/ui/icon-symbol'; +import { Colors } from '@/constants/theme'; +import { useColorScheme } from '@/hooks/use-color-scheme'; + +export function Collapsible({ children, title }: PropsWithChildren & { title: string }) { + const [isOpen, setIsOpen] = useState(false); + const theme = useColorScheme() ?? 'light'; + + return ( + + setIsOpen((value) => !value)} + activeOpacity={0.8}> + + + {title} + + {isOpen && {children}} + + ); +} + +const styles = StyleSheet.create({ + heading: { + flexDirection: 'row', + alignItems: 'center', + gap: 6, + }, + content: { + marginTop: 6, + marginLeft: 24, + }, +}); diff --git a/apps/mobile/components/ui/icon-symbol.ios.tsx b/apps/mobile/components/ui/icon-symbol.ios.tsx new file mode 100644 index 00000000..9177f4da --- /dev/null +++ b/apps/mobile/components/ui/icon-symbol.ios.tsx @@ -0,0 +1,32 @@ +import { SymbolView, SymbolViewProps, SymbolWeight } from 'expo-symbols'; +import { StyleProp, ViewStyle } from 'react-native'; + +export function IconSymbol({ + name, + size = 24, + color, + style, + weight = 'regular', +}: { + name: SymbolViewProps['name']; + size?: number; + color: string; + style?: StyleProp; + weight?: SymbolWeight; +}) { + return ( + + ); +} diff --git a/apps/mobile/components/ui/icon-symbol.tsx b/apps/mobile/components/ui/icon-symbol.tsx new file mode 100644 index 00000000..b7ece6b3 --- /dev/null +++ b/apps/mobile/components/ui/icon-symbol.tsx @@ -0,0 +1,41 @@ +// Fallback for using MaterialIcons on Android and web. + +import MaterialIcons from '@expo/vector-icons/MaterialIcons'; +import { SymbolWeight, SymbolViewProps } from 'expo-symbols'; +import { ComponentProps } from 'react'; +import { OpaqueColorValue, type StyleProp, type TextStyle } from 'react-native'; + +type IconMapping = Record['name']>; +type IconSymbolName = keyof typeof MAPPING; + +/** + * Add your SF Symbols to Material Icons mappings here. + * - see Material Icons in the [Icons Directory](https://icons.expo.fyi). + * - see SF Symbols in the [SF Symbols](https://developer.apple.com/sf-symbols/) app. + */ +const MAPPING = { + 'house.fill': 'home', + 'paperplane.fill': 'send', + 'chevron.left.forwardslash.chevron.right': 'code', + 'chevron.right': 'chevron-right', +} as IconMapping; + +/** + * An icon component that uses native SF Symbols on iOS, and Material Icons on Android and web. + * This ensures a consistent look across platforms, and optimal resource usage. + * Icon `name`s are based on SF Symbols and require manual mapping to Material Icons. + */ +export function IconSymbol({ + name, + size = 24, + color, + style, +}: { + name: IconSymbolName; + size?: number; + color: string | OpaqueColorValue; + style?: StyleProp; + weight?: SymbolWeight; +}) { + return ; +} diff --git a/apps/mobile/components/ui/input.tsx b/apps/mobile/components/ui/input.tsx new file mode 100644 index 00000000..00845ba9 --- /dev/null +++ b/apps/mobile/components/ui/input.tsx @@ -0,0 +1,29 @@ +import { cn } from '@/lib/utils'; +import { Platform, TextInput, type TextInputProps } from 'react-native'; + +function Input({ className, ...props }: TextInputProps & React.RefAttributes) { + return ( + + ); +} + +export { Input }; diff --git a/apps/mobile/components/ui/text.tsx b/apps/mobile/components/ui/text.tsx new file mode 100644 index 00000000..d438e36f --- /dev/null +++ b/apps/mobile/components/ui/text.tsx @@ -0,0 +1,89 @@ +import { cn } from '@/lib/utils'; +import * as Slot from '@rn-primitives/slot'; +import { cva, type VariantProps } from 'class-variance-authority'; +import * as React from 'react'; +import { Platform, Text as RNText, type Role } from 'react-native'; + +const textVariants = cva( + cn( + 'text-foreground text-base', + Platform.select({ + web: 'select-text', + }) + ), + { + variants: { + variant: { + default: '', + h1: cn( + 'text-center text-4xl font-extrabold tracking-tight', + Platform.select({ web: 'scroll-m-20 text-balance' }) + ), + h2: cn( + 'border-border border-b pb-2 text-3xl font-semibold tracking-tight', + Platform.select({ web: 'scroll-m-20 first:mt-0' }) + ), + h3: cn('text-2xl font-semibold tracking-tight', Platform.select({ web: 'scroll-m-20' })), + h4: cn('text-xl font-semibold tracking-tight', Platform.select({ web: 'scroll-m-20' })), + p: 'mt-3 leading-7 sm:mt-6', + blockquote: 'mt-4 border-l-2 pl-3 italic sm:mt-6 sm:pl-6', + code: cn( + 'bg-muted relative rounded px-[0.3rem] py-[0.2rem] font-mono text-sm font-semibold' + ), + lead: 'text-muted-foreground text-xl', + large: 'text-lg font-semibold', + small: 'text-sm font-medium leading-none', + muted: 'text-muted-foreground text-sm', + }, + }, + defaultVariants: { + variant: 'default', + }, + } +); + +type TextVariantProps = VariantProps; + +type TextVariant = NonNullable; + +const ROLE: Partial> = { + h1: 'heading', + h2: 'heading', + h3: 'heading', + h4: 'heading', + blockquote: Platform.select({ web: 'blockquote' as Role }), + code: Platform.select({ web: 'code' as Role }), +}; + +const ARIA_LEVEL: Partial> = { + h1: '1', + h2: '2', + h3: '3', + h4: '4', +}; + +const TextClassContext = React.createContext(undefined); + +function Text({ + className, + asChild = false, + variant = 'default', + ...props +}: React.ComponentProps & + TextVariantProps & + React.RefAttributes & { + asChild?: boolean; + }) { + const textClass = React.useContext(TextClassContext); + const Component = asChild ? Slot.Text : RNText; + return ( + + ); +} + +export { Text, TextClassContext }; diff --git a/apps/mobile/eslint.config.js b/apps/mobile/eslint.config.js new file mode 100644 index 00000000..5025da68 --- /dev/null +++ b/apps/mobile/eslint.config.js @@ -0,0 +1,10 @@ +// https://docs.expo.dev/guides/using-eslint/ +const { defineConfig } = require('eslint/config'); +const expoConfig = require('eslint-config-expo/flat'); + +module.exports = defineConfig([ + expoConfig, + { + ignores: ['dist/*'], + }, +]); diff --git a/apps/mobile/global.css b/apps/mobile/global.css new file mode 100644 index 00000000..a420ccdc --- /dev/null +++ b/apps/mobile/global.css @@ -0,0 +1,61 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 240.1 11.2% 4%; + --card: 0 0% 100%; + --card-foreground: 240.1 11.2% 4%; + --popover: 0 0% 100%; + --popover-foreground: 240.1 11.2% 4%; + --primary: 243.5 75.2% 58.5%; + --primary-foreground: 225 100% 96.4%; + --secondary: 240 3.5% 95.8%; + --secondary-foreground: 240 6% 10%; + --muted: 240 3.5% 95.8%; + --muted-foreground: 240.1 4.4% 46.3%; + --accent: 240 3.5% 95.8%; + --accent-foreground: 240 6% 10%; + --destructive: 357.2 100% 45.3%; + --destructive-foreground: 0 0% 98%; + --border: 240 5.9% 90%; + --input: 240 5.9% 90%; + --ring: 240.1 5.7% 64.3%; + --radius: 0.625rem; + --chart-1: 229.8 91.2% 82.1%; + --chart-2: 234.6 90.8% 74.1%; + --chart-3: 238.2 82.8% 66.8%; + --chart-4: 243.5 75.2% 58.5%; + --chart-5: 243.8 56.7% 50.9%; + } + + .dark:root { + --background: 240.1 11.2% 4%; + --foreground: 180 0% 98%; + --card: 240 6% 10%; + --card-foreground: 180 0% 98%; + --popover: 240 6% 10%; + --popover-foreground: 180 0% 98%; + --primary: 238.2 82.8% 66.8%; + --primary-foreground: 225 100% 96.4%; + --secondary: 240 4% 15.9%; + --secondary-foreground: 180 0% 98%; + --muted: 240 4% 15.9%; + --muted-foreground: 240.1 5.7% 64.3%; + --accent: 240 4% 15.9%; + --accent-foreground: 180 0% 98%; + --destructive: 358.7 100% 69.6%; + --destructive-foreground: 0 0% 98%; + --border: 240 5% 11%; + --input: 240 4% 15.5%; + --ring: 240.1 4.4% 46.3%; + --radius: 0.625rem; + --chart-1: 229.8 91.2% 82.1%; + --chart-2: 234.6 90.8% 74.1%; + --chart-3: 238.2 82.8% 66.8%; + --chart-4: 243.5 75.2% 58.5%; + --chart-5: 243.8 56.7% 50.9%; + } +} diff --git a/apps/mobile/lib/theme.ts b/apps/mobile/lib/theme.ts new file mode 100644 index 00000000..2f123f2c --- /dev/null +++ b/apps/mobile/lib/theme.ts @@ -0,0 +1,71 @@ +import { DarkTheme, DefaultTheme, type Theme } from "@react-navigation/native"; + +export const THEME = { + light: { + background: "hsl(0, 0%, 100%)", + foreground: "hsl(240.1, 11.2%, 4%)", + card: "hsl(0, 0%, 100%)", + cardForeground: "hsl(240.1, 11.2%, 4%)", + popover: "hsl(0, 0%, 100%)", + popoverForeground: "hsl(240.1, 11.2%, 4%)", + primary: "hsl(243.5, 75.2%, 58.5%)", + primaryForeground: "hsl(225, 100%, 96.4%)", + secondary: "hsl(240, 3.5%, 95.8%)", + secondaryForeground: "hsl(240, 6%, 10%)", + muted: "hsl(240, 3.5%, 95.8%)", + mutedForeground: "hsl(240.1, 4.4%, 46.3%)", + accent: "hsl(240, 3.5%, 95.8%)", + accentForeground: "hsl(240, 6%, 10%)", + destructive: "hsl(357.2, 100%, 45.3%)", + border: "hsl(240, 5.9%, 90%)", + input: "hsl(240, 5.9%, 90%)", + ring: "hsl(240.1, 5.7%, 64.3%)", + radius: "0.625rem", + }, + dark: { + background: "hsl(240.1, 11.2%, 4%)", + foreground: "hsl(180, 0%, 98%)", + card: "hsl(240, 6%, 10%)", + cardForeground: "hsl(180, 0%, 98%)", + popover: "hsl(240, 6%, 10%)", + popoverForeground: "hsl(180, 0%, 98%)", + primary: "hsl(238.2, 82.8%, 66.8%)", + primaryForeground: "hsl(225, 100%, 96.4%)", + secondary: "hsl(240, 4%, 15.9%)", + secondaryForeground: "hsl(180, 0%, 98%)", + muted: "hsl(240, 4%, 15.9%)", + mutedForeground: "hsl(240.1, 5.7%, 64.3%)", + accent: "hsl(240, 4%, 15.9%)", + accentForeground: "hsl(180, 0%, 98%)", + destructive: "hsl(358.7, 100%, 69.6%)", + border: "hsl(240, 5%, 11%)", + input: "hsl(240, 4%, 15.5%)", + ring: "hsl(240.1, 4.4%, 46.3%)", + radius: "0.625rem", + }, +}; + +export const NAV_THEME: Record<"light" | "dark", Theme> = { + light: { + ...DefaultTheme, + colors: { + background: THEME.light.background, + border: THEME.light.border, + card: THEME.light.card, + notification: THEME.light.destructive, + primary: THEME.light.primary, + text: THEME.light.foreground, + }, + }, + dark: { + ...DarkTheme, + colors: { + background: THEME.dark.background, + border: THEME.dark.border, + card: THEME.dark.card, + notification: THEME.dark.destructive, + primary: THEME.dark.primary, + text: THEME.dark.foreground, + }, + }, +}; diff --git a/apps/mobile/lib/utils.ts b/apps/mobile/lib/utils.ts new file mode 100644 index 00000000..a5ef1935 --- /dev/null +++ b/apps/mobile/lib/utils.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/apps/mobile/metro.config.js b/apps/mobile/metro.config.js new file mode 100644 index 00000000..bbf48069 --- /dev/null +++ b/apps/mobile/metro.config.js @@ -0,0 +1,6 @@ +const { getDefaultConfig } = require("expo/metro-config"); +const { withNativeWind } = require("nativewind/metro"); + +const config = getDefaultConfig(__dirname); + +module.exports = withNativeWind(config, { input: "./global.css", inlineRem: 16 }); diff --git a/apps/mobile/nativewind-env.d.ts b/apps/mobile/nativewind-env.d.ts new file mode 100644 index 00000000..a13e3136 --- /dev/null +++ b/apps/mobile/nativewind-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/apps/mobile/package.json b/apps/mobile/package.json new file mode 100644 index 00000000..34086249 --- /dev/null +++ b/apps/mobile/package.json @@ -0,0 +1,60 @@ +{ + "name": "@multica/mobile", + "main": "expo-router/entry", + "version": "1.0.0", + "scripts": { + "start": "expo start", + "reset-project": "node ./scripts/reset-project.js", + "android": "expo start --android", + "ios": "expo start --ios", + "web": "expo start --web", + "lint": "expo lint" + }, + "dependencies": { + "@expo/vector-icons": "^15.0.3", + "@hugeicons/core-free-icons": "^3.1.1", + "@hugeicons/react-native": "^1.0.11", + "@react-navigation/bottom-tabs": "^7.4.0", + "@react-navigation/elements": "^2.6.3", + "@react-navigation/native": "^7.1.8", + "@rn-primitives/portal": "^1.3.0", + "@rn-primitives/slot": "^1.2.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "expo": "~54.0.33", + "expo-constants": "~18.0.13", + "expo-font": "~14.0.11", + "expo-haptics": "~15.0.8", + "expo-image": "~3.0.11", + "expo-linking": "~8.0.11", + "expo-router": "~6.0.23", + "expo-splash-screen": "~31.0.13", + "expo-status-bar": "~3.0.9", + "expo-symbols": "~1.0.8", + "expo-system-ui": "~6.0.9", + "expo-web-browser": "~15.0.10", + "lucide-react-native": "^0.563.0", + "nativewind": "^4.2.1", + "react": "19.1.0", + "react-dom": "19.1.0", + "react-native": "0.81.5", + "react-native-css-interop": "^0.2.1", + "react-native-gesture-handler": "~2.28.0", + "react-native-reanimated": "~4.1.1", + "react-native-safe-area-context": "~5.6.0", + "react-native-screens": "~4.16.0", + "react-native-svg": "^15.15.1", + "react-native-web": "~0.21.0", + "react-native-worklets": "0.5.1", + "tailwind-merge": "^3.4.0", + "tailwindcss-animate": "^1.0.7" + }, + "devDependencies": { + "@types/react": "~19.1.0", + "eslint": "^9.25.0", + "eslint-config-expo": "~10.0.0", + "tailwindcss": "3.4.17", + "typescript": "~5.9.2" + }, + "private": true +} diff --git a/apps/mobile/scripts/reset-project.js b/apps/mobile/scripts/reset-project.js new file mode 100755 index 00000000..51dff15a --- /dev/null +++ b/apps/mobile/scripts/reset-project.js @@ -0,0 +1,112 @@ +#!/usr/bin/env node + +/** + * This script is used to reset the project to a blank state. + * It deletes or moves the /app, /components, /hooks, /scripts, and /constants directories to /app-example based on user input and creates a new /app directory with an index.tsx and _layout.tsx file. + * You can remove the `reset-project` script from package.json and safely delete this file after running it. + */ + +const fs = require("fs"); +const path = require("path"); +const readline = require("readline"); + +const root = process.cwd(); +const oldDirs = ["app", "components", "hooks", "constants", "scripts"]; +const exampleDir = "app-example"; +const newAppDir = "app"; +const exampleDirPath = path.join(root, exampleDir); + +const indexContent = `import { Text, View } from "react-native"; + +export default function Index() { + return ( + + Edit app/index.tsx to edit this screen. + + ); +} +`; + +const layoutContent = `import { Stack } from "expo-router"; + +export default function RootLayout() { + return ; +} +`; + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, +}); + +const moveDirectories = async (userInput) => { + try { + if (userInput === "y") { + // Create the app-example directory + await fs.promises.mkdir(exampleDirPath, { recursive: true }); + console.log(`📁 /${exampleDir} directory created.`); + } + + // Move old directories to new app-example directory or delete them + for (const dir of oldDirs) { + const oldDirPath = path.join(root, dir); + if (fs.existsSync(oldDirPath)) { + if (userInput === "y") { + const newDirPath = path.join(root, exampleDir, dir); + await fs.promises.rename(oldDirPath, newDirPath); + console.log(`➡️ /${dir} moved to /${exampleDir}/${dir}.`); + } else { + await fs.promises.rm(oldDirPath, { recursive: true, force: true }); + console.log(`❌ /${dir} deleted.`); + } + } else { + console.log(`➡️ /${dir} does not exist, skipping.`); + } + } + + // Create new /app directory + const newAppDirPath = path.join(root, newAppDir); + await fs.promises.mkdir(newAppDirPath, { recursive: true }); + console.log("\n📁 New /app directory created."); + + // Create index.tsx + const indexPath = path.join(newAppDirPath, "index.tsx"); + await fs.promises.writeFile(indexPath, indexContent); + console.log("📄 app/index.tsx created."); + + // Create _layout.tsx + const layoutPath = path.join(newAppDirPath, "_layout.tsx"); + await fs.promises.writeFile(layoutPath, layoutContent); + console.log("📄 app/_layout.tsx created."); + + console.log("\n✅ Project reset complete. Next steps:"); + console.log( + `1. Run \`npx expo start\` to start a development server.\n2. Edit app/index.tsx to edit the main screen.${ + userInput === "y" + ? `\n3. Delete the /${exampleDir} directory when you're done referencing it.` + : "" + }` + ); + } catch (error) { + console.error(`❌ Error during script execution: ${error.message}`); + } +}; + +rl.question( + "Do you want to move existing files to /app-example instead of deleting them? (Y/n): ", + (answer) => { + const userInput = answer.trim().toLowerCase() || "y"; + if (userInput === "y" || userInput === "n") { + moveDirectories(userInput).finally(() => rl.close()); + } else { + console.log("❌ Invalid input. Please enter 'Y' or 'N'."); + rl.close(); + } + } +); diff --git a/apps/mobile/tailwind.config.js b/apps/mobile/tailwind.config.js new file mode 100644 index 00000000..cf8fca8c --- /dev/null +++ b/apps/mobile/tailwind.config.js @@ -0,0 +1,59 @@ +const { hairlineWidth } = require("nativewind/theme"); + +/** @type {import('tailwindcss').Config} */ +module.exports = { + darkMode: "class", + content: ["./app/**/*.{ts,tsx}", "./components/**/*.{ts,tsx}"], + presets: [require("nativewind/preset")], + theme: { + extend: { + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + borderWidth: { + hairline: hairlineWidth(), + }, + }, + }, + future: { + hoverOnlyWhenSupported: true, + }, + plugins: [require("tailwindcss-animate")], +}; diff --git a/apps/mobile/tsconfig.json b/apps/mobile/tsconfig.json new file mode 100644 index 00000000..2f35dd45 --- /dev/null +++ b/apps/mobile/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "expo/tsconfig.base", + "compilerOptions": { + "strict": true, + "paths": { + "@/*": [ + "./*" + ] + } + }, + "include": [ + "**/*.ts", + "**/*.tsx", + ".expo/types/**/*.ts", + "expo-env.d.ts", + "nativewind-env.d.ts" + ] +} \ No newline at end of file diff --git a/docs/mobile/app-store-submission-guide.md b/docs/mobile/app-store-submission-guide.md new file mode 100644 index 00000000..c5da7cdc --- /dev/null +++ b/docs/mobile/app-store-submission-guide.md @@ -0,0 +1,234 @@ +# App Store Submission Guide + +Complete guide for publishing the Expo React Native app to Apple App Store and Google Play Store. + +## 1. Prerequisites + +### Accounts & Fees + +| Platform | Cost | Notes | +|----------|------|-------| +| Apple Developer Program | $99/year | Required for App Store distribution | +| Google Play Console | $25 one-time | Developer registration | +| Expo Account | Free (paid plans available) | Required for EAS Build/Submit | + +- Apple Developer account review: 1-2 days +- Google Play developer account review: days to weeks + +### Tools + +```bash +npm install -g eas-cli +eas login +eas whoami # verify login +``` + +## 2. Project Configuration + +### Initialize EAS + +```bash +eas build:configure +``` + +Generates `eas.json` with three build profiles: `development`, `preview`, `production`. + +### Key `app.json` / `app.config.ts` Fields + +```jsonc +{ + "name": "Multica", + "slug": "multica", + "version": "1.0.0", + "ios": { + "bundleIdentifier": "com.multica.app", + "buildNumber": "1" // increment on each submission + }, + "android": { + "package": "com.multica.app", + "versionCode": 1 // increment on each submission + }, + "icon": "./assets/icon.png", // 1024x1024 PNG + "splash": { + "image": "./assets/splash.png" + } +} +``` + +## 3. App Signing & Credentials + +### iOS + +- EAS auto-manages credentials (recommended): Distribution Certificate + Provisioning Profile +- Or create manually in Apple Developer Portal + +### Android + +- EAS auto-generates Keystore (recommended), stored securely on EAS servers +- **Back up Keystore** — losing it means you cannot update the published app +- Play Store requires AAB (Android App Bundle) format + +## 4. Production Build + +```bash +# iOS +eas build --platform ios --profile production + +# Android +eas build --platform android --profile production + +# Both +eas build --platform all --profile production +``` + +Builds run in Expo cloud — no local Xcode or Android Studio needed. + +## 5. Store Listing Preparation + +### Required for Both Platforms + +#### Privacy Policy + +- **Mandatory** — must be a publicly accessible URL +- Must clearly state: + - What data the app collects and how + - Whether data is shared with third parties + - Data retention and deletion policies + - How users can request data deletion +- **2025 rule**: If data is sent to third-party AI, must disclose explicitly and obtain user consent +- Tools: Termly, PrivacyPolicies.com, or custom page + +#### App Screenshots + +- **iOS**: Multiple sizes required (6.7", 6.5", 5.5" iPhone + iPad) +- **Android**: 2-8 screenshots +- Must accurately reflect current app interface + +#### App Icon + +- 1024x1024 high-resolution PNG +- No alpha/transparency for iOS + +#### App Description + +- Short description (≤80 chars for Google Play) +- Full description + +#### Support URL + +- A link where users can get help + +#### Account Deletion + +- If the app supports registration, users **must** be able to delete their account and data in-app +- Both Apple and Google require this + +### Apple App Store Connect — Additional Requirements + +| Item | Details | +|------|---------| +| Privacy Nutrition Labels | Fill out data collection practices per category in App Store Connect | +| App Review Information | Reviewer contact info, demo/test account credentials | +| Content Rating | Age classification | +| Export Compliance | Encryption usage declaration | +| Info.plist Permission Strings | Clear purpose description for each permission (camera, location, etc.) | + +### Google Play Console — Additional Requirements + +| Item | Details | +|------|---------| +| Data Safety Form | Detail data collection and sharing (required even if no data is collected) | +| Content Rating Questionnaire | IARC rating questionnaire | +| Target Audience | Declare if the app targets children | +| First Upload | Must be done manually via Play Console (Google Play API limitation) | + +## 6. Submit to Stores + +### Apple App Store + +```bash +eas submit --platform ios +``` + +This uploads the build to **App Store Connect / TestFlight**. Then you must: + +1. Log into App Store Connect +2. Select the uploaded build +3. Associate it with a version +4. Fill in all metadata, screenshots, privacy labels +5. Submit for App Review + +### Google Play Store + +```bash +eas submit --platform android +``` + +**First time**: Must upload AAB manually in Play Console. + +After initial upload: +1. Navigate to Production → Create new release +2. Upload AAB or use the EAS-submitted build +3. Fill in description, screenshots, data safety form +4. Submit for review + +### Auto-Submit (Optional) + +```bash +eas build --platform all --profile production --auto-submit +``` + +## 7. App Review + +| | Apple | Google | +|---|---|---| +| Review time | Typically 24-48 hours | Hours to 7 days | +| Common rejections | Incomplete features, misleading screenshots, missing privacy policy, unclear permission strings | Data safety form mismatch, policy violations | +| After rejection | Fix issues, resubmit | Fix issues, resubmit | + +## 8. Post-Launch + +### OTA Updates (No Re-Review Needed) + +```bash +eas update --branch production +``` + +- Only for JS/asset-level changes +- Native code changes still require a new build + review + +### CI/CD Automation + +Create `.eas/workflows/build-and-submit.yml` to auto-build and submit on push to main. + +### Google Service Account Key (for Automated Android Submissions) + +1. Go to EAS dashboard → Credentials → Android +2. Click Application identifier → Service Credentials +3. Add Google Service Account Key + +## 9. Checklist + +- [ ] Register Apple Developer + Google Play Console accounts +- [ ] Configure `app.json` and `eas.json` +- [ ] Prepare app icon, splash screen, screenshots +- [ ] Write and host privacy policy URL +- [ ] Implement in-app account deletion (if registration exists) +- [ ] Add Info.plist permission descriptions (iOS) +- [ ] Run `eas build --platform all --profile production` +- [ ] Create app in App Store Connect, fill metadata + privacy labels +- [ ] Create app in Google Play Console, fill data safety form, manual first AAB upload +- [ ] `eas submit` or submit manually for review +- [ ] Wait for review approval → live +- [ ] Set up `eas update` for OTA updates + +## References + +- [Expo: Submit to App Stores](https://docs.expo.dev/deploy/submit-to-app-stores/) +- [Expo: EAS Submit](https://docs.expo.dev/submit/introduction/) +- [Expo: Build Your Project](https://docs.expo.dev/deploy/build-project/) +- [Expo: App Stores Best Practices](https://docs.expo.dev/distribution/app-stores/) +- [Apple App Review Guidelines](https://developer.apple.com/app-store/review/guidelines/) +- [Apple App Privacy Details](https://developer.apple.com/app-store/app-privacy-details/) +- [Google Play Data Safety](https://support.google.com/googleplay/android-developer/answer/10787469) +- [Google Play Developer Policy Center](https://play.google/developer-content-policy/) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a71a43c2..567bffb0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -125,7 +125,7 @@ importers: version: 11.0.0 '@vitest/coverage-v8': specifier: ^4.0.18 - version: 4.0.18(vitest@4.0.18(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.7(@types/node@25.0.10)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2)) + version: 4.0.18(vitest@4.0.18(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.7(@types/node@25.0.10)(typescript@5.9.3))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) concurrently: specifier: ^9.2.1 version: 9.2.1 @@ -143,7 +143,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.0.18 - version: 4.0.18(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.7(@types/node@25.0.10)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.18(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.7(@types/node@25.0.10)(typescript@5.9.3))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) apps/desktop: dependencies: @@ -162,7 +162,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@5.4.21(@types/node@25.0.10)(lightningcss@1.30.2)) + version: 4.1.18(vite@5.4.21(@types/node@25.0.10)(lightningcss@1.30.2)(terser@5.46.0)) '@types/react': specifier: 'catalog:' version: 19.2.10 @@ -177,7 +177,7 @@ importers: version: 7.18.0(eslint@8.57.1)(typescript@5.9.3) '@vitejs/plugin-react': specifier: ^4.2.1 - version: 4.7.0(vite@5.4.21(@types/node@25.0.10)(lightningcss@1.30.2)) + version: 4.7.0(vite@5.4.21(@types/node@25.0.10)(lightningcss@1.30.2)(terser@5.46.0)) electron: specifier: ^30.0.1 version: 30.5.1 @@ -201,7 +201,7 @@ importers: version: 5.9.3 vite: specifier: ^5.1.6 - version: 5.4.21(@types/node@25.0.10)(lightningcss@1.30.2) + version: 5.4.21(@types/node@25.0.10)(lightningcss@1.30.2)(terser@5.46.0) vite-plugin-electron: specifier: ^0.28.6 version: 0.28.8(vite-plugin-electron-renderer@0.14.6) @@ -209,6 +209,136 @@ importers: specifier: ^0.14.5 version: 0.14.6 + apps/mobile: + dependencies: + '@expo/vector-icons': + specifier: ^15.0.3 + version: 15.0.3(expo-font@14.0.11(expo@54.0.33)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@hugeicons/core-free-icons': + specifier: ^3.1.1 + version: 3.1.1 + '@hugeicons/react-native': + specifier: ^1.0.11 + version: 1.0.11(react-native-svg@15.15.1(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@react-navigation/bottom-tabs': + specifier: ^7.4.0 + version: 7.12.0(@react-navigation/native@7.1.28(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@react-navigation/elements': + specifier: ^2.6.3 + version: 2.9.5(@react-navigation/native@7.1.28(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@react-navigation/native': + specifier: ^7.1.8 + version: 7.1.28(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@rn-primitives/portal': + specifier: ^1.3.0 + version: 1.3.0(@types/react@19.1.17)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(use-sync-external-store@1.6.0(react@19.1.0)) + '@rn-primitives/slot': + specifier: ^1.2.0 + version: 1.2.0(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + expo: + specifier: ~54.0.33 + version: 54.0.33(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-constants: + specifier: ~18.0.13 + version: 18.0.13(expo@54.0.33)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0)) + expo-font: + specifier: ~14.0.11 + version: 14.0.11(expo@54.0.33)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-haptics: + specifier: ~15.0.8 + version: 15.0.8(expo@54.0.33) + expo-image: + specifier: ~3.0.11 + version: 3.0.11(expo@54.0.33)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-linking: + specifier: ~8.0.11 + version: 8.0.11(expo@54.0.33)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-router: + specifier: ~6.0.23 + version: 6.0.23(w7u2e3gmpia3npio76ytuzityu) + expo-splash-screen: + specifier: ~31.0.13 + version: 31.0.13(expo@54.0.33) + expo-status-bar: + specifier: ~3.0.9 + version: 3.0.9(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-symbols: + specifier: ~1.0.8 + version: 1.0.8(expo@54.0.33)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0)) + expo-system-ui: + specifier: ~6.0.9 + version: 6.0.9(expo@54.0.33)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0)) + expo-web-browser: + specifier: ~15.0.10 + version: 15.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0)) + lucide-react-native: + specifier: ^0.563.0 + version: 0.563.0(react-native-svg@15.15.1(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + nativewind: + specifier: ^4.2.1 + version: 4.2.1(react-native-reanimated@4.1.6(@babel/core@7.28.6)(react-native-worklets@0.5.1(@babel/core@7.28.6)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-svg@15.15.1(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(tailwindcss@3.4.17) + react: + specifier: 19.1.0 + version: 19.1.0 + react-dom: + specifier: 19.1.0 + version: 19.1.0(react@19.1.0) + react-native: + specifier: 0.81.5 + version: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + react-native-css-interop: + specifier: ^0.2.1 + version: 0.2.1(react-native-reanimated@4.1.6(@babel/core@7.28.6)(react-native-worklets@0.5.1(@babel/core@7.28.6)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-svg@15.15.1(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(tailwindcss@3.4.17) + react-native-gesture-handler: + specifier: ~2.28.0 + version: 2.28.0(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native-reanimated: + specifier: ~4.1.1 + version: 4.1.6(@babel/core@7.28.6)(react-native-worklets@0.5.1(@babel/core@7.28.6)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native-safe-area-context: + specifier: ~5.6.0 + version: 5.6.2(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native-screens: + specifier: ~4.16.0 + version: 4.16.0(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native-svg: + specifier: ^15.15.1 + version: 15.15.1(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native-web: + specifier: ~0.21.0 + version: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react-native-worklets: + specifier: 0.5.1 + version: 0.5.1(@babel/core@7.28.6)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + tailwind-merge: + specifier: ^3.4.0 + version: 3.4.0 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.17) + devDependencies: + '@types/react': + specifier: ~19.1.0 + version: 19.1.17 + eslint: + specifier: ^9.25.0 + version: 9.39.2(jiti@2.6.1) + eslint-config-expo: + specifier: ~10.0.0 + version: 10.0.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + tailwindcss: + specifier: 3.4.17 + version: 3.4.17 + typescript: + specifier: ~5.9.2 + version: 5.9.3 + apps/web: dependencies: '@hugeicons/core-free-icons': @@ -228,7 +358,7 @@ importers: version: link:../../packages/ui next: specifier: 16.1.6 - version: 16.1.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 16.1.6(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: specifier: 'catalog:' version: 19.2.3 @@ -383,6 +513,14 @@ packages: 7zip-bin@5.2.0: resolution: {integrity: sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==} + '@0no-co/graphql.web@1.2.0': + resolution: {integrity: sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + graphql: + optional: true + '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -549,10 +687,17 @@ packages: resolution: {integrity: sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==} engines: {node: '>=18.0.0'} + '@babel/code-frame@7.10.4': + resolution: {integrity: sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==} + '@babel/code-frame@7.28.6': resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.28.6': resolution: {integrity: sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==} engines: {node: '>=6.9.0'} @@ -565,6 +710,10 @@ packages: resolution: {integrity: sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==} engines: {node: '>=6.9.0'} + '@babel/generator@7.29.0': + resolution: {integrity: sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.27.3': resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} @@ -579,6 +728,17 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-create-regexp-features-plugin@7.28.5': + resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.6': + resolution: {integrity: sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/helper-globals@7.28.0': resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} @@ -605,6 +765,12 @@ packages: resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} engines: {node: '>=6.9.0'} + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-replace-supers@7.28.6': resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} engines: {node: '>=6.9.0'} @@ -627,33 +793,316 @@ packages: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} + '@babel/helper-wrap-function@7.28.6': + resolution: {integrity: sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==} + engines: {node: '>=6.9.0'} + '@babel/helpers@7.28.6': resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} engines: {node: '>=6.9.0'} + '@babel/highlight@7.25.9': + resolution: {integrity: sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==} + engines: {node: '>=6.9.0'} + '@babel/parser@7.28.6': resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.29.0': + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-proposal-decorators@7.29.0': + resolution: {integrity: sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-export-default-from@7.27.1': + resolution: {integrity: sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-decorators@7.28.6': + resolution: {integrity: sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-dynamic-import@7.8.3': + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-export-default-from@7.28.6': + resolution: {integrity: sha512-Svlx1fjJFnNz0LZeUaybRukSxZI3KkpApUmIRzEdXC5k8ErTOz0OD0kNrICi5Vc3GlpP5ZCeRyRO+mfWTSz+iQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-flow@7.28.6': + resolution: {integrity: sha512-D+OrJumc9McXNEBI/JmFnc/0uCM2/Y3PEBG3gfV3QIYkKv5pvnpzFrl1kYCrcHJP8nOeFB/SHi1IHz29pNGuew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.28.6': + resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.28.6': resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-typescript@7.28.6': resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.29.0': + resolution: {integrity: sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.28.6': + resolution: {integrity: sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.28.6': + resolution: {integrity: sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.28.6': + resolution: {integrity: sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.28.6': + resolution: {integrity: sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.28.6': + resolution: {integrity: sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.28.6': + resolution: {integrity: sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.28.5': + resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.27.1': + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-flow-strip-types@7.27.1': + resolution: {integrity: sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.28.6': + resolution: {integrity: sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-commonjs@7.28.6': resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-named-capturing-groups-regex@7.29.0': + resolution: {integrity: sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.28.6': + resolution: {integrity: sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.28.6': + resolution: {integrity: sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.28.6': + resolution: {integrity: sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.28.6': + resolution: {integrity: sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.28.6': + resolution: {integrity: sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.27.7': + resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.28.6': + resolution: {integrity: sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.28.6': + resolution: {integrity: sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-display-name@7.28.0': + resolution: {integrity: sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-development@7.27.1': + resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-self@7.27.1': resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} engines: {node: '>=6.9.0'} @@ -666,12 +1115,72 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx@7.28.6': + resolution: {integrity: sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-pure-annotations@7.27.1': + resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.29.0': + resolution: {integrity: sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-runtime@7.29.0': + resolution: {integrity: sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.28.6': + resolution: {integrity: sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typescript@7.28.6': resolution: {integrity: sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-react@7.28.5': + resolution: {integrity: sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/preset-typescript@7.28.5': resolution: {integrity: sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==} engines: {node: '>=6.9.0'} @@ -690,10 +1199,18 @@ packages: resolution: {integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} + '@babel/types@7.28.6': resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} engines: {node: '>=6.9.0'} + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + '@base-ui/react@1.1.0': resolution: {integrity: sha512-ikcJRNj1mOiF2HZ5jQHrXoVoHcNHdBU5ejJljcBl+VTLoYXR6FidjTN86GjO6hyshi6TZFuNvv0dEOgaOFv6Lw==} engines: {node: '>=14.0.0'} @@ -736,6 +1253,10 @@ packages: peerDependencies: '@noble/ciphers': ^1.0.0 + '@egjs/hammerjs@2.0.17': + resolution: {integrity: sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==} + engines: {node: '>=0.8.0'} + '@electron/asar@3.4.1': resolution: {integrity: sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==} engines: {node: '>=10.12.0'} @@ -1107,6 +1628,122 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@expo/cli@54.0.23': + resolution: {integrity: sha512-km0h72SFfQCmVycH/JtPFTVy69w6Lx1cHNDmfLfQqgKFYeeHTjx7LVDP4POHCtNxFP2UeRazrygJhlh4zz498g==} + hasBin: true + peerDependencies: + expo: '*' + expo-router: '*' + react-native: '*' + peerDependenciesMeta: + expo-router: + optional: true + react-native: + optional: true + + '@expo/code-signing-certificates@0.0.6': + resolution: {integrity: sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==} + + '@expo/config-plugins@54.0.4': + resolution: {integrity: sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==} + + '@expo/config-types@54.0.10': + resolution: {integrity: sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==} + + '@expo/config@12.0.13': + resolution: {integrity: sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==} + + '@expo/devcert@1.2.1': + resolution: {integrity: sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==} + + '@expo/devtools@0.1.8': + resolution: {integrity: sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==} + peerDependencies: + react: '*' + react-native: '*' + peerDependenciesMeta: + react: + optional: true + react-native: + optional: true + + '@expo/env@2.0.8': + resolution: {integrity: sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==} + + '@expo/fingerprint@0.15.4': + resolution: {integrity: sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==} + hasBin: true + + '@expo/image-utils@0.8.8': + resolution: {integrity: sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==} + + '@expo/json-file@10.0.8': + resolution: {integrity: sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==} + + '@expo/metro-config@54.0.14': + resolution: {integrity: sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==} + peerDependencies: + expo: '*' + peerDependenciesMeta: + expo: + optional: true + + '@expo/metro-runtime@6.1.2': + resolution: {integrity: sha512-nvM+Qv45QH7pmYvP8JB1G8JpScrWND3KrMA6ZKe62cwwNiX/BjHU28Ear0v/4bQWXlOY0mv6B8CDIm8JxXde9g==} + peerDependencies: + expo: '*' + react: '*' + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + + '@expo/metro@54.2.0': + resolution: {integrity: sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==} + + '@expo/osascript@2.3.8': + resolution: {integrity: sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==} + engines: {node: '>=12'} + + '@expo/package-manager@1.9.10': + resolution: {integrity: sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==} + + '@expo/plist@0.4.8': + resolution: {integrity: sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==} + + '@expo/prebuild-config@54.0.8': + resolution: {integrity: sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==} + peerDependencies: + expo: '*' + + '@expo/schema-utils@0.1.8': + resolution: {integrity: sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==} + + '@expo/sdk-runtime-versions@1.0.0': + resolution: {integrity: sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==} + + '@expo/spawn-async@1.7.2': + resolution: {integrity: sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==} + engines: {node: '>=12'} + + '@expo/sudo-prompt@9.3.2': + resolution: {integrity: sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==} + + '@expo/vector-icons@15.0.3': + resolution: {integrity: sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==} + peerDependencies: + expo-font: '>=14.0.4' + react: '*' + react-native: '*' + + '@expo/ws-tunnel@1.0.6': + resolution: {integrity: sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==} + + '@expo/xcpretty@4.4.0': + resolution: {integrity: sha512-o2qDlTqJ606h4xR36H2zWTywmZ3v3842K6TU8Ik2n1mfW0S580VHlt3eItVYdLYz+klaPp7CXqanja8eASZjRw==} + hasBin: true + '@floating-ui/core@1.7.4': resolution: {integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==} @@ -1140,6 +1777,13 @@ packages: '@hugeicons/core-free-icons@3.1.1': resolution: {integrity: sha512-UpS2lUQFi5sKyJSWwM6rO+BnPLvVz1gsyCpPHeZyVuZqi89YH8ksliza4cwaODqKOZyeXmG8juo1ty4QtQofkg==} + '@hugeicons/react-native@1.0.11': + resolution: {integrity: sha512-HCUhHrFbL30ArN7tWV7+udnd1Qotu/eKcys63PELui3XVxP0DPPEvgFJqgbdig2afrLltroP7QCAdBNWOorWSg==} + peerDependencies: + react: '>=16.0.0' + react-native: '>=0.60.0' + react-native-svg: '>=12.0.0' + '@hugeicons/react@1.1.4': resolution: {integrity: sha512-gsc3eZyd2fGqRUThW9+lfjxxsOkz6KNVmRXRgJjP32GL0OnnLJnl3hytKt47CBbiQj2xE2kCw+rnP3UQCThcKw==} peerDependencies: @@ -1354,6 +1998,46 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@isaacs/ttlcache@1.4.1': + resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} + engines: {node: '>=12'} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/create-cache-key-function@29.7.0': + resolution: {integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1364,6 +2048,9 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} @@ -1663,6 +2350,367 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@radix-ui/primitive@1.1.3': + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + + '@radix-ui/react-collection@1.1.7': + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.15': + resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.11': + resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.3': + resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.7': + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-portal@1.1.9': + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.5': + resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.3': + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.11': + resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.2.0': + resolution: {integrity: sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-slot@1.2.3': + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-tabs@1.1.13': + resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@react-native/assets-registry@0.81.5': + resolution: {integrity: sha512-705B6x/5Kxm1RKRvSv0ADYWm5JOnoiQ1ufW7h8uu2E6G9Of/eE6hP/Ivw3U5jI16ERqZxiKQwk34VJbB0niX9w==} + engines: {node: '>= 20.19.4'} + + '@react-native/babel-plugin-codegen@0.81.5': + resolution: {integrity: sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==} + engines: {node: '>= 20.19.4'} + + '@react-native/babel-preset@0.81.5': + resolution: {integrity: sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==} + engines: {node: '>= 20.19.4'} + peerDependencies: + '@babel/core': '*' + + '@react-native/codegen@0.81.5': + resolution: {integrity: sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==} + engines: {node: '>= 20.19.4'} + peerDependencies: + '@babel/core': '*' + + '@react-native/community-cli-plugin@0.81.5': + resolution: {integrity: sha512-yWRlmEOtcyvSZ4+OvqPabt+NS36vg0K/WADTQLhrYrm9qdZSuXmq8PmdJWz/68wAqKQ+4KTILiq2kjRQwnyhQw==} + engines: {node: '>= 20.19.4'} + peerDependencies: + '@react-native-community/cli': '*' + '@react-native/metro-config': '*' + peerDependenciesMeta: + '@react-native-community/cli': + optional: true + '@react-native/metro-config': + optional: true + + '@react-native/debugger-frontend@0.81.5': + resolution: {integrity: sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==} + engines: {node: '>= 20.19.4'} + + '@react-native/dev-middleware@0.81.5': + resolution: {integrity: sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==} + engines: {node: '>= 20.19.4'} + + '@react-native/gradle-plugin@0.81.5': + resolution: {integrity: sha512-hORRlNBj+ReNMLo9jme3yQ6JQf4GZpVEBLxmTXGGlIL78MAezDZr5/uq9dwElSbcGmLEgeiax6e174Fie6qPLg==} + engines: {node: '>= 20.19.4'} + + '@react-native/js-polyfills@0.81.5': + resolution: {integrity: sha512-fB7M1CMOCIUudTRuj7kzxIBTVw2KXnsgbQ6+4cbqSxo8NmRRhA0Ul4ZUzZj3rFd3VznTL4Brmocv1oiN0bWZ8w==} + engines: {node: '>= 20.19.4'} + + '@react-native/normalize-colors@0.74.89': + resolution: {integrity: sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg==} + + '@react-native/normalize-colors@0.81.5': + resolution: {integrity: sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==} + + '@react-native/virtualized-lists@0.81.5': + resolution: {integrity: sha512-UVXgV/db25OPIvwZySeToXD/9sKKhOdkcWmmf4Jh8iBZuyfML+/5CasaZ1E7Lqg6g3uqVQq75NqIwkYmORJMPw==} + engines: {node: '>= 20.19.4'} + peerDependencies: + '@types/react': ^19.1.0 + react: '*' + react-native: '*' + peerDependenciesMeta: + '@types/react': + optional: true + + '@react-navigation/bottom-tabs@7.12.0': + resolution: {integrity: sha512-/GtOfVWRligHG0mvX39I1FGdUWeWl0GVF2okEziQSQj0bOTrLIt7y44C3r/aCLkEpTVltCPGM3swqGTH3UfRCw==} + peerDependencies: + '@react-navigation/native': ^7.1.28 + react: '>= 18.2.0' + react-native: '*' + react-native-safe-area-context: '>= 4.0.0' + react-native-screens: '>= 4.0.0' + + '@react-navigation/core@7.14.0': + resolution: {integrity: sha512-tMpzskBzVp0E7CRNdNtJIdXjk54Kwe/TF9ViXAef+YFM1kSfGv4e/B2ozfXE+YyYgmh4WavTv8fkdJz1CNyu+g==} + peerDependencies: + react: '>= 18.2.0' + + '@react-navigation/elements@2.9.5': + resolution: {integrity: sha512-iHZU8rRN1014Upz73AqNVXDvSMZDh5/ktQ1CMe21rdgnOY79RWtHHBp9qOS3VtqlUVYGkuX5GEw5mDt4tKdl0g==} + peerDependencies: + '@react-native-masked-view/masked-view': '>= 0.2.0' + '@react-navigation/native': ^7.1.28 + react: '>= 18.2.0' + react-native: '*' + react-native-safe-area-context: '>= 4.0.0' + peerDependenciesMeta: + '@react-native-masked-view/masked-view': + optional: true + + '@react-navigation/native-stack@7.12.0': + resolution: {integrity: sha512-XmNJsPshjkNsahgbxNgGWQUq4s1l6HqH/Fei4QsjBNn/0mTvVrRVZwJ1XrY9YhWYvyiYkAN6/OmarWQaQJ0otQ==} + peerDependencies: + '@react-navigation/native': ^7.1.28 + react: '>= 18.2.0' + react-native: '*' + react-native-safe-area-context: '>= 4.0.0' + react-native-screens: '>= 4.0.0' + + '@react-navigation/native@7.1.28': + resolution: {integrity: sha512-d1QDn+KNHfHGt3UIwOZvupvdsDdiHYZBEj7+wL2yDVo3tMezamYy60H9s3EnNVE1Ae1ty0trc7F2OKqo/RmsdQ==} + peerDependencies: + react: '>= 18.2.0' + react-native: '*' + + '@react-navigation/routers@7.5.3': + resolution: {integrity: sha512-1tJHg4KKRJuQ1/EvJxatrMef3NZXEPzwUIUZ3n1yJ2t7Q97siwRtbynRpQG9/69ebbtiZ8W3ScOZF/OmhvM4Rg==} + + '@rn-primitives/portal@1.3.0': + resolution: {integrity: sha512-a2DSce7TcSfcs0cCngLadAJOvx/+mdH9NRu+GxkX8NPRsGGhJvDEOqouMgDqLwx7z9mjXoUaZcwaVcemUSW9/A==} + peerDependencies: + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + + '@rn-primitives/slot@1.2.0': + resolution: {integrity: sha512-cpbn+JLjSeq3wcA4uqgFsUimMrWYWx2Ks7r5rkwd1ds1utxynsGkLOKpYVQkATwWrYhtcoF1raxIKEqXuMN+/w==} + peerDependencies: + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native: + optional: true + react-native-web: + optional: true + '@rolldown/pluginutils@1.0.0-beta.27': resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} @@ -1821,6 +2869,9 @@ packages: '@silvia-odwyer/photon-node@0.3.4': resolution: {integrity: sha512-bnly4BKB3KDTFxrUIcgCLbaeVVS8lrAkri1pEzskpmxu9MdfGQTy8b8EgcD83ywD3RPMsIulY8xJH5Awa+t9fA==} + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@sinclair/typebox@0.34.48': resolution: {integrity: sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==} @@ -1832,6 +2883,12 @@ packages: resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@smithy/abort-controller@4.2.8': resolution: {integrity: sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==} engines: {node: '>=18.0.0'} @@ -2186,12 +3243,27 @@ packages: '@types/fs-extra@9.0.13': resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + + '@types/hammerjs@2.0.46': + resolution: {integrity: sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} '@types/http-cache-semantics@4.2.0': resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -2227,12 +3299,18 @@ packages: peerDependencies: '@types/react': ^19.2.0 + '@types/react@19.1.17': + resolution: {integrity: sha512-Qec1E3mhALmaspIrhWt9jkQMNdw6bReVu64mjvhbhq2NFPftLPVr+l1SZgmw/66WwBNpDh7ao5AT6gF5v41PFA==} + '@types/react@19.2.10': resolution: {integrity: sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==} '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + '@types/statuses@2.0.6': resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} @@ -2255,6 +3333,12 @@ packages: '@types/verror@1.10.11': resolution: {integrity: sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==} + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.35': + resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} + '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} @@ -2473,6 +3557,14 @@ packages: cpu: [x64] os: [win32] + '@urql/core@5.2.0': + resolution: {integrity: sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==} + + '@urql/exchange-retry@1.3.2': + resolution: {integrity: sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==} + peerDependencies: + '@urql/core': ^5.0.0 + '@vitejs/plugin-react@4.7.0': resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -2521,6 +3613,10 @@ packages: resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} engines: {node: '>=10.0.0'} + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -2566,6 +3662,17 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + anser@1.4.10: + resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -2574,10 +3681,18 @@ packages: resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + ansi-styles@6.2.3: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} @@ -2589,6 +3704,10 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + app-builder-bin@4.0.0: resolution: {integrity: sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==} @@ -2614,9 +3733,19 @@ packages: resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} engines: {node: '>= 10'} + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} @@ -2629,6 +3758,9 @@ packages: resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} + array-timsort@1.0.3: + resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} + array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -2657,6 +3789,9 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + assert-plus@1.0.0: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} engines: {node: '>=0.8'} @@ -2691,6 +3826,9 @@ packages: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} + async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} @@ -2717,6 +3855,70 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + babel-plugin-polyfill-corejs2@0.4.15: + resolution: {integrity: sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.13.0: + resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.6: + resolution: {integrity: sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-react-compiler@1.0.0: + resolution: {integrity: sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==} + + babel-plugin-react-native-web@0.21.2: + resolution: {integrity: sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA==} + + babel-plugin-syntax-hermes-parser@0.29.1: + resolution: {integrity: sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==} + + babel-plugin-transform-flow-enums@0.0.2: + resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} + + babel-preset-current-node-syntax@1.2.0: + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} + peerDependencies: + '@babel/core': ^7.0.0 || ^8.0.0-0 + + babel-preset-expo@54.0.10: + resolution: {integrity: sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==} + peerDependencies: + '@babel/runtime': ^7.20.0 + expo: '*' + react-refresh: '>=0.14.0 <1.0.0' + peerDependenciesMeta: + '@babel/runtime': + optional: true + expo: + optional: true + + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -2738,9 +3940,21 @@ packages: resolution: {integrity: sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==} engines: {node: '>=10.0.0'} + better-opn@3.0.2: + resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} + engines: {node: '>=12.0.0'} + + big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + bignumber.js@9.3.1: resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -2764,6 +3978,17 @@ packages: bowser@2.13.1: resolution: {integrity: sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==} + bplist-creator@0.1.0: + resolution: {integrity: sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==} + + bplist-parser@0.3.1: + resolution: {integrity: sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==} + engines: {node: '>= 5.10.0'} + + bplist-parser@0.3.2: + resolution: {integrity: sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==} + engines: {node: '>= 5.10.0'} + brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} @@ -2779,6 +4004,9 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} @@ -2838,6 +4066,18 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + caniuse-lite@1.0.30001766: resolution: {integrity: sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==} @@ -2848,6 +4088,10 @@ packages: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -2868,13 +4112,32 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + chrome-launcher@0.15.2: + resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==} + engines: {node: '>=12.13.0'} + hasBin: true + + chromium-edge-launcher@0.2.0: + resolution: {integrity: sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==} + chromium-pickle-js@0.2.0: resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} + ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -2882,6 +4145,10 @@ packages: class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + cli-cursor@2.1.0: + resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} + engines: {node: '>=4'} + cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} @@ -2916,6 +4183,10 @@ packages: clone-response@1.0.3: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -2923,13 +4194,26 @@ packages: code-block-writer@13.0.3: resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -2944,14 +4228,33 @@ packages: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + commander@14.0.2: resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} engines: {node: '>=20'} + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + commander@5.1.0: resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} engines: {node: '>= 6'} + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + comment-json@4.5.1: + resolution: {integrity: sha512-taEtr3ozUmOB7it68Jll7s0Pwm+aoiHyXKrEC8SEodL4rNpdfDLqa7PfBlrgFoCNNdR8ImL+muti5IGvktJAAg==} + engines: {node: '>= 6'} + compare-version@0.1.2: resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==} engines: {node: '>=0.10.0'} @@ -2960,6 +4263,14 @@ packages: resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} engines: {node: '>= 10'} + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.8.1: + resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} + engines: {node: '>= 0.8.0'} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -2975,6 +4286,10 @@ packages: config-file-ts@0.2.6: resolution: {integrity: sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==} + connect@3.7.0: + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} + engines: {node: '>= 0.10.0'} + consola@3.4.2: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -3002,6 +4317,9 @@ packages: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} engines: {node: '>=18'} + core-js-compat@3.48.0: + resolution: {integrity: sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==} + core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} @@ -3037,13 +4355,27 @@ packages: crc@3.8.0: resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + + css-in-js-utils@3.1.0: + resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} + css-select@5.2.2: resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + css-what@6.2.2: resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} engines: {node: '>= 6'} @@ -3085,6 +4417,14 @@ packages: dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -3105,6 +4445,10 @@ packages: decode-named-character-reference@1.3.0: resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} @@ -3117,6 +4461,10 @@ packages: babel-plugin-macros: optional: true + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -3132,6 +4480,9 @@ packages: resolution: {integrity: sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==} engines: {node: '>=18'} + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} @@ -3140,6 +4491,10 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} @@ -3164,16 +4519,31 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + diff@8.0.3: resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} engines: {node: '>=0.3.1'} @@ -3185,6 +4555,9 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dmg-builder@24.13.3: resolution: {integrity: sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ==} @@ -3215,9 +4588,17 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dotenv-expand@11.0.7: + resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} + engines: {node: '>=12'} + dotenv-expand@5.1.0: resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + dotenv@17.2.3: resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} engines: {node: '>=12'} @@ -3276,6 +4657,10 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} @@ -3310,6 +4695,10 @@ packages: resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} engines: {node: '>=0.12'} + env-editor@0.4.2: + resolution: {integrity: sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==} + engines: {node: '>=8'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -3320,6 +4709,9 @@ packages: error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + es-abstract@1.24.1: resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} engines: {node: '>= 0.4'} @@ -3375,6 +4767,14 @@ packages: escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -3388,6 +4788,11 @@ packages: engines: {node: '>=6.0'} hasBin: true + eslint-config-expo@10.0.0: + resolution: {integrity: sha512-/XC/DvniUWTzU7Ypb/cLDhDD4DXqEio4lug1ObD/oQ9Hcx3OVOR8Mkp4u6U4iGoZSJyIQmIk3WVHe/P1NYUXKw==} + peerDependencies: + eslint: '>=8.10' + eslint-config-next@16.1.6: resolution: {integrity: sha512-vKq40io2B0XtkkNDYyleATwblNt8xuh3FWp8SpSz3pt7P01OkBFlKsJZ2mWt5WsCySlDQLckb1zMY9yE9Qy0LA==} peerDependencies: @@ -3434,6 +4839,12 @@ packages: eslint-import-resolver-webpack: optional: true + eslint-plugin-expo@1.0.0: + resolution: {integrity: sha512-qLtunR+cNFtC+jwYCBia5c/PJurMjSLMOV78KrEOyQK02ohZapU4dCFFnS2hfrJuw0zxfsjVkjqg3QBqi933QA==} + engines: {node: '>=18.0.0'} + peerDependencies: + eslint: '>=8.10' + eslint-plugin-import@2.32.0: resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} engines: {node: '>=4'} @@ -3456,6 +4867,12 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + eslint-plugin-react-hooks@7.0.1: resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} engines: {node: '>=18'} @@ -3544,6 +4961,10 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + eventsource-parser@3.0.6: resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} engines: {node: '>=18.0.0'} @@ -3552,6 +4973,9 @@ packages: resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} engines: {node: '>=18.0.0'} + exec-async@2.2.0: + resolution: {integrity: sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==} + execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -3564,6 +4988,161 @@ packages: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} + expo-asset@12.0.12: + resolution: {integrity: sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' + + expo-constants@18.0.13: + resolution: {integrity: sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==} + peerDependencies: + expo: '*' + react-native: '*' + + expo-file-system@19.0.21: + resolution: {integrity: sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==} + peerDependencies: + expo: '*' + react-native: '*' + + expo-font@14.0.11: + resolution: {integrity: sha512-ga0q61ny4s/kr4k8JX9hVH69exVSIfcIc19+qZ7gt71Mqtm7xy2c6kwsPTCyhBW2Ro5yXTT8EaZOpuRi35rHbg==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' + + expo-haptics@15.0.8: + resolution: {integrity: sha512-lftutojy8Qs8zaDzzjwM3gKHFZ8bOOEZDCkmh2Ddpe95Ra6kt2izeOfOfKuP/QEh0MZ1j9TfqippyHdRd1ZM9g==} + peerDependencies: + expo: '*' + + expo-image@3.0.11: + resolution: {integrity: sha512-4TudfUCLgYgENv+f48omnU8tjS2S0Pd9EaON5/s1ZUBRwZ7K8acEr4NfvLPSaeXvxW24iLAiyQ7sV7BXQH3RoA==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native-web: + optional: true + + expo-keep-awake@15.0.8: + resolution: {integrity: sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==} + peerDependencies: + expo: '*' + react: '*' + + expo-linking@8.0.11: + resolution: {integrity: sha512-+VSaNL5om3kOp/SSKO5qe6cFgfSIWnnQDSbA7XLs3ECkYzXRquk5unxNS3pg7eK5kNUmQ4kgLI7MhTggAEUBLA==} + peerDependencies: + react: '*' + react-native: '*' + + expo-modules-autolinking@3.0.24: + resolution: {integrity: sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==} + hasBin: true + + expo-modules-core@3.0.29: + resolution: {integrity: sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==} + peerDependencies: + react: '*' + react-native: '*' + + expo-router@6.0.23: + resolution: {integrity: sha512-qCxVAiCrCyu0npky6azEZ6dJDMt77OmCzEbpF6RbUTlfkaCA417LvY14SBkk0xyGruSxy/7pvJOI6tuThaUVCA==} + peerDependencies: + '@expo/metro-runtime': ^6.1.2 + '@react-navigation/drawer': ^7.5.0 + '@testing-library/react-native': '>= 12.0.0' + expo: '*' + expo-constants: ^18.0.13 + expo-linking: ^8.0.11 + react: '*' + react-dom: '*' + react-native: '*' + react-native-gesture-handler: '*' + react-native-reanimated: '*' + react-native-safe-area-context: '>= 5.4.0' + react-native-screens: '*' + react-native-web: '*' + react-server-dom-webpack: ~19.0.4 || ~19.1.5 || ~19.2.4 + peerDependenciesMeta: + '@react-navigation/drawer': + optional: true + '@testing-library/react-native': + optional: true + react-dom: + optional: true + react-native-gesture-handler: + optional: true + react-native-reanimated: + optional: true + react-native-web: + optional: true + react-server-dom-webpack: + optional: true + + expo-server@1.0.5: + resolution: {integrity: sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==} + engines: {node: '>=20.16.0'} + + expo-splash-screen@31.0.13: + resolution: {integrity: sha512-1epJLC1cDlwwj089R2h8cxaU5uk4ONVAC+vzGiTZH4YARQhL4Stlz1MbR6yAS173GMosvkE6CAeihR7oIbCkDA==} + peerDependencies: + expo: '*' + + expo-status-bar@3.0.9: + resolution: {integrity: sha512-xyYyVg6V1/SSOZWh4Ni3U129XHCnFHBTcUo0dhWtFDrZbNp/duw5AGsQfb2sVeU0gxWHXSY1+5F0jnKYC7WuOw==} + peerDependencies: + react: '*' + react-native: '*' + + expo-symbols@1.0.8: + resolution: {integrity: sha512-7bNjK350PaQgxBf0owpmSYkdZIpdYYmaPttDBb2WIp6rIKtcEtdzdfmhsc2fTmjBURHYkg36+eCxBFXO25/1hw==} + peerDependencies: + expo: '*' + react-native: '*' + + expo-system-ui@6.0.9: + resolution: {integrity: sha512-eQTYGzw1V4RYiYHL9xDLYID3Wsec2aZS+ypEssmF64D38aDrqbDgz1a2MSlHLQp2jHXSs3FvojhZ9FVela1Zcg==} + peerDependencies: + expo: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native-web: + optional: true + + expo-web-browser@15.0.10: + resolution: {integrity: sha512-fvDhW4bhmXAeWFNFiInmsGCK83PAqAcQaFyp/3pE/jbdKmFKoRCWr46uZGIfN4msLK/OODhaQ/+US7GSJNDHJg==} + peerDependencies: + expo: '*' + react-native: '*' + + expo@54.0.33: + resolution: {integrity: sha512-3yOEfAKqo+gqHcV8vKcnq0uA5zxlohnhA3fu4G43likN8ct5ZZ3LjAh9wDdKteEkoad3tFPvwxmXW711S5OHUw==} + hasBin: true + peerDependencies: + '@expo/dom-webview': '*' + '@expo/metro-runtime': '*' + react: '*' + react-native: '*' + react-native-webview: '*' + peerDependenciesMeta: + '@expo/dom-webview': + optional: true + '@expo/metro-runtime': + optional: true + react-native-webview: + optional: true + + exponential-backoff@3.1.3: + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} + express-rate-limit@7.5.1: resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} engines: {node: '>= 16'} @@ -3619,6 +5198,15 @@ packages: fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + fbjs-css-vars@1.0.2: + resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} + + fbjs@3.0.5: + resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} + fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} @@ -3658,10 +5246,22 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} + + finalhandler@1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} + finalhandler@2.1.1: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -3677,6 +5277,12 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flow-enums-runtime@0.0.6: + resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} + + fontfaceobserver@2.3.0: + resolution: {integrity: sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==} + for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -3697,6 +5303,14 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} + freeport-async@2.0.0: + resolution: {integrity: sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==} + engines: {node: '>=8'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + fresh@2.0.0: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} @@ -3776,10 +5390,18 @@ packages: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + get-own-enumerable-keys@1.0.0: resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} engines: {node: '>=14.16'} + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -3807,6 +5429,10 @@ packages: resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} engines: {node: '>= 14'} + getenv@2.0.0: + resolution: {integrity: sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==} + engines: {node: '>=6'} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -3824,6 +5450,10 @@ packages: engines: {node: 20 || >=22} hasBin: true + glob@13.0.0: + resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} + engines: {node: 20 || >=22} + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -3832,6 +5462,10 @@ packages: resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} engines: {node: '>=10.0'} + global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} @@ -3886,6 +5520,10 @@ packages: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -3942,12 +5580,27 @@ packages: hermes-estree@0.25.1: resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + hermes-estree@0.29.1: + resolution: {integrity: sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==} + + hermes-estree@0.32.0: + resolution: {integrity: sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==} + hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + hermes-parser@0.29.1: + resolution: {integrity: sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==} + + hermes-parser@0.32.0: + resolution: {integrity: sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==} + highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hono@4.11.7: resolution: {integrity: sha512-l7qMiNee7t82bH3SeyUCt9UF15EVmaBvsppY2zQtrbIhl/yzBTny+YUxsVjSjQ6gaqaeVtZmGocom8TzBlA4Yw==} engines: {node: '>=16.9.0'} @@ -3956,6 +5609,10 @@ packages: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -4006,6 +5663,9 @@ packages: resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} engines: {node: '>=18.18.0'} + hyphenate-style-name@1.1.0: + resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} + iconv-corefoundation@1.1.7: resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==} engines: {node: ^8.11.2 || >=10} @@ -4030,6 +5690,11 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} + image-size@1.2.1: + resolution: {integrity: sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==} + engines: {node: '>=16.x'} + hasBin: true + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -4045,13 +5710,22 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + inline-style-parser@0.2.7: resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + inline-style-prefixer@7.0.1: + resolution: {integrity: sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==} + internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + ip-address@10.1.0: resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} engines: {node: '>= 12'} @@ -4073,6 +5747,9 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-arrayish@0.3.4: + resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} + is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -4081,6 +5758,10 @@ packages: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + is-boolean-object@1.2.2: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} @@ -4111,6 +5792,11 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -4242,6 +5928,10 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + is-wsl@3.1.0: resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} engines: {node: '>=16'} @@ -4271,6 +5961,10 @@ packages: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + istanbul-lib-report@3.0.1: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} @@ -4299,6 +5993,49 @@ packages: engines: {node: '>=10'} hasBin: true + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jimp-compact@0.16.1: + resolution: {integrity: sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==} + + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -4316,10 +6053,17 @@ packages: js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + hasBin: true + js-yaml@4.1.1: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true + jsc-safe-url@0.2.4: + resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -4389,6 +6133,10 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} + lan-network@0.1.7: + resolution: {integrity: sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==} + hasBin: true + language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -4403,80 +6151,155 @@ packages: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lighthouse-logger@1.4.2: + resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} + lightningcss-android-arm64@1.30.2: resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] + lightningcss-darwin-arm64@1.27.0: + resolution: {integrity: sha512-Gl/lqIXY+d+ySmMbgDf0pgaWSqrWYxVHoc88q+Vhf2YNzZ8DwoRzGt5NZDVqqIW5ScpSnmmjcgXP87Dn2ylSSQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + lightningcss-darwin-arm64@1.30.2: resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] + lightningcss-darwin-x64@1.27.0: + resolution: {integrity: sha512-0+mZa54IlcNAoQS9E0+niovhyjjQWEMrwW0p2sSdLRhLDc8LMQ/b67z7+B5q4VmjYCMSfnFi3djAAQFIDuj/Tg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + lightningcss-darwin-x64@1.30.2: resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] + lightningcss-freebsd-x64@1.27.0: + resolution: {integrity: sha512-n1sEf85fePoU2aDN2PzYjoI8gbBqnmLGEhKq7q0DKLj0UTVmOTwDC7PtLcy/zFxzASTSBlVQYJUhwIStQMIpRA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + lightningcss-freebsd-x64@1.30.2: resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] + lightningcss-linux-arm-gnueabihf@1.27.0: + resolution: {integrity: sha512-MUMRmtdRkOkd5z3h986HOuNBD1c2lq2BSQA1Jg88d9I7bmPGx08bwGcnB75dvr17CwxjxD6XPi3Qh8ArmKFqCA==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + lightningcss-linux-arm-gnueabihf@1.30.2: resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] + lightningcss-linux-arm64-gnu@1.27.0: + resolution: {integrity: sha512-cPsxo1QEWq2sfKkSq2Bq5feQDHdUEwgtA9KaB27J5AX22+l4l0ptgjMZZtYtUnteBofjee+0oW1wQ1guv04a7A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + lightningcss-linux-arm64-gnu@1.30.2: resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + lightningcss-linux-arm64-musl@1.27.0: + resolution: {integrity: sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + lightningcss-linux-arm64-musl@1.30.2: resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + lightningcss-linux-x64-gnu@1.27.0: + resolution: {integrity: sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + lightningcss-linux-x64-gnu@1.30.2: resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + lightningcss-linux-x64-musl@1.27.0: + resolution: {integrity: sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + lightningcss-linux-x64-musl@1.30.2: resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + lightningcss-win32-arm64-msvc@1.27.0: + resolution: {integrity: sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + lightningcss-win32-arm64-msvc@1.30.2: resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] + lightningcss-win32-x64-msvc@1.27.0: + resolution: {integrity: sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + lightningcss-win32-x64-msvc@1.30.2: resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] + lightningcss@1.27.0: + resolution: {integrity: sha512-8f7aNmS1+etYSLHht0fQApPc2kNO8qGRutifN5rVIc6Xo6ABsEbqOr758UwI7ALVbTt4x1fllKt0PYgzD9S3yQ==} + engines: {node: '>= 12.0.0'} + lightningcss@1.30.2: resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} engines: {node: '>= 12.0.0'} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -4496,10 +6319,17 @@ packages: resolution: {integrity: sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==} engines: {node: '>=13.2.0'} + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} @@ -4515,12 +6345,19 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + lodash.union@4.6.0: resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} lodash@4.17.23: resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + log-symbols@2.2.0: + resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} + engines: {node: '>=4'} + log-symbols@6.0.0: resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} engines: {node: '>=18'} @@ -4554,6 +6391,13 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} + lucide-react-native@0.563.0: + resolution: {integrity: sha512-q4tYoAMorTqv+UXRYc0MyiEAOF+4Bu73zxD63EDrnGCFL+xuj+imBm3E2rIKRmME0heVHlK+98fsi8wbL92LNQ==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-native: '*' + react-native-svg: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -4564,6 +6408,9 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} @@ -4572,6 +6419,9 @@ packages: engines: {node: '>= 18'} hasBin: true + marky@1.3.0: + resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} + matcher@3.0.0: resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} engines: {node: '>=10'} @@ -4625,6 +6475,9 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -4633,6 +6486,12 @@ packages: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} + memoize-one@5.2.1: + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + + memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + merge-descriptors@2.0.0: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} @@ -4644,6 +6503,64 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + metro-babel-transformer@0.83.3: + resolution: {integrity: sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==} + engines: {node: '>=20.19.4'} + + metro-cache-key@0.83.3: + resolution: {integrity: sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==} + engines: {node: '>=20.19.4'} + + metro-cache@0.83.3: + resolution: {integrity: sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==} + engines: {node: '>=20.19.4'} + + metro-config@0.83.3: + resolution: {integrity: sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==} + engines: {node: '>=20.19.4'} + + metro-core@0.83.3: + resolution: {integrity: sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==} + engines: {node: '>=20.19.4'} + + metro-file-map@0.83.3: + resolution: {integrity: sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==} + engines: {node: '>=20.19.4'} + + metro-minify-terser@0.83.3: + resolution: {integrity: sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==} + engines: {node: '>=20.19.4'} + + metro-resolver@0.83.3: + resolution: {integrity: sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==} + engines: {node: '>=20.19.4'} + + metro-runtime@0.83.3: + resolution: {integrity: sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==} + engines: {node: '>=20.19.4'} + + metro-source-map@0.83.3: + resolution: {integrity: sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==} + engines: {node: '>=20.19.4'} + + metro-symbolicate@0.83.3: + resolution: {integrity: sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==} + engines: {node: '>=20.19.4'} + hasBin: true + + metro-transform-plugins@0.83.3: + resolution: {integrity: sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==} + engines: {node: '>=20.19.4'} + + metro-transform-worker@0.83.3: + resolution: {integrity: sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==} + engines: {node: '>=20.19.4'} + + metro@0.83.3: + resolution: {integrity: sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==} + engines: {node: '>=20.19.4'} + hasBin: true + micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} @@ -4748,11 +6665,20 @@ packages: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + mime@2.6.0: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} engines: {node: '>=4.0.0'} hasBin: true + mimic-fn@1.2.0: + resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} + engines: {node: '>=4'} + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -4803,6 +6729,10 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -4812,6 +6742,9 @@ packages: engines: {node: '>=10'} hasBin: true + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -4846,6 +6779,12 @@ packages: engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} hasBin: true + nativewind@4.2.1: + resolution: {integrity: sha512-10uUB2Dlli3MH3NDL5nMHqJHz1A3e/E6mzjTj6cl7hHECClJ7HpE6v+xZL+GXdbwQSnWE+UWMIMsNz7yOQkAJQ==} + engines: {node: '>=16'} + peerDependencies: + tailwindcss: '>3.3.0' + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -4853,10 +6792,17 @@ packages: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + negotiator@1.0.0: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} + nested-error-stacks@2.0.1: + resolution: {integrity: sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==} + nestjs-pino@4.5.0: resolution: {integrity: sha512-e54ChJMACSGF8gPYaHsuD07RW7l/OVoV6aI8Hqhpp0ZQ4WA8QY3eewL42JX7Z1U6rV7byNU7bGBV9l6d9V6PDQ==} engines: {node: '>= 14'} @@ -4905,10 +6851,26 @@ packages: engines: {node: '>=10.5.0'} deprecated: Use your platform's native DOMException instead + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + node-fetch@3.3.2: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-forge@1.3.3: + resolution: {integrity: sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==} + engines: {node: '>= 6.13.0'} + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} @@ -4920,6 +6882,10 @@ packages: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} + npm-package-arg@11.0.3: + resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} + engines: {node: ^16.14.0 || >=18.0.0} + npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -4931,6 +6897,13 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + + ob1@0.83.3: + resolution: {integrity: sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==} + engines: {node: '>=20.19.4'} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -4978,13 +6951,25 @@ packages: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} + on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} + on-headers@1.1.0: + resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} + engines: {node: '>= 0.8'} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + onetime@2.0.1: + resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} + engines: {node: '>=4'} + onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} @@ -5003,6 +6988,14 @@ packages: resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} engines: {node: '>=20'} + open@7.4.2: + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + openai@6.10.0: resolution: {integrity: sha512-ITxOGo7rO3XRMiKA5l7tQ43iNNu+iXGFAcf2t+aWVzzqRaS0i7m1K2BhxNdaveB+5eENhO0VY1FkiZzhBk4v3A==} hasBin: true @@ -5019,6 +7012,10 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + ora@3.4.0: + resolution: {integrity: sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==} + engines: {node: '>=6'} + ora@8.2.0: resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} engines: {node: '>=18'} @@ -5034,14 +7031,26 @@ packages: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + pac-proxy-agent@7.2.0: resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} engines: {node: '>= 14'} @@ -5071,6 +7080,10 @@ packages: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} + parse-png@2.1.0: + resolution: {integrity: sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==} + engines: {node: '>=10'} + parse5-htmlparser2-tree-adapter@6.0.1: resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} @@ -5143,10 +7156,18 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@3.0.1: + resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} + engines: {node: '>=10'} + picomatch@4.0.3: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + pino-abstract-transport@3.0.0: resolution: {integrity: sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==} @@ -5164,6 +7185,10 @@ packages: resolution: {integrity: sha512-0GNPNzHXBKw6U/InGe79A3Crzyk9bcSyObF9/Gfo9DLEf5qj5RF50RSjsu0W1rZ6ZqRGdzDFCRBQvi9/rSGPtA==} hasBin: true + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + pkce-challenge@5.0.1: resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} engines: {node: '>=16.20.0'} @@ -5172,18 +7197,63 @@ packages: resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} engines: {node: '>=10.4.0'} + pngjs@3.4.0: + resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} + engines: {node: '>=4.0.0'} + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.1.0: + resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + postcss-selector-parser@7.1.1: resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} engines: {node: '>=4'} + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} @@ -5196,10 +7266,22 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-ms@9.3.0: resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} + proc-log@4.2.0: + resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -5214,6 +7296,12 @@ packages: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} engines: {node: '>=10'} + promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + + promise@8.3.0: + resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -5245,13 +7333,24 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + qrcode-terminal@0.11.0: + resolution: {integrity: sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==} + hasBin: true + qs@6.14.1: resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} engines: {node: '>=0.6'} + query-string@7.1.3: + resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} + engines: {node: '>=6'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} @@ -5267,24 +7366,153 @@ packages: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-devtools-core@6.1.5: + resolution: {integrity: sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==} + + react-dom@19.1.0: + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + peerDependencies: + react: ^19.1.0 + react-dom@19.2.3: resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==} peerDependencies: react: ^19.2.3 + react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + + react-freeze@1.0.4: + resolution: {integrity: sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA==} + engines: {node: '>=10'} + peerDependencies: + react: '>=17.0.0' + react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-is@19.2.4: + resolution: {integrity: sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==} + react-markdown@10.1.0: resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} peerDependencies: '@types/react': '>=18' react: '>=18' + react-native-css-interop@0.2.1: + resolution: {integrity: sha512-B88f5rIymJXmy1sNC/MhTkb3xxBej1KkuAt7TiT9iM7oXz3RM8Bn+7GUrfR02TvSgKm4cg2XiSuLEKYfKwNsjA==} + engines: {node: '>=18'} + peerDependencies: + react: '>=18' + react-native: '*' + react-native-reanimated: '>=3.6.2' + react-native-safe-area-context: '*' + react-native-svg: '*' + tailwindcss: ~3 + peerDependenciesMeta: + react-native-safe-area-context: + optional: true + react-native-svg: + optional: true + + react-native-gesture-handler@2.28.0: + resolution: {integrity: sha512-0msfJ1vRxXKVgTgvL+1ZOoYw3/0z1R+Ked0+udoJhyplC2jbVKIJ8Z1bzWdpQRCV3QcQ87Op0zJVE5DhKK2A0A==} + peerDependencies: + react: '*' + react-native: '*' + + react-native-is-edge-to-edge@1.2.1: + resolution: {integrity: sha512-FLbPWl/MyYQWz+KwqOZsSyj2JmLKglHatd3xLZWskXOpRaio4LfEDEz8E/A6uD8QoTHW6Aobw1jbEwK7KMgR7Q==} + peerDependencies: + react: '*' + react-native: '*' + + react-native-reanimated@4.1.6: + resolution: {integrity: sha512-F+ZJBYiok/6Jzp1re75F/9aLzkgoQCOh4yxrnwATa8392RvM3kx+fiXXFvwcgE59v48lMwd9q0nzF1oJLXpfxQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + react: '*' + react-native: '*' + react-native-worklets: '>=0.5.0' + + react-native-safe-area-context@5.6.2: + resolution: {integrity: sha512-4XGqMNj5qjUTYywJqpdWZ9IG8jgkS3h06sfVjfw5yZQZfWnRFXczi0GnYyFyCc2EBps/qFmoCH8fez//WumdVg==} + peerDependencies: + react: '*' + react-native: '*' + + react-native-screens@4.16.0: + resolution: {integrity: sha512-yIAyh7F/9uWkOzCi1/2FqvNvK6Wb9Y1+Kzn16SuGfN9YFJDTbwlzGRvePCNTOX0recpLQF3kc2FmvMUhyTCH1Q==} + peerDependencies: + react: '*' + react-native: '*' + + react-native-svg@15.15.1: + resolution: {integrity: sha512-ZUD1xwc3Hwo4cOmOLumjJVoc7lEf9oQFlHnLmgccLC19fNm6LVEdtB+Cnip6gEi0PG3wfvVzskViEtrySQP8Fw==} + peerDependencies: + react: '*' + react-native: '*' + + react-native-web@0.21.2: + resolution: {integrity: sha512-SO2t9/17zM4iEnFvlu2DA9jqNbzNhoUP+AItkoCOyFmDMOhUnBBznBDCYN92fGdfAkfQlWzPoez6+zLxFNsZEg==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + react-native-worklets@0.5.1: + resolution: {integrity: sha512-lJG6Uk9YuojjEX/tQrCbcbmpdLCSFxDK1rJlkDhgqkVi1KZzG7cdcBFQRqyNOOzR9Y0CXNuldmtWTGOyM0k0+w==} + peerDependencies: + '@babel/core': ^7.0.0-0 + react: '*' + react-native: '*' + + react-native@0.81.5: + resolution: {integrity: sha512-1w+/oSjEXZjMqsIvmkCRsOc8UBYv163bTWKTI8+1mxztvQPhCRYGTvZ/PL1w16xXHneIj/SLGfxWg2GWN2uexw==} + engines: {node: '>= 20.19.4'} + hasBin: true + peerDependencies: + '@types/react': ^19.1.0 + react: ^19.1.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + react-refresh@0.17.0: resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.2: + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + react-router-dom@7.13.0: resolution: {integrity: sha512-5CO/l5Yahi2SKC6rGZ+HDEjpjkGaG/ncEP7eWFTvFxbHP8yeeI0PxTDjimtpXYlR3b3i9/WIL4VJttPrESIf2g==} engines: {node: '>=20.0.0'} @@ -5302,10 +7530,27 @@ packages: react-dom: optional: true + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react@19.1.0: + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + engines: {node: '>=0.10.0'} + react@19.2.3: resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} engines: {node: '>=0.10.0'} + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + read-config-file@6.3.2: resolution: {integrity: sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==} engines: {node: '>=12.0.0'} @@ -5320,6 +7565,10 @@ packages: readdir-glob@1.1.3: resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + real-require@0.2.0: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} @@ -5335,6 +7584,16 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} + regenerate-unicode-properties@10.2.2: + resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + regex-recursion@6.0.2: resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} @@ -5348,6 +7607,17 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} + regexpu-core@6.4.0: + resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} + engines: {node: '>=4'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.13.0: + resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} + hasBin: true + rehype-raw@7.0.0: resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} @@ -5371,6 +7641,10 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + requireg@0.2.2: + resolution: {integrity: sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==} + engines: {node: '>= 4.0.0'} + reselect@5.1.1: resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} @@ -5381,14 +7655,32 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-global@1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve-workspace-root@2.0.1: + resolution: {integrity: sha512-nR23LHAvaI6aHtMg6RWoaHpdR4D881Nydkzi2CixINyg9T00KgaJdJI6Vwty+Ps8WLxZHuxsS0BseWjxSA4C+w==} + + resolve.exports@2.0.3: + resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} + engines: {node: '>=10'} + resolve@1.22.11: resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} engines: {node: '>= 0.4'} hasBin: true + resolve@1.7.1: + resolution: {integrity: sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==} + resolve@2.0.0-next.5: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true @@ -5396,6 +7688,10 @@ packages: responselike@2.0.1: resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + restore-cursor@2.0.0: + resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} + engines: {node: '>=4'} + restore-cursor@5.1.0: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} @@ -5475,6 +7771,9 @@ packages: resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} engines: {node: '>=11.0.0'} + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} @@ -5488,23 +7787,48 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + semver@7.7.3: resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true + send@0.19.2: + resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} + engines: {node: '>= 0.8.0'} + send@1.2.1: resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} engines: {node: '>= 18'} + serialize-error@2.1.0: + resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} + engines: {node: '>=0.10.0'} + serialize-error@7.0.1: resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} engines: {node: '>=10'} + serve-static@1.16.3: + resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} + engines: {node: '>= 0.8.0'} + serve-static@2.2.1: resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} engines: {node: '>= 18'} + server-only@0.0.1: + resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} + set-cookie-parser@2.7.2: resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} @@ -5520,13 +7844,23 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + sf-symbols-typescript@2.2.0: + resolution: {integrity: sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw==} + engines: {node: '>=10'} + shadcn@3.7.0: resolution: {integrity: sha512-zOXNAIFclguSYmmoibyXyKiYA6qjEJtXDSvloAMziSREW9Q0R/dLqBUYdb81lOejmZkDYuZApGabbMLH7G8qvQ==} hasBin: true + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + sharp@0.34.5: resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -5572,6 +7906,12 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-plist@1.3.1: + resolution: {integrity: sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==} + + simple-swizzle@0.2.4: + resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} + simple-update-notifier@2.0.0: resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} engines: {node: '>=10'} @@ -5587,6 +7927,10 @@ packages: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} + slugify@1.6.6: + resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} + engines: {node: '>=8.0.0'} + smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -5630,6 +7974,10 @@ packages: source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -5637,23 +7985,45 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} stable-hash@0.0.5: resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + + stacktrace-parser@0.1.11: + resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} + engines: {node: '>=6'} + stat-mode@1.0.0: resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} engines: {node: '>= 6'} + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + statuses@2.0.2: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} @@ -5669,6 +8039,10 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} + stream-buffers@2.2.0: + resolution: {integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==} + engines: {node: '>= 0.10.0'} + streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -5676,6 +8050,10 @@ packages: strict-event-emitter@0.5.1: resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -5724,6 +8102,10 @@ packages: resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} engines: {node: '>=14.16'} + strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -5744,6 +8126,10 @@ packages: resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} engines: {node: '>=18'} + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -5759,6 +8145,9 @@ packages: resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==} engines: {node: '>=18'} + structured-headers@0.4.1: + resolution: {integrity: sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==} + style-to-js@1.1.21: resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} @@ -5778,10 +8167,22 @@ packages: babel-plugin-macros: optional: true + styleq@0.1.3: + resolution: {integrity: sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA==} + + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + sumchecker@3.0.1: resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} engines: {node: '>= 8.0'} + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -5790,6 +8191,10 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} + supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -5804,6 +8209,16 @@ packages: tailwind-merge@3.4.0: resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} + tailwindcss-animate@1.0.7: + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + + tailwindcss@3.4.17: + resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} + engines: {node: '>=14.0.0'} + hasBin: true + tailwindcss@4.1.18: resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} @@ -5820,9 +8235,30 @@ packages: engines: {node: '>=10'} deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me + tar@7.5.7: + resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==} + engines: {node: '>=18'} + + temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + temp-file@3.4.0: resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} + terminal-link@2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + + terser@5.46.0: + resolution: {integrity: sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -5837,6 +8273,9 @@ packages: resolution: {integrity: sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==} engines: {node: '>=20'} + throat@5.0.0: + resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -5869,6 +8308,9 @@ packages: resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} engines: {node: '>=14.14'} + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -5885,6 +8327,9 @@ packages: resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} engines: {node: '>=16'} + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -5913,6 +8358,9 @@ packages: peerDependencies: typescript: '>=4.8.4' + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + ts-morph@26.0.0: resolution: {integrity: sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==} @@ -5975,6 +8423,10 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + type-fest@0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} @@ -5983,6 +8435,14 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + type-fest@5.4.2: resolution: {integrity: sha512-FLEenlVYf7Zcd34ISMLo3ZzRE1gRjY1nMDTp+bQRBiPsaKyIW8K3Zr99ioHDUgA9OGuGGJPyYpNcffGmBhJfGg==} engines: {node: '>=20'} @@ -6026,6 +8486,10 @@ packages: engines: {node: '>=14.17'} hasBin: true + ua-parser-js@1.0.41: + resolution: {integrity: sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==} + hasBin: true + uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} @@ -6050,10 +8514,30 @@ packages: undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici@6.23.0: + resolution: {integrity: sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==} + engines: {node: '>=18.17'} + undici@7.19.2: resolution: {integrity: sha512-4VQSpGEGsWzk0VYxyB/wVX/Q7qf9t5znLRgs0dzszr9w9Fej/8RVNQ+S20vdXSAyra/bJ7ZQfGv6ZMj7UEbzSg==} engines: {node: '>=20.18.1'} + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.1: + resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.2.0: + resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} + engines: {node: '>=4'} + unicorn-magic@0.3.0: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} @@ -6061,6 +8545,10 @@ packages: unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} @@ -6103,6 +8591,31 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-latest-callback@0.2.6: + resolution: {integrity: sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg==} + peerDependencies: + react: '>=16.8' + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + use-sync-external-store@1.6.0: resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} peerDependencies: @@ -6114,10 +8627,22 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + uuid@13.0.0: resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} hasBin: true + uuid@7.0.3: + resolution: {integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==} + hasBin: true + + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + validate-npm-package-name@7.0.2: resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==} engines: {node: ^20.17.0 || >=22.9.0} @@ -6126,6 +8651,12 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + vaul@1.1.2: + resolution: {integrity: sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + verror@1.10.1: resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} engines: {node: '>=0.6.0'} @@ -6255,6 +8786,18 @@ packages: jsdom: optional: true + vlq@1.0.1: + resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + warn-once@0.1.1: + resolution: {integrity: sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q==} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -6262,6 +8805,23 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webidl-conversions@5.0.0: + resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} + engines: {node: '>=8'} + + whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + + whatwg-url-without-unicode@8.0.0-3: + resolution: {integrity: sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==} + engines: {node: '>=10'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -6293,6 +8853,9 @@ packages: engines: {node: '>=8'} hasBin: true + wonka@6.3.5: + resolution: {integrity: sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==} + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -6312,6 +8875,33 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + ws@6.2.3: + resolution: {integrity: sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@8.18.3: resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} @@ -6328,6 +8918,18 @@ packages: resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} engines: {node: '>=20'} + xcode@3.0.1: + resolution: {integrity: sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==} + engines: {node: '>=10.0.0'} + + xml2js@0.6.0: + resolution: {integrity: sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==} + engines: {node: '>=4.0.0'} + + xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + xmlbuilder@15.1.1: resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} engines: {node: '>=8.0'} @@ -6350,6 +8952,10 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yaml@2.8.2: resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} engines: {node: '>= 14.6'} @@ -6432,6 +9038,10 @@ snapshots: 7zip-bin@5.2.0: {} + '@0no-co/graphql.web@1.2.0(graphql@16.12.0)': + optionalDependencies: + graphql: 16.12.0 + '@alloc/quick-lru@5.2.0': {} '@antfu/ni@25.0.0': @@ -6922,12 +9532,22 @@ snapshots: '@aws/lambda-invoke-store@0.2.3': {} + '@babel/code-frame@7.10.4': + dependencies: + '@babel/highlight': 7.25.9 + '@babel/code-frame@7.28.6': dependencies: '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/compat-data@7.28.6': {} '@babel/core@7.28.6': @@ -6958,6 +9578,14 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 + '@babel/generator@7.29.0': + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + '@babel/helper-annotate-as-pure@7.27.3': dependencies: '@babel/types': 7.28.6 @@ -6983,19 +9611,37 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.4.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + debug: 4.4.3 + lodash.debounce: 4.0.8 + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color + '@babel/helper-globals@7.28.0': {} '@babel/helper-member-expression-to-functions@7.28.5': dependencies: - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.28.6': dependencies: - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -7004,16 +9650,25 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-module-imports': 7.28.6 '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@babel/helper-plugin-utils@7.28.6': {} + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.28.6 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + '@babel/helper-replace-supers@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -7036,25 +9691,261 @@ snapshots: '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-wrap-function@7.28.6': + dependencies: + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + '@babel/helpers@7.28.6': dependencies: '@babel/template': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 + + '@babel/highlight@7.25.9': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.1.1 '@babel/parser@7.28.6': dependencies: '@babel/types': 7.28.6 + '@babel/parser@7.29.0': + dependencies: + '@babel/types': 7.29.0 + + '@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-decorators': 7.28.6(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-export-default-from@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-decorators@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-export-default-from@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-flow@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-async-generator-functions@7.29.0(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.6) + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-globals': 7.28.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.6) + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/template': 7.28.6 + + '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-flow': 7.28.6(@babel/core@7.28.6) + + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -7063,6 +9954,80 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-named-capturing-groups-regex@7.29.0(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.6) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.6) + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -7073,6 +10038,63 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.28.6) + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-regenerator@7.29.0(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-runtime@7.29.0(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + babel-plugin-polyfill-corejs2: 0.4.15(@babel/core@7.28.6) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.6) + babel-plugin-polyfill-regenerator: 0.6.6(@babel/core@7.28.6) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-spread@7.28.6(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -7084,6 +10106,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/preset-react@7.28.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.28.6) + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + '@babel/preset-typescript@7.28.5(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -7101,7 +10141,7 @@ snapshots: dependencies: '@babel/code-frame': 7.28.6 '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@babel/traverse@7.28.6': dependencies: @@ -7115,11 +10155,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.0 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + '@babel/types@7.28.6': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@base-ui/react@1.1.0(@types/react@19.2.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@babel/runtime': 7.28.6 @@ -7170,6 +10227,10 @@ snapshots: dependencies: '@noble/ciphers': 1.3.0 + '@egjs/hammerjs@2.0.17': + dependencies: + '@types/hammerjs': 2.0.46 + '@electron/asar@3.4.1': dependencies: commander: 5.1.0 @@ -7451,6 +10512,305 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 + '@expo/cli@54.0.23(expo-router@6.0.23)(expo@54.0.33)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))': + dependencies: + '@0no-co/graphql.web': 1.2.0(graphql@16.12.0) + '@expo/code-signing-certificates': 0.0.6 + '@expo/config': 12.0.13 + '@expo/config-plugins': 54.0.4 + '@expo/devcert': 1.2.1 + '@expo/env': 2.0.8 + '@expo/image-utils': 0.8.8 + '@expo/json-file': 10.0.8 + '@expo/metro': 54.2.0 + '@expo/metro-config': 54.0.14(expo@54.0.33) + '@expo/osascript': 2.3.8 + '@expo/package-manager': 1.9.10 + '@expo/plist': 0.4.8 + '@expo/prebuild-config': 54.0.8(expo@54.0.33) + '@expo/schema-utils': 0.1.8 + '@expo/spawn-async': 1.7.2 + '@expo/ws-tunnel': 1.0.6 + '@expo/xcpretty': 4.4.0 + '@react-native/dev-middleware': 0.81.5 + '@urql/core': 5.2.0(graphql@16.12.0) + '@urql/exchange-retry': 1.3.2(@urql/core@5.2.0(graphql@16.12.0)) + accepts: 1.3.8 + arg: 5.0.2 + better-opn: 3.0.2 + bplist-creator: 0.1.0 + bplist-parser: 0.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + compression: 1.8.1 + connect: 3.7.0 + debug: 4.4.3 + env-editor: 0.4.2 + expo: 54.0.33(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-server: 1.0.5 + freeport-async: 2.0.0 + getenv: 2.0.0 + glob: 13.0.0 + lan-network: 0.1.7 + minimatch: 9.0.5 + node-forge: 1.3.3 + npm-package-arg: 11.0.3 + ora: 3.4.0 + picomatch: 3.0.1 + pretty-bytes: 5.6.0 + pretty-format: 29.7.0 + progress: 2.0.3 + prompts: 2.4.2 + qrcode-terminal: 0.11.0 + require-from-string: 2.0.2 + requireg: 0.2.2 + resolve: 1.22.11 + resolve-from: 5.0.0 + resolve.exports: 2.0.3 + semver: 7.7.3 + send: 0.19.2 + slugify: 1.6.6 + source-map-support: 0.5.21 + stacktrace-parser: 0.1.11 + structured-headers: 0.4.1 + tar: 7.5.7 + terminal-link: 2.1.1 + undici: 6.23.0 + wrap-ansi: 7.0.0 + ws: 8.18.3 + optionalDependencies: + expo-router: 6.0.23(w7u2e3gmpia3npio76ytuzityu) + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + transitivePeerDependencies: + - bufferutil + - graphql + - supports-color + - utf-8-validate + + '@expo/code-signing-certificates@0.0.6': + dependencies: + node-forge: 1.3.3 + + '@expo/config-plugins@54.0.4': + dependencies: + '@expo/config-types': 54.0.10 + '@expo/json-file': 10.0.8 + '@expo/plist': 0.4.8 + '@expo/sdk-runtime-versions': 1.0.0 + chalk: 4.1.2 + debug: 4.4.3 + getenv: 2.0.0 + glob: 13.0.0 + resolve-from: 5.0.0 + semver: 7.7.3 + slash: 3.0.0 + slugify: 1.6.6 + xcode: 3.0.1 + xml2js: 0.6.0 + transitivePeerDependencies: + - supports-color + + '@expo/config-types@54.0.10': {} + + '@expo/config@12.0.13': + dependencies: + '@babel/code-frame': 7.10.4 + '@expo/config-plugins': 54.0.4 + '@expo/config-types': 54.0.10 + '@expo/json-file': 10.0.8 + deepmerge: 4.3.1 + getenv: 2.0.0 + glob: 13.0.0 + require-from-string: 2.0.2 + resolve-from: 5.0.0 + resolve-workspace-root: 2.0.1 + semver: 7.7.3 + slugify: 1.6.6 + sucrase: 3.35.1 + transitivePeerDependencies: + - supports-color + + '@expo/devcert@1.2.1': + dependencies: + '@expo/sudo-prompt': 9.3.2 + debug: 3.2.7 + transitivePeerDependencies: + - supports-color + + '@expo/devtools@0.1.8(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + dependencies: + chalk: 4.1.2 + optionalDependencies: + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + + '@expo/env@2.0.8': + dependencies: + chalk: 4.1.2 + debug: 4.4.3 + dotenv: 16.4.7 + dotenv-expand: 11.0.7 + getenv: 2.0.0 + transitivePeerDependencies: + - supports-color + + '@expo/fingerprint@0.15.4': + dependencies: + '@expo/spawn-async': 1.7.2 + arg: 5.0.2 + chalk: 4.1.2 + debug: 4.4.3 + getenv: 2.0.0 + glob: 13.0.0 + ignore: 5.3.2 + minimatch: 9.0.5 + p-limit: 3.1.0 + resolve-from: 5.0.0 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + + '@expo/image-utils@0.8.8': + dependencies: + '@expo/spawn-async': 1.7.2 + chalk: 4.1.2 + getenv: 2.0.0 + jimp-compact: 0.16.1 + parse-png: 2.1.0 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + semver: 7.7.3 + temp-dir: 2.0.0 + unique-string: 2.0.0 + + '@expo/json-file@10.0.8': + dependencies: + '@babel/code-frame': 7.10.4 + json5: 2.2.3 + + '@expo/metro-config@54.0.14(expo@54.0.33)': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/core': 7.28.6 + '@babel/generator': 7.28.6 + '@expo/config': 12.0.13 + '@expo/env': 2.0.8 + '@expo/json-file': 10.0.8 + '@expo/metro': 54.2.0 + '@expo/spawn-async': 1.7.2 + browserslist: 4.28.1 + chalk: 4.1.2 + debug: 4.4.3 + dotenv: 16.4.7 + dotenv-expand: 11.0.7 + getenv: 2.0.0 + glob: 13.0.0 + hermes-parser: 0.29.1 + jsc-safe-url: 0.2.4 + lightningcss: 1.30.2 + minimatch: 9.0.5 + postcss: 8.4.49 + resolve-from: 5.0.0 + optionalDependencies: + expo: 54.0.33(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@expo/metro-runtime@6.1.2(expo@54.0.33)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + dependencies: + anser: 1.4.10 + expo: 54.0.33(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + pretty-format: 29.7.0 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + stacktrace-parser: 0.1.11 + whatwg-fetch: 3.6.20 + optionalDependencies: + react-dom: 19.1.0(react@19.1.0) + + '@expo/metro@54.2.0': + dependencies: + metro: 0.83.3 + metro-babel-transformer: 0.83.3 + metro-cache: 0.83.3 + metro-cache-key: 0.83.3 + metro-config: 0.83.3 + metro-core: 0.83.3 + metro-file-map: 0.83.3 + metro-minify-terser: 0.83.3 + metro-resolver: 0.83.3 + metro-runtime: 0.83.3 + metro-source-map: 0.83.3 + metro-symbolicate: 0.83.3 + metro-transform-plugins: 0.83.3 + metro-transform-worker: 0.83.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@expo/osascript@2.3.8': + dependencies: + '@expo/spawn-async': 1.7.2 + exec-async: 2.2.0 + + '@expo/package-manager@1.9.10': + dependencies: + '@expo/json-file': 10.0.8 + '@expo/spawn-async': 1.7.2 + chalk: 4.1.2 + npm-package-arg: 11.0.3 + ora: 3.4.0 + resolve-workspace-root: 2.0.1 + + '@expo/plist@0.4.8': + dependencies: + '@xmldom/xmldom': 0.8.11 + base64-js: 1.5.1 + xmlbuilder: 15.1.1 + + '@expo/prebuild-config@54.0.8(expo@54.0.33)': + dependencies: + '@expo/config': 12.0.13 + '@expo/config-plugins': 54.0.4 + '@expo/config-types': 54.0.10 + '@expo/image-utils': 0.8.8 + '@expo/json-file': 10.0.8 + '@react-native/normalize-colors': 0.81.5 + debug: 4.4.3 + expo: 54.0.33(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + resolve-from: 5.0.0 + semver: 7.7.3 + xml2js: 0.6.0 + transitivePeerDependencies: + - supports-color + + '@expo/schema-utils@0.1.8': {} + + '@expo/sdk-runtime-versions@1.0.0': {} + + '@expo/spawn-async@1.7.2': + dependencies: + cross-spawn: 7.0.6 + + '@expo/sudo-prompt@9.3.2': {} + + '@expo/vector-icons@15.0.3(expo-font@14.0.11(expo@54.0.33)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + dependencies: + expo-font: 14.0.11(expo@54.0.33)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + + '@expo/ws-tunnel@1.0.6': {} + + '@expo/xcpretty@4.4.0': + dependencies: + '@babel/code-frame': 7.28.6 + chalk: 4.1.2 + js-yaml: 4.1.1 + '@floating-ui/core@1.7.4': dependencies: '@floating-ui/utils': 0.2.10 @@ -7485,6 +10845,12 @@ snapshots: '@hugeicons/core-free-icons@3.1.1': {} + '@hugeicons/react-native@1.0.11(react-native-svg@15.15.1(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + dependencies: + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + react-native-svg: 15.15.1(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@hugeicons/react@1.1.4(react@19.2.3)': dependencies: react: 19.2.3 @@ -7650,6 +11016,75 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@isaacs/ttlcache@1.4.1': {} + + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.2 + resolve-from: 5.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/create-cache-key-function@29.7.0': + dependencies: + '@jest/types': 29.6.3 + + '@jest/environment@29.7.0': + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 25.0.10 + jest-mock: 29.7.0 + + '@jest/fake-timers@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 25.0.10 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/transform@29.7.0': + dependencies: + '@babel/core': 7.28.6 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.31 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.8 + pirates: 4.0.7 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 25.0.10 + '@types/yargs': 17.0.35 + chalk: 4.1.2 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -7662,6 +11097,11 @@ snapshots: '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/sourcemap-codec@1.5.5': {} '@jridgewell/trace-mapping@0.3.31': @@ -7987,6 +11427,410 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@radix-ui/primitive@1.1.3': {} + + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.17)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.17 + '@types/react-dom': 19.2.3(@types/react@19.1.17) + + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.17)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.17 + + '@radix-ui/react-context@1.1.2(@types/react@19.1.17)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.17 + + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0) + aria-hidden: 1.2.6 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-remove-scroll: 2.7.2(@types/react@19.1.17)(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.17 + '@types/react-dom': 19.2.3(@types/react@19.1.17) + + '@radix-ui/react-direction@1.1.1(@types/react@19.1.17)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.17 + + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.17)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.17 + '@types/react-dom': 19.2.3(@types/react@19.1.17) + + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.1.17)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.17 + + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.17)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.17 + '@types/react-dom': 19.2.3(@types/react@19.1.17) + + '@radix-ui/react-id@1.1.1(@types/react@19.1.17)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.17)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.17 + + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.17)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.17 + '@types/react-dom': 19.2.3(@types/react@19.1.17) + + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.17)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.17 + '@types/react-dom': 19.2.3(@types/react@19.1.17) + + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.17)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.17 + '@types/react-dom': 19.2.3(@types/react@19.1.17) + + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.17 + '@types/react-dom': 19.2.3(@types/react@19.1.17) + + '@radix-ui/react-slot@1.2.0(@types/react@19.1.17)(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.17 + + '@radix-ui/react-slot@1.2.3(@types/react@19.1.17)(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.17 + + '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.17 + '@types/react-dom': 19.2.3(@types/react@19.1.17) + + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.17)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.17 + + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.17)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.17)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.17 + + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.17)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.17)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.17 + + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.17)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.17)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.17 + + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.17)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.17 + + '@react-native/assets-registry@0.81.5': {} + + '@react-native/babel-plugin-codegen@0.81.5(@babel/core@7.28.6)': + dependencies: + '@babel/traverse': 7.29.0 + '@react-native/codegen': 0.81.5(@babel/core@7.28.6) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@react-native/babel-preset@0.81.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-export-default-from': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.28.6) + '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.6) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.28.6) + '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.6) + '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.28.6) + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-regenerator': 7.29.0(@babel/core@7.28.6) + '@babel/plugin-transform-runtime': 7.29.0(@babel/core@7.28.6) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.6) + '@babel/template': 7.28.6 + '@react-native/babel-plugin-codegen': 0.81.5(@babel/core@7.28.6) + babel-plugin-syntax-hermes-parser: 0.29.1 + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.28.6) + react-refresh: 0.14.2 + transitivePeerDependencies: + - supports-color + + '@react-native/codegen@0.81.5(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/parser': 7.28.6 + glob: 7.2.3 + hermes-parser: 0.29.1 + invariant: 2.2.4 + nullthrows: 1.1.1 + yargs: 17.7.2 + + '@react-native/community-cli-plugin@0.81.5': + dependencies: + '@react-native/dev-middleware': 0.81.5 + debug: 4.4.3 + invariant: 2.2.4 + metro: 0.83.3 + metro-config: 0.83.3 + metro-core: 0.83.3 + semver: 7.7.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@react-native/debugger-frontend@0.81.5': {} + + '@react-native/dev-middleware@0.81.5': + dependencies: + '@isaacs/ttlcache': 1.4.1 + '@react-native/debugger-frontend': 0.81.5 + chrome-launcher: 0.15.2 + chromium-edge-launcher: 0.2.0 + connect: 3.7.0 + debug: 4.4.3 + invariant: 2.2.4 + nullthrows: 1.1.1 + open: 7.4.2 + serve-static: 1.16.3 + ws: 6.2.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@react-native/gradle-plugin@0.81.5': {} + + '@react-native/js-polyfills@0.81.5': {} + + '@react-native/normalize-colors@0.74.89': {} + + '@react-native/normalize-colors@0.81.5': {} + + '@react-native/virtualized-lists@0.81.5(@types/react@19.1.17)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + dependencies: + invariant: 2.2.4 + nullthrows: 1.1.1 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.17 + + '@react-navigation/bottom-tabs@7.12.0(@react-navigation/native@7.1.28(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + dependencies: + '@react-navigation/elements': 2.9.5(@react-navigation/native@7.1.28(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@react-navigation/native': 7.1.28(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + color: 4.2.3 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native-screens: 4.16.0(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + sf-symbols-typescript: 2.2.0 + transitivePeerDependencies: + - '@react-native-masked-view/masked-view' + + '@react-navigation/core@7.14.0(react@19.1.0)': + dependencies: + '@react-navigation/routers': 7.5.3 + escape-string-regexp: 4.0.0 + fast-deep-equal: 3.1.3 + nanoid: 3.3.11 + query-string: 7.1.3 + react: 19.1.0 + react-is: 19.2.4 + use-latest-callback: 0.2.6(react@19.1.0) + use-sync-external-store: 1.6.0(react@19.1.0) + + '@react-navigation/elements@2.9.5(@react-navigation/native@7.1.28(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + dependencies: + '@react-navigation/native': 7.1.28(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + color: 4.2.3 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + use-latest-callback: 0.2.6(react@19.1.0) + use-sync-external-store: 1.6.0(react@19.1.0) + + '@react-navigation/native-stack@7.12.0(@react-navigation/native@7.1.28(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + dependencies: + '@react-navigation/elements': 2.9.5(@react-navigation/native@7.1.28(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@react-navigation/native': 7.1.28(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + color: 4.2.3 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native-screens: 4.16.0(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + sf-symbols-typescript: 2.2.0 + warn-once: 0.1.1 + transitivePeerDependencies: + - '@react-native-masked-view/masked-view' + + '@react-navigation/native@7.1.28(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + dependencies: + '@react-navigation/core': 7.14.0(react@19.1.0) + escape-string-regexp: 4.0.0 + fast-deep-equal: 3.1.3 + nanoid: 3.3.11 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + use-latest-callback: 0.2.6(react@19.1.0) + + '@react-navigation/routers@7.5.3': + dependencies: + nanoid: 3.3.11 + + '@rn-primitives/portal@1.3.0(@types/react@19.1.17)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(use-sync-external-store@1.6.0(react@19.1.0))': + dependencies: + react: 19.1.0 + zustand: 5.0.10(@types/react@19.1.17)(react@19.1.0)(use-sync-external-store@1.6.0(react@19.1.0)) + optionalDependencies: + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - immer + - use-sync-external-store + + '@rn-primitives/slot@1.2.0(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@rolldown/pluginutils@1.0.0-beta.27': {} '@rollup/rollup-android-arm-eabi@4.57.0': @@ -8103,12 +11947,22 @@ snapshots: '@silvia-odwyer/photon-node@0.3.4': {} + '@sinclair/typebox@0.27.8': {} + '@sinclair/typebox@0.34.48': {} '@sindresorhus/is@4.6.0': {} '@sindresorhus/merge-streams@4.0.0': {} + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 + '@smithy/abort-controller@4.2.8': dependencies: '@smithy/types': 4.12.0 @@ -8494,12 +12348,12 @@ snapshots: postcss: 8.5.6 tailwindcss: 4.1.18 - '@tailwindcss/vite@4.1.18(vite@5.4.21(@types/node@25.0.10)(lightningcss@1.30.2))': + '@tailwindcss/vite@4.1.18(vite@5.4.21(@types/node@25.0.10)(lightningcss@1.30.2)(terser@5.46.0))': dependencies: '@tailwindcss/node': 4.1.18 '@tailwindcss/oxide': 4.1.18 tailwindcss: 4.1.18 - vite: 5.4.21(@types/node@25.0.10)(lightningcss@1.30.2) + vite: 5.4.21(@types/node@25.0.10)(lightningcss@1.30.2)(terser@5.46.0) '@tokenizer/inflate@0.4.1': dependencies: @@ -8535,16 +12389,16 @@ snapshots: '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@types/babel__template@7.4.4': dependencies: '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@types/cacheable-request@6.0.3': dependencies: @@ -8578,12 +12432,28 @@ snapshots: dependencies: '@types/node': 25.0.10 + '@types/graceful-fs@4.1.9': + dependencies: + '@types/node': 25.0.10 + + '@types/hammerjs@2.0.46': {} + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 '@types/http-cache-semantics@4.2.0': {} + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} @@ -8616,10 +12486,19 @@ snapshots: xmlbuilder: 15.1.1 optional: true + '@types/react-dom@19.2.3(@types/react@19.1.17)': + dependencies: + '@types/react': 19.1.17 + optional: true + '@types/react-dom@19.2.3(@types/react@19.2.10)': dependencies: '@types/react': 19.2.10 + '@types/react@19.1.17': + dependencies: + csstype: 3.2.3 + '@types/react@19.2.10': dependencies: csstype: 3.2.3 @@ -8628,6 +12507,8 @@ snapshots: dependencies: '@types/node': 25.0.10 + '@types/stack-utils@2.0.3': {} + '@types/statuses@2.0.6': {} '@types/turndown@5.0.6': {} @@ -8645,6 +12526,12 @@ snapshots: '@types/verror@1.10.11': optional: true + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.35': + dependencies: + '@types/yargs-parser': 21.0.3 + '@types/yauzl@2.10.3': dependencies: '@types/node': 25.0.10 @@ -8883,7 +12770,19 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitejs/plugin-react@4.7.0(vite@5.4.21(@types/node@25.0.10)(lightningcss@1.30.2))': + '@urql/core@5.2.0(graphql@16.12.0)': + dependencies: + '@0no-co/graphql.web': 1.2.0(graphql@16.12.0) + wonka: 6.3.5 + transitivePeerDependencies: + - graphql + + '@urql/exchange-retry@1.3.2(@urql/core@5.2.0(graphql@16.12.0))': + dependencies: + '@urql/core': 5.2.0(graphql@16.12.0) + wonka: 6.3.5 + + '@vitejs/plugin-react@4.7.0(vite@5.4.21(@types/node@25.0.10)(lightningcss@1.30.2)(terser@5.46.0))': dependencies: '@babel/core': 7.28.6 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.6) @@ -8891,11 +12790,11 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 5.4.21(@types/node@25.0.10)(lightningcss@1.30.2) + vite: 5.4.21(@types/node@25.0.10)(lightningcss@1.30.2)(terser@5.46.0) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.7(@types/node@25.0.10)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.7(@types/node@25.0.10)(typescript@5.9.3))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.18 @@ -8907,7 +12806,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.18(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.7(@types/node@25.0.10)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) + vitest: 4.0.18(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.7(@types/node@25.0.10)(typescript@5.9.3))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) '@vitest/expect@4.0.18': dependencies: @@ -8918,14 +12817,14 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.18(msw@2.12.7(@types/node@25.0.10)(typescript@5.9.3))(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.0.18(msw@2.12.7(@types/node@25.0.10)(typescript@5.9.3))(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.12.7(@types/node@25.0.10)(typescript@5.9.3) - vite: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) '@vitest/pretty-format@4.0.18': dependencies: @@ -8951,6 +12850,10 @@ snapshots: '@xmldom/xmldom@0.8.11': {} + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -8997,20 +12900,39 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + anser@1.4.10: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@4.1.1: {} + ansi-regex@5.0.1: {} ansi-regex@6.2.2: {} + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansi-styles@6.2.3: {} ansis@4.2.0: {} any-promise@1.3.0: {} + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + app-builder-bin@4.0.0: {} app-builder-lib@24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3): @@ -9085,8 +13007,18 @@ snapshots: tar-stream: 2.2.0 zip-stream: 4.1.1 + arg@5.0.2: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + argparse@2.0.1: {} + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + aria-query@5.3.2: {} array-buffer-byte-length@1.0.2: @@ -9105,6 +13037,8 @@ snapshots: is-string: 1.1.1 math-intrinsics: 1.1.0 + array-timsort@1.0.3: {} + array-union@2.1.0: {} array.prototype.findlast@1.2.5: @@ -9158,6 +13092,8 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 + asap@2.0.6: {} + assert-plus@1.0.0: optional: true @@ -9186,6 +13122,8 @@ snapshots: async-function@1.0.0: {} + async-limiter@1.0.1: {} + async@3.2.6: {} asynckit@0.4.0: {} @@ -9202,6 +13140,133 @@ snapshots: axobject-query@4.1.0: {} + babel-jest@29.7.0(@babel/core@7.28.6): + dependencies: + '@babel/core': 7.28.6 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.28.6) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@6.1.1: + dependencies: + '@babel/helper-plugin-utils': 7.28.6 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@29.6.3: + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.28.0 + + babel-plugin-polyfill-corejs2@0.4.15(@babel/core@7.28.6): + dependencies: + '@babel/compat-data': 7.28.6 + '@babel/core': 7.28.6 + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.28.6) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.6): + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.28.6) + core-js-compat: 3.48.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.6(@babel/core@7.28.6): + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.28.6) + transitivePeerDependencies: + - supports-color + + babel-plugin-react-compiler@1.0.0: + dependencies: + '@babel/types': 7.28.6 + + babel-plugin-react-native-web@0.21.2: {} + + babel-plugin-syntax-hermes-parser@0.29.1: + dependencies: + hermes-parser: 0.29.1 + + babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.28.6): + dependencies: + '@babel/plugin-syntax-flow': 7.28.6(@babel/core@7.28.6) + transitivePeerDependencies: + - '@babel/core' + + babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.6): + dependencies: + '@babel/core': 7.28.6 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.6) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.6) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.6) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.6) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.6) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.6) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.6) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.6) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.6) + + babel-preset-expo@54.0.10(@babel/core@7.28.6)(@babel/runtime@7.28.6)(expo@54.0.33)(react-refresh@0.14.2): + dependencies: + '@babel/helper-module-imports': 7.28.6 + '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.28.6) + '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-syntax-export-default-from': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.6) + '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-runtime': 7.29.0(@babel/core@7.28.6) + '@babel/preset-react': 7.28.5(@babel/core@7.28.6) + '@babel/preset-typescript': 7.28.5(@babel/core@7.28.6) + '@react-native/babel-preset': 0.81.5(@babel/core@7.28.6) + babel-plugin-react-compiler: 1.0.0 + babel-plugin-react-native-web: 0.21.2 + babel-plugin-syntax-hermes-parser: 0.29.1 + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.28.6) + debug: 4.4.3 + react-refresh: 0.14.2 + resolve-from: 5.0.0 + optionalDependencies: + '@babel/runtime': 7.28.6 + expo: 54.0.33(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + babel-preset-jest@29.6.3(@babel/core@7.28.6): + dependencies: + '@babel/core': 7.28.6 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.6) + bail@2.0.2: {} balanced-match@1.0.2: {} @@ -9214,8 +13279,16 @@ snapshots: basic-ftp@5.1.0: {} + better-opn@3.0.2: + dependencies: + open: 8.4.2 + + big-integer@1.6.52: {} + bignumber.js@9.3.1: {} + binary-extensions@2.3.0: {} + bl@4.1.0: dependencies: buffer: 5.7.1 @@ -9249,6 +13322,18 @@ snapshots: bowser@2.13.1: {} + bplist-creator@0.1.0: + dependencies: + stream-buffers: 2.2.0 + + bplist-parser@0.3.1: + dependencies: + big-integer: 1.6.52 + + bplist-parser@0.3.2: + dependencies: + big-integer: 1.6.52 + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 @@ -9270,6 +13355,10 @@ snapshots: node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + buffer-crc32@0.2.13: {} buffer-equal-constant-time@1.0.1: {} @@ -9352,12 +13441,24 @@ snapshots: callsites@3.1.0: {} + camelcase-css@2.0.1: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + caniuse-lite@1.0.30001766: {} ccount@2.0.1: {} chai@6.2.2: {} + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -9373,16 +13474,56 @@ snapshots: character-reference-invalid@2.0.1: {} + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + chownr@2.0.0: {} + chownr@3.0.0: {} + + chrome-launcher@0.15.2: + dependencies: + '@types/node': 25.0.10 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + transitivePeerDependencies: + - supports-color + + chromium-edge-launcher@0.2.0: + dependencies: + '@types/node': 25.0.10 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + mkdirp: 1.0.4 + rimraf: 3.0.2 + transitivePeerDependencies: + - supports-color + chromium-pickle-js@0.2.0: {} + ci-info@2.0.0: {} + ci-info@3.9.0: {} class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 + cli-cursor@2.1.0: + dependencies: + restore-cursor: 2.0.0 + cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 @@ -9424,16 +13565,34 @@ snapshots: dependencies: mimic-response: 1.0.1 + clone@1.0.4: {} + clsx@2.1.1: {} code-block-writer@13.0.3: {} + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + color-convert@2.0.1: dependencies: color-name: 1.1.4 + color-name@1.1.3: {} + color-name@1.1.4: {} + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.4 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + colorette@2.0.20: {} combined-stream@1.0.8: @@ -9444,10 +13603,24 @@ snapshots: commander@11.1.0: {} + commander@12.1.0: {} + commander@14.0.2: {} + commander@2.20.3: {} + + commander@4.1.1: {} + commander@5.1.0: {} + commander@7.2.0: {} + + comment-json@4.5.1: + dependencies: + array-timsort: 1.0.3 + core-util-is: 1.0.3 + esprima: 4.0.1 + compare-version@0.1.2: {} compress-commons@4.1.2: @@ -9457,6 +13630,22 @@ snapshots: normalize-path: 3.0.0 readable-stream: 3.6.2 + compressible@2.0.18: + dependencies: + mime-db: 1.54.0 + + compression@1.8.1: + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9 + negotiator: 0.6.4 + on-headers: 1.1.0 + safe-buffer: 5.2.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + concat-map@0.0.1: {} concat-stream@2.0.0: @@ -9480,6 +13669,15 @@ snapshots: glob: 10.5.0 typescript: 5.9.3 + connect@3.7.0: + dependencies: + debug: 2.6.9 + finalhandler: 1.1.2 + parseurl: 1.3.3 + utils-merge: 1.0.1 + transitivePeerDependencies: + - supports-color + consola@3.4.2: {} content-disposition@1.0.1: {} @@ -9494,6 +13692,10 @@ snapshots: cookie@1.1.1: {} + core-js-compat@3.48.0: + dependencies: + browserslist: 4.28.1 + core-util-is@1.0.2: optional: true @@ -9530,12 +13732,24 @@ snapshots: buffer: 5.7.1 optional: true + cross-fetch@3.2.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + crypto-random-string@2.0.0: {} + + css-in-js-utils@3.1.0: + dependencies: + hyphenate-style-name: 1.1.0 + css-select@5.2.2: dependencies: boolbase: 1.0.0 @@ -9544,6 +13758,11 @@ snapshots: domutils: 3.2.2 nth-check: 2.1.1 + css-tree@1.1.3: + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + css-what@6.2.2: {} cssesc@3.0.0: {} @@ -9578,6 +13797,10 @@ snapshots: dateformat@4.6.3: {} + debug@2.6.9: + dependencies: + ms: 2.0.0 + debug@3.2.7: dependencies: ms: 2.1.3 @@ -9590,12 +13813,16 @@ snapshots: dependencies: character-entities: 2.0.2 + decode-uri-component@0.2.2: {} + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 dedent@1.7.1: {} + deep-extend@0.6.0: {} + deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -9607,6 +13834,10 @@ snapshots: bundle-name: 4.1.0 default-browser-id: 5.0.1 + defaults@1.0.4: + dependencies: + clone: 1.0.4 + defer-to-connect@2.0.1: {} define-data-property@1.1.4: @@ -9615,6 +13846,8 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + define-lazy-prop@2.0.0: {} + define-lazy-prop@3.0.0: {} define-properties@1.2.1: @@ -9635,8 +13868,14 @@ snapshots: dequal@2.0.3: {} + destroy@1.2.0: {} + + detect-libc@1.0.3: {} + detect-libc@2.1.2: {} + detect-node-es@1.1.0: {} + detect-node@2.1.0: optional: true @@ -9644,6 +13883,8 @@ snapshots: dependencies: dequal: 2.0.3 + didyoumean@1.2.2: {} + diff@8.0.3: {} dir-compare@3.3.0: @@ -9655,6 +13896,8 @@ snapshots: dependencies: path-type: 4.0.0 + dlv@1.1.3: {} + dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3): dependencies: app-builder-lib: 24.13.3(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3) @@ -9707,8 +13950,14 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 + dotenv-expand@11.0.7: + dependencies: + dotenv: 16.4.7 + dotenv-expand@5.1.0: {} + dotenv@16.4.7: {} + dotenv@17.2.3: {} dotenv@9.0.2: {} @@ -9793,6 +14042,8 @@ snapshots: emoji-regex@9.2.2: {} + encodeurl@1.0.2: {} + encodeurl@2.0.0: {} end-of-stream@1.4.5: @@ -9840,6 +14091,8 @@ snapshots: entities@7.0.1: {} + env-editor@0.4.2: {} + env-paths@2.2.1: {} err-code@2.0.3: {} @@ -9848,6 +14101,10 @@ snapshots: dependencies: is-arrayish: 0.2.1 + error-stack-parser@2.1.4: + dependencies: + stackframe: 1.3.4 + es-abstract@1.24.1: dependencies: array-buffer-byte-length: 1.0.2 @@ -10013,6 +14270,10 @@ snapshots: escape-html@1.0.3: {} + escape-string-regexp@1.0.5: {} + + escape-string-regexp@2.0.0: {} + escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} @@ -10025,12 +14286,29 @@ snapshots: optionalDependencies: source-map: 0.6.1 + eslint-config-expo@10.0.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-expo: 1.0.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-react: 7.37.5(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.39.2(jiti@2.6.1)) + globals: 16.4.0 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + - typescript + eslint-config-next@16.1.6(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): dependencies: '@next/eslint-plugin-next': 16.1.6 eslint: 9.39.2(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react: 7.37.5(eslint@9.39.2(jiti@2.6.1)) @@ -10053,7 +14331,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 @@ -10068,17 +14346,26 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)) transitivePeerDependencies: - supports-color + eslint-plugin-expo@1.0.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) + transitivePeerDependencies: + - supports-color + - typescript + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 @@ -10090,7 +14377,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.2(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -10131,6 +14418,10 @@ snapshots: dependencies: eslint: 8.57.1 + eslint-plugin-react-hooks@5.2.0(eslint@9.39.2(jiti@2.6.1)): + dependencies: + eslint: 9.39.2(jiti@2.6.1) + eslint-plugin-react-hooks@7.0.1(eslint@9.39.2(jiti@2.6.1)): dependencies: '@babel/core': 7.28.6 @@ -10300,12 +14591,16 @@ snapshots: etag@1.8.1: {} + event-target-shim@5.0.1: {} + eventsource-parser@3.0.6: {} eventsource@3.0.7: dependencies: eventsource-parser: 3.0.6 + exec-async@2.2.0: {} + execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -10335,6 +14630,195 @@ snapshots: expect-type@1.3.0: {} + expo-asset@12.0.12(expo@54.0.33)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + dependencies: + '@expo/image-utils': 0.8.8 + expo: 54.0.33(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-constants: 18.0.13(expo@54.0.33)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0)) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + transitivePeerDependencies: + - supports-color + + expo-constants@18.0.13(expo@54.0.33)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0)): + dependencies: + '@expo/config': 12.0.13 + '@expo/env': 2.0.8 + expo: 54.0.33(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + transitivePeerDependencies: + - supports-color + + expo-file-system@19.0.21(expo@54.0.33)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0)): + dependencies: + expo: 54.0.33(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + + expo-font@14.0.11(expo@54.0.33)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + dependencies: + expo: 54.0.33(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + fontfaceobserver: 2.3.0 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + + expo-haptics@15.0.8(expo@54.0.33): + dependencies: + expo: 54.0.33(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + + expo-image@3.0.11(expo@54.0.33)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + dependencies: + expo: 54.0.33(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + optionalDependencies: + react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + + expo-keep-awake@15.0.8(expo@54.0.33)(react@19.1.0): + dependencies: + expo: 54.0.33(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react: 19.1.0 + + expo-linking@8.0.11(expo@54.0.33)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + dependencies: + expo-constants: 18.0.13(expo@54.0.33)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0)) + invariant: 2.2.4 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + transitivePeerDependencies: + - expo + - supports-color + + expo-modules-autolinking@3.0.24: + dependencies: + '@expo/spawn-async': 1.7.2 + chalk: 4.1.2 + commander: 7.2.0 + require-from-string: 2.0.2 + resolve-from: 5.0.0 + + expo-modules-core@3.0.29(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + dependencies: + invariant: 2.2.4 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + + expo-router@6.0.23(w7u2e3gmpia3npio76ytuzityu): + dependencies: + '@expo/metro-runtime': 6.1.2(expo@54.0.33)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@expo/schema-utils': 0.1.8 + '@radix-ui/react-slot': 1.2.0(@types/react@19.1.17)(react@19.1.0) + '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@react-navigation/bottom-tabs': 7.12.0(@react-navigation/native@7.1.28(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@react-navigation/native': 7.1.28(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@react-navigation/native-stack': 7.12.0(@react-navigation/native@7.1.28(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + client-only: 0.0.1 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + expo: 54.0.33(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-constants: 18.0.13(expo@54.0.33)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0)) + expo-linking: 8.0.11(expo@54.0.33)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-server: 1.0.5 + fast-deep-equal: 3.1.3 + invariant: 2.2.4 + nanoid: 3.3.11 + query-string: 7.1.3 + react: 19.1.0 + react-fast-compare: 3.2.2 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + react-native-is-edge-to-edge: 1.2.1(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native-screens: 4.16.0(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + semver: 7.6.3 + server-only: 0.0.1 + sf-symbols-typescript: 2.2.0 + shallowequal: 1.1.0 + use-latest-callback: 0.2.6(react@19.1.0) + vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + optionalDependencies: + react-dom: 19.1.0(react@19.1.0) + react-native-gesture-handler: 2.28.0(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native-reanimated: 4.1.6(@babel/core@7.28.6)(react-native-worklets@0.5.1(@babel/core@7.28.6)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + transitivePeerDependencies: + - '@react-native-masked-view/masked-view' + - '@types/react' + - '@types/react-dom' + - supports-color + + expo-server@1.0.5: {} + + expo-splash-screen@31.0.13(expo@54.0.33): + dependencies: + '@expo/prebuild-config': 54.0.8(expo@54.0.33) + expo: 54.0.33(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + transitivePeerDependencies: + - supports-color + + expo-status-bar@3.0.9(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + react-native-is-edge-to-edge: 1.2.1(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + + expo-symbols@1.0.8(expo@54.0.33)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0)): + dependencies: + expo: 54.0.33(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + sf-symbols-typescript: 2.2.0 + + expo-system-ui@6.0.9(expo@54.0.33)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0)): + dependencies: + '@react-native/normalize-colors': 0.81.5 + debug: 4.4.3 + expo: 54.0.33(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + optionalDependencies: + react-native-web: 0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + transitivePeerDependencies: + - supports-color + + expo-web-browser@15.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0)): + dependencies: + expo: 54.0.33(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + + expo@54.0.33(@babel/core@7.28.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + dependencies: + '@babel/runtime': 7.28.6 + '@expo/cli': 54.0.23(expo-router@6.0.23)(expo@54.0.33)(graphql@16.12.0)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0)) + '@expo/config': 12.0.13 + '@expo/config-plugins': 54.0.4 + '@expo/devtools': 0.1.8(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@expo/fingerprint': 0.15.4 + '@expo/metro': 54.2.0 + '@expo/metro-config': 54.0.14(expo@54.0.33) + '@expo/vector-icons': 15.0.3(expo-font@14.0.11(expo@54.0.33)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@ungap/structured-clone': 1.3.0 + babel-preset-expo: 54.0.10(@babel/core@7.28.6)(@babel/runtime@7.28.6)(expo@54.0.33)(react-refresh@0.14.2) + expo-asset: 12.0.12(expo@54.0.33)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-constants: 18.0.13(expo@54.0.33)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0)) + expo-file-system: 19.0.21(expo@54.0.33)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0)) + expo-font: 14.0.11(expo@54.0.33)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-keep-awake: 15.0.8(expo@54.0.33)(react@19.1.0) + expo-modules-autolinking: 3.0.24 + expo-modules-core: 3.0.29(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + pretty-format: 29.7.0 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + react-refresh: 0.14.2 + whatwg-url-without-unicode: 8.0.0-3 + optionalDependencies: + '@expo/metro-runtime': 6.1.2(expo@54.0.33)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + transitivePeerDependencies: + - '@babel/core' + - bufferutil + - expo-router + - graphql + - supports-color + - utf-8-validate + + exponential-backoff@3.1.3: {} + express-rate-limit@7.5.1(express@5.2.1): dependencies: express: 5.2.1 @@ -10423,6 +14907,24 @@ snapshots: dependencies: reusify: 1.1.0 + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + + fbjs-css-vars@1.0.2: {} + + fbjs@3.0.5: + dependencies: + cross-fetch: 3.2.0 + fbjs-css-vars: 1.0.2 + loose-envify: 1.4.0 + object-assign: 4.1.1 + promise: 7.3.1 + setimmediate: 1.0.5 + ua-parser-js: 1.0.41 + transitivePeerDependencies: + - encoding + fd-slicer@1.1.0: dependencies: pend: 1.2.0 @@ -10465,6 +14967,20 @@ snapshots: dependencies: to-regex-range: 5.0.1 + filter-obj@1.1.0: {} + + finalhandler@1.1.2: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + finalhandler@2.1.1: dependencies: debug: 4.4.3 @@ -10476,6 +14992,11 @@ snapshots: transitivePeerDependencies: - supports-color + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -10494,6 +15015,10 @@ snapshots: flatted@3.3.3: {} + flow-enums-runtime@0.0.6: {} + + fontfaceobserver@2.3.0: {} + for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -10517,6 +15042,10 @@ snapshots: forwarded@0.2.0: {} + freeport-async@2.0.0: {} + + fresh@0.5.2: {} + fresh@2.0.0: {} fs-constants@1.0.0: {} @@ -10610,8 +15139,12 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 + get-nonce@1.0.1: {} + get-own-enumerable-keys@1.0.0: {} + get-package-type@0.1.0: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -10646,6 +15179,8 @@ snapshots: transitivePeerDependencies: - supports-color + getenv@2.0.0: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -10672,6 +15207,12 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 2.0.1 + glob@13.0.0: + dependencies: + minimatch: 10.1.1 + minipass: 7.1.2 + path-scurry: 2.0.1 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -10691,6 +15232,10 @@ snapshots: serialize-error: 7.0.1 optional: true + global-dirs@0.1.1: + dependencies: + ini: 1.3.8 + globals@13.24.0: dependencies: type-fest: 0.20.2 @@ -10758,6 +15303,8 @@ snapshots: has-bigints@1.1.0: {} + has-flag@3.0.0: {} + has-flag@4.0.0: {} has-property-descriptors@1.0.2: @@ -10871,18 +15418,38 @@ snapshots: hermes-estree@0.25.1: {} + hermes-estree@0.29.1: {} + + hermes-estree@0.32.0: {} + hermes-parser@0.25.1: dependencies: hermes-estree: 0.25.1 + hermes-parser@0.29.1: + dependencies: + hermes-estree: 0.29.1 + + hermes-parser@0.32.0: + dependencies: + hermes-estree: 0.32.0 + highlight.js@10.7.3: {} + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + hono@4.11.7: {} hosted-git-info@4.1.0: dependencies: lru-cache: 6.0.0 + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.4.3 + html-escaper@2.0.2: {} html-escaper@3.0.3: {} @@ -10946,6 +15513,8 @@ snapshots: human-signals@8.0.1: {} + hyphenate-style-name@1.1.0: {} + iconv-corefoundation@1.1.7: dependencies: cli-truncate: 2.1.0 @@ -10966,6 +15535,10 @@ snapshots: ignore@7.0.5: {} + image-size@1.2.1: + dependencies: + queue: 6.0.2 + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -10980,14 +15553,24 @@ snapshots: inherits@2.0.4: {} + ini@1.3.8: {} + inline-style-parser@0.2.7: {} + inline-style-prefixer@7.0.1: + dependencies: + css-in-js-utils: 3.1.0 + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.1.0 + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + ip-address@10.1.0: {} ipaddr.js@1.9.1: {} @@ -11007,6 +15590,8 @@ snapshots: is-arrayish@0.2.1: {} + is-arrayish@0.3.4: {} + is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -11019,6 +15604,10 @@ snapshots: dependencies: has-bigints: 1.1.0 + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + is-boolean-object@1.2.2: dependencies: call-bound: 1.0.4 @@ -11051,6 +15640,8 @@ snapshots: is-decimal@2.0.1: {} + is-docker@2.2.1: {} + is-docker@3.0.0: {} is-extglob@2.1.1: {} @@ -11153,6 +15744,10 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + is-wsl@3.1.0: dependencies: is-inside-container: 1.0.0 @@ -11171,6 +15766,16 @@ snapshots: istanbul-lib-coverage@3.2.2: {} + istanbul-lib-instrument@5.2.1: + dependencies: + '@babel/core': 7.28.6 + '@babel/parser': 7.28.6 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + istanbul-lib-report@3.0.1: dependencies: istanbul-lib-coverage: 3.2.2 @@ -11209,6 +15814,82 @@ snapshots: filelist: 1.0.4 picocolors: 1.1.1 + jest-environment-node@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 25.0.10 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-haste-map@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 25.0.10 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.8 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + jest-message-util@29.7.0: + dependencies: + '@babel/code-frame': 7.29.0 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 25.0.10 + jest-util: 29.7.0 + + jest-regex-util@29.6.3: {} + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 25.0.10 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + jest-validate@29.7.0: + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + + jest-worker@29.7.0: + dependencies: + '@types/node': 25.0.10 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jimp-compact@0.16.1: {} + + jiti@1.21.7: {} + jiti@2.6.1: {} jose@6.1.3: {} @@ -11219,10 +15900,17 @@ snapshots: js-tokens@9.0.1: {} + js-yaml@3.14.2: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + js-yaml@4.1.1: dependencies: argparse: 2.0.1 + jsc-safe-url@0.2.4: {} + jsesc@3.1.0: {} json-bigint@1.0.0: @@ -11291,6 +15979,8 @@ snapshots: kleur@4.1.5: {} + lan-network@0.1.7: {} + language-subtag-registry@0.3.23: {} language-tags@1.0.9: @@ -11303,44 +15993,98 @@ snapshots: dependencies: readable-stream: 2.3.8 + leven@3.1.0: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 + lighthouse-logger@1.4.2: + dependencies: + debug: 2.6.9 + marky: 1.3.0 + transitivePeerDependencies: + - supports-color + lightningcss-android-arm64@1.30.2: optional: true + lightningcss-darwin-arm64@1.27.0: + optional: true + lightningcss-darwin-arm64@1.30.2: optional: true + lightningcss-darwin-x64@1.27.0: + optional: true + lightningcss-darwin-x64@1.30.2: optional: true + lightningcss-freebsd-x64@1.27.0: + optional: true + lightningcss-freebsd-x64@1.30.2: optional: true + lightningcss-linux-arm-gnueabihf@1.27.0: + optional: true + lightningcss-linux-arm-gnueabihf@1.30.2: optional: true + lightningcss-linux-arm64-gnu@1.27.0: + optional: true + lightningcss-linux-arm64-gnu@1.30.2: optional: true + lightningcss-linux-arm64-musl@1.27.0: + optional: true + lightningcss-linux-arm64-musl@1.30.2: optional: true + lightningcss-linux-x64-gnu@1.27.0: + optional: true + lightningcss-linux-x64-gnu@1.30.2: optional: true + lightningcss-linux-x64-musl@1.27.0: + optional: true + lightningcss-linux-x64-musl@1.30.2: optional: true + lightningcss-win32-arm64-msvc@1.27.0: + optional: true + lightningcss-win32-arm64-msvc@1.30.2: optional: true + lightningcss-win32-x64-msvc@1.27.0: + optional: true + lightningcss-win32-x64-msvc@1.30.2: optional: true + lightningcss@1.27.0: + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.27.0 + lightningcss-darwin-x64: 1.27.0 + lightningcss-freebsd-x64: 1.27.0 + lightningcss-linux-arm-gnueabihf: 1.27.0 + lightningcss-linux-arm64-gnu: 1.27.0 + lightningcss-linux-arm64-musl: 1.27.0 + lightningcss-linux-x64-gnu: 1.27.0 + lightningcss-linux-x64-musl: 1.27.0 + lightningcss-win32-arm64-msvc: 1.27.0 + lightningcss-win32-x64-msvc: 1.27.0 + lightningcss@1.30.2: dependencies: detect-libc: 2.1.2 @@ -11357,6 +16101,8 @@ snapshots: lightningcss-win32-arm64-msvc: 1.30.2 lightningcss-win32-x64-msvc: 1.30.2 + lilconfig@3.1.3: {} + lines-and-columns@1.2.4: {} linkedom@0.18.12: @@ -11373,10 +16119,16 @@ snapshots: load-esm@1.0.3: {} + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 + lodash.debounce@4.0.8: {} + lodash.defaults@4.2.0: {} lodash.difference@4.5.0: {} @@ -11387,10 +16139,16 @@ snapshots: lodash.merge@4.6.2: {} + lodash.throttle@4.1.1: {} + lodash.union@4.6.0: {} lodash@4.17.23: {} + log-symbols@2.2.0: + dependencies: + chalk: 2.4.2 + log-symbols@6.0.0: dependencies: chalk: 5.6.2 @@ -11418,6 +16176,12 @@ snapshots: lru-cache@7.18.3: {} + lucide-react-native@0.563.0(react-native-svg@15.15.1(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + react-native-svg: 15.15.1(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -11432,10 +16196,16 @@ snapshots: dependencies: semver: 7.7.3 + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + markdown-table@3.0.4: {} marked@15.0.12: {} + marky@1.3.0: {} + matcher@3.0.0: dependencies: escape-string-regexp: 4.0.0 @@ -11596,16 +16366,197 @@ snapshots: dependencies: '@types/mdast': 4.0.4 + mdn-data@2.0.14: {} + media-typer@0.3.0: {} media-typer@1.1.0: {} + memoize-one@5.2.1: {} + + memoize-one@6.0.0: {} + merge-descriptors@2.0.0: {} merge-stream@2.0.0: {} merge2@1.4.1: {} + metro-babel-transformer@0.83.3: + dependencies: + '@babel/core': 7.28.6 + flow-enums-runtime: 0.0.6 + hermes-parser: 0.32.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + metro-cache-key@0.83.3: + dependencies: + flow-enums-runtime: 0.0.6 + + metro-cache@0.83.3: + dependencies: + exponential-backoff: 3.1.3 + flow-enums-runtime: 0.0.6 + https-proxy-agent: 7.0.6 + metro-core: 0.83.3 + transitivePeerDependencies: + - supports-color + + metro-config@0.83.3: + dependencies: + connect: 3.7.0 + flow-enums-runtime: 0.0.6 + jest-validate: 29.7.0 + metro: 0.83.3 + metro-cache: 0.83.3 + metro-core: 0.83.3 + metro-runtime: 0.83.3 + yaml: 2.8.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + metro-core@0.83.3: + dependencies: + flow-enums-runtime: 0.0.6 + lodash.throttle: 4.1.1 + metro-resolver: 0.83.3 + + metro-file-map@0.83.3: + dependencies: + debug: 4.4.3 + fb-watchman: 2.0.2 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + invariant: 2.2.4 + jest-worker: 29.7.0 + micromatch: 4.0.8 + nullthrows: 1.1.1 + walker: 1.0.8 + transitivePeerDependencies: + - supports-color + + metro-minify-terser@0.83.3: + dependencies: + flow-enums-runtime: 0.0.6 + terser: 5.46.0 + + metro-resolver@0.83.3: + dependencies: + flow-enums-runtime: 0.0.6 + + metro-runtime@0.83.3: + dependencies: + '@babel/runtime': 7.28.6 + flow-enums-runtime: 0.0.6 + + metro-source-map@0.83.3: + dependencies: + '@babel/traverse': 7.28.6 + '@babel/traverse--for-generate-function-map': '@babel/traverse@7.29.0' + '@babel/types': 7.28.6 + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-symbolicate: 0.83.3 + nullthrows: 1.1.1 + ob1: 0.83.3 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + metro-symbolicate@0.83.3: + dependencies: + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-source-map: 0.83.3 + nullthrows: 1.1.1 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + + metro-transform-plugins@0.83.3: + dependencies: + '@babel/core': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/template': 7.28.6 + '@babel/traverse': 7.28.6 + flow-enums-runtime: 0.0.6 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + + metro-transform-worker@0.83.3: + dependencies: + '@babel/core': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 + flow-enums-runtime: 0.0.6 + metro: 0.83.3 + metro-babel-transformer: 0.83.3 + metro-cache: 0.83.3 + metro-cache-key: 0.83.3 + metro-minify-terser: 0.83.3 + metro-source-map: 0.83.3 + metro-transform-plugins: 0.83.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + metro@0.83.3: + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/core': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/template': 7.28.6 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 + accepts: 1.3.8 + chalk: 4.1.2 + ci-info: 2.0.0 + connect: 3.7.0 + debug: 4.4.3 + error-stack-parser: 2.1.4 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + hermes-parser: 0.32.0 + image-size: 1.2.1 + invariant: 2.2.4 + jest-worker: 29.7.0 + jsc-safe-url: 0.2.4 + lodash.throttle: 4.1.1 + metro-babel-transformer: 0.83.3 + metro-cache: 0.83.3 + metro-cache-key: 0.83.3 + metro-config: 0.83.3 + metro-core: 0.83.3 + metro-file-map: 0.83.3 + metro-resolver: 0.83.3 + metro-runtime: 0.83.3 + metro-source-map: 0.83.3 + metro-symbolicate: 0.83.3 + metro-transform-plugins: 0.83.3 + metro-transform-worker: 0.83.3 + mime-types: 2.1.35 + nullthrows: 1.1.1 + serialize-error: 2.1.0 + source-map: 0.5.7 + throat: 5.0.0 + ws: 7.5.10 + yargs: 17.7.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.3.0 @@ -11814,8 +16765,12 @@ snapshots: dependencies: mime-db: 1.54.0 + mime@1.6.0: {} + mime@2.6.0: {} + mimic-fn@1.2.0: {} + mimic-fn@2.1.0: {} mimic-function@5.0.1: {} @@ -11855,12 +16810,18 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 + minizlib@3.1.0: + dependencies: + minipass: 7.1.2 + mkdirp@0.5.6: dependencies: minimist: 1.2.8 mkdirp@1.0.4: {} + ms@2.0.0: {} + ms@2.1.3: {} msw@2.12.7(@types/node@25.0.10)(typescript@5.9.3): @@ -11910,12 +16871,30 @@ snapshots: napi-postinstall@0.3.4: {} + nativewind@4.2.1(react-native-reanimated@4.1.6(@babel/core@7.28.6)(react-native-worklets@0.5.1(@babel/core@7.28.6)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-svg@15.15.1(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(tailwindcss@3.4.17): + dependencies: + comment-json: 4.5.1 + debug: 4.4.3 + react-native-css-interop: 0.2.1(react-native-reanimated@4.1.6(@babel/core@7.28.6)(react-native-worklets@0.5.1(@babel/core@7.28.6)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-svg@15.15.1(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(tailwindcss@3.4.17) + tailwindcss: 3.4.17 + transitivePeerDependencies: + - react + - react-native + - react-native-reanimated + - react-native-safe-area-context + - react-native-svg + - supports-color + natural-compare@1.4.0: {} negotiator@0.6.3: {} + negotiator@0.6.4: {} + negotiator@1.0.0: {} + nested-error-stacks@2.0.1: {} + nestjs-pino@4.5.0(@nestjs/common@11.1.12(reflect-metadata@0.2.2)(rxjs@7.8.2))(pino-http@11.0.0)(pino@10.3.0)(rxjs@7.8.2): dependencies: '@nestjs/common': 11.1.12(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -11930,7 +16909,7 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - next@16.1.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + next@16.1.6(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: '@next/env': 16.1.6 '@swc/helpers': 0.5.15 @@ -11949,6 +16928,7 @@ snapshots: '@next/swc-linux-x64-musl': 16.1.6 '@next/swc-win32-arm64-msvc': 16.1.6 '@next/swc-win32-x64-msvc': 16.1.6 + babel-plugin-react-compiler: 1.0.0 sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' @@ -11959,18 +16939,33 @@ snapshots: node-domexception@1.0.0: {} + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + node-fetch@3.3.2: dependencies: data-uri-to-buffer: 4.0.1 fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 + node-forge@1.3.3: {} + + node-int64@0.4.0: {} + node-releases@2.0.27: {} normalize-path@3.0.0: {} normalize-url@6.1.0: {} + npm-package-arg@11.0.3: + dependencies: + hosted-git-info: 7.0.2 + proc-log: 4.2.0 + semver: 7.7.3 + validate-npm-package-name: 5.0.1 + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 @@ -11984,6 +16979,12 @@ snapshots: dependencies: boolbase: 1.0.0 + nullthrows@1.1.1: {} + + ob1@0.83.3: + dependencies: + flow-enums-runtime: 0.0.6 + object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -12034,14 +17035,24 @@ snapshots: on-exit-leak-free@2.1.2: {} + on-finished@2.3.0: + dependencies: + ee-first: 1.1.1 + on-finished@2.4.1: dependencies: ee-first: 1.1.1 + on-headers@1.1.0: {} + once@1.4.0: dependencies: wrappy: 1.0.2 + onetime@2.0.1: + dependencies: + mimic-fn: 1.2.0 + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 @@ -12067,6 +17078,17 @@ snapshots: powershell-utils: 0.1.0 wsl-utils: 0.3.1 + open@7.4.2: + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + openai@6.10.0(ws@8.18.3)(zod@3.25.76): optionalDependencies: ws: 8.18.3 @@ -12081,6 +17103,15 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + ora@3.4.0: + dependencies: + chalk: 2.4.2 + cli-cursor: 2.1.0 + cli-spinners: 2.9.2 + log-symbols: 2.2.0 + strip-ansi: 5.2.0 + wcwidth: 1.0.1 + ora@8.2.0: dependencies: chalk: 5.6.2 @@ -12103,14 +17134,24 @@ snapshots: p-cancelable@2.1.1: {} + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + p-locate@5.0.0: dependencies: p-limit: 3.1.0 + p-try@2.2.0: {} + pac-proxy-agent@7.2.0: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 @@ -12156,6 +17197,10 @@ snapshots: parse-ms@4.0.0: {} + parse-png@2.1.0: + dependencies: + pngjs: 3.4.0 + parse5-htmlparser2-tree-adapter@6.0.1: dependencies: parse5: 6.0.1 @@ -12208,8 +17253,12 @@ snapshots: picomatch@2.3.1: {} + picomatch@3.0.1: {} + picomatch@4.0.3: {} + pify@2.3.0: {} + pino-abstract-transport@3.0.0: dependencies: split2: 4.2.0 @@ -12253,6 +17302,8 @@ snapshots: sonic-boom: 4.2.0 thread-stream: 4.0.0 + pirates@4.0.7: {} + pkce-challenge@5.0.1: {} plist@3.1.0: @@ -12261,19 +17312,58 @@ snapshots: base64-js: 1.5.1 xmlbuilder: 15.1.1 + pngjs@3.4.0: {} + possible-typed-array-names@1.1.0: {} + postcss-import@15.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.11 + + postcss-js@4.1.0(postcss@8.5.6): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.6 + + postcss-load-config@4.0.2(postcss@8.5.6): + dependencies: + lilconfig: 3.1.3 + yaml: 2.8.2 + optionalDependencies: + postcss: 8.5.6 + + postcss-nested@6.2.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + postcss-selector-parser@7.1.1: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 + postcss-value-parser@4.2.0: {} + postcss@8.4.31: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.4.49: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postcss@8.5.6: dependencies: nanoid: 3.3.11 @@ -12284,10 +17374,20 @@ snapshots: prelude-ls@1.2.1: {} + pretty-bytes@5.6.0: {} + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + pretty-ms@9.3.0: dependencies: parse-ms: 4.0.0 + proc-log@4.2.0: {} + process-nextick-args@2.0.1: {} process-warning@5.0.0: {} @@ -12299,6 +17399,14 @@ snapshots: err-code: 2.0.3 retry: 0.12.0 + promise@7.3.1: + dependencies: + asap: 2.0.6 + + promise@8.3.0: + dependencies: + asap: 2.0.6 + prompts@2.4.2: dependencies: kleur: 3.0.3 @@ -12345,12 +17453,25 @@ snapshots: punycode@2.3.1: {} + qrcode-terminal@0.11.0: {} + qs@6.14.1: dependencies: side-channel: 1.1.0 + query-string@7.1.3: + dependencies: + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + queue-microtask@1.2.3: {} + queue@6.0.2: + dependencies: + inherits: 2.0.4 + quick-format-unescaped@4.0.4: {} quick-lru@5.1.1: {} @@ -12364,13 +17485,43 @@ snapshots: iconv-lite: 0.7.2 unpipe: 1.0.0 + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + react-devtools-core@6.1.5: + dependencies: + shell-quote: 1.8.3 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + react-dom@19.1.0(react@19.1.0): + dependencies: + react: 19.1.0 + scheduler: 0.26.0 + react-dom@19.2.3(react@19.2.3): dependencies: react: 19.2.3 scheduler: 0.27.0 + react-fast-compare@3.2.2: {} + + react-freeze@1.0.4(react@19.1.0): + dependencies: + react: 19.1.0 + react-is@16.13.1: {} + react-is@18.3.1: {} + + react-is@19.2.4: {} + react-markdown@10.1.0(@types/react@19.2.10)(react@19.2.3): dependencies: '@types/hast': 3.0.4 @@ -12389,8 +17540,171 @@ snapshots: transitivePeerDependencies: - supports-color + react-native-css-interop@0.2.1(react-native-reanimated@4.1.6(@babel/core@7.28.6)(react-native-worklets@0.5.1(@babel/core@7.28.6)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-svg@15.15.1(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(tailwindcss@3.4.17): + dependencies: + '@babel/helper-module-imports': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + debug: 4.4.3 + lightningcss: 1.27.0 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + react-native-reanimated: 4.1.6(@babel/core@7.28.6)(react-native-worklets@0.5.1(@babel/core@7.28.6)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + semver: 7.7.3 + tailwindcss: 3.4.17 + optionalDependencies: + react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native-svg: 15.15.1(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + transitivePeerDependencies: + - supports-color + + react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + dependencies: + '@egjs/hammerjs': 2.0.17 + hoist-non-react-statics: 3.3.2 + invariant: 2.2.4 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + + react-native-is-edge-to-edge@1.2.1(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + + react-native-reanimated@4.1.6(@babel/core@7.28.6)(react-native-worklets@0.5.1(@babel/core@7.28.6)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + dependencies: + '@babel/core': 7.28.6 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + react-native-is-edge-to-edge: 1.2.1(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react-native-worklets: 0.5.1(@babel/core@7.28.6)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + semver: 7.7.2 + + react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + + react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-freeze: 1.0.4(react@19.1.0) + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + react-native-is-edge-to-edge: 1.2.1(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + warn-once: 0.1.1 + + react-native-svg@15.15.1(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + dependencies: + css-select: 5.2.2 + css-tree: 1.1.3 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + warn-once: 0.1.1 + + react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + '@babel/runtime': 7.28.6 + '@react-native/normalize-colors': 0.74.89 + fbjs: 3.0.5 + inline-style-prefixer: 7.0.1 + memoize-one: 6.0.0 + nullthrows: 1.1.1 + postcss-value-parser: 4.2.0 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + styleq: 0.1.3 + transitivePeerDependencies: + - encoding + + react-native-worklets@0.5.1(@babel/core@7.28.6)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + dependencies: + '@babel/core': 7.28.6 + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.6) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.6) + '@babel/preset-typescript': 7.28.5(@babel/core@7.28.6) + convert-source-map: 2.0.0 + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0) + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + + react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0): + dependencies: + '@jest/create-cache-key-function': 29.7.0 + '@react-native/assets-registry': 0.81.5 + '@react-native/codegen': 0.81.5(@babel/core@7.28.6) + '@react-native/community-cli-plugin': 0.81.5 + '@react-native/gradle-plugin': 0.81.5 + '@react-native/js-polyfills': 0.81.5 + '@react-native/normalize-colors': 0.81.5 + '@react-native/virtualized-lists': 0.81.5(@types/react@19.1.17)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + abort-controller: 3.0.0 + anser: 1.4.10 + ansi-regex: 5.0.1 + babel-jest: 29.7.0(@babel/core@7.28.6) + babel-plugin-syntax-hermes-parser: 0.29.1 + base64-js: 1.5.1 + commander: 12.1.0 + flow-enums-runtime: 0.0.6 + glob: 7.2.3 + invariant: 2.2.4 + jest-environment-node: 29.7.0 + memoize-one: 5.2.1 + metro-runtime: 0.83.3 + metro-source-map: 0.83.3 + nullthrows: 1.1.1 + pretty-format: 29.7.0 + promise: 8.3.0 + react: 19.1.0 + react-devtools-core: 6.1.5 + react-refresh: 0.14.2 + regenerator-runtime: 0.13.11 + scheduler: 0.26.0 + semver: 7.7.3 + stacktrace-parser: 0.1.11 + whatwg-fetch: 3.6.20 + ws: 6.2.3 + yargs: 17.7.2 + optionalDependencies: + '@types/react': 19.1.17 + transitivePeerDependencies: + - '@babel/core' + - '@react-native-community/cli' + - '@react-native/metro-config' + - bufferutil + - supports-color + - utf-8-validate + + react-refresh@0.14.2: {} + react-refresh@0.17.0: {} + react-remove-scroll-bar@2.3.8(@types/react@19.1.17)(react@19.1.0): + dependencies: + react: 19.1.0 + react-style-singleton: 2.2.3(@types/react@19.1.17)(react@19.1.0) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.17 + + react-remove-scroll@2.7.2(@types/react@19.1.17)(react@19.1.0): + dependencies: + react: 19.1.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.1.17)(react@19.1.0) + react-style-singleton: 2.2.3(@types/react@19.1.17)(react@19.1.0) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.1.17)(react@19.1.0) + use-sidecar: 1.1.3(@types/react@19.1.17)(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.17 + react-router-dom@7.13.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: react: 19.2.3 @@ -12405,8 +17719,22 @@ snapshots: optionalDependencies: react-dom: 19.2.3(react@19.2.3) + react-style-singleton@2.2.3(@types/react@19.1.17)(react@19.1.0): + dependencies: + get-nonce: 1.0.1 + react: 19.1.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.17 + + react@19.1.0: {} + react@19.2.3: {} + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + read-config-file@6.3.2: dependencies: config-file-ts: 0.2.6 @@ -12436,6 +17764,10 @@ snapshots: dependencies: minimatch: 5.1.6 + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + real-require@0.2.0: {} recast@0.23.11: @@ -12459,6 +17791,14 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 + regenerate-unicode-properties@10.2.2: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regenerator-runtime@0.13.11: {} + regex-recursion@6.0.2: dependencies: regex-utilities: 2.3.0 @@ -12478,6 +17818,21 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 + regexpu-core@6.4.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.2 + regjsgen: 0.8.0 + regjsparser: 0.13.0 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.1 + + regjsgen@0.8.0: {} + + regjsparser@0.13.0: + dependencies: + jsesc: 3.1.0 + rehype-raw@7.0.0: dependencies: '@types/hast': 3.0.4 @@ -12522,20 +17877,40 @@ snapshots: require-from-string@2.0.2: {} + requireg@0.2.2: + dependencies: + nested-error-stacks: 2.0.1 + rc: 1.2.8 + resolve: 1.7.1 + reselect@5.1.1: {} resolve-alpn@1.2.1: {} resolve-from@4.0.0: {} + resolve-from@5.0.0: {} + + resolve-global@1.0.0: + dependencies: + global-dirs: 0.1.1 + resolve-pkg-maps@1.0.0: {} + resolve-workspace-root@2.0.1: {} + + resolve.exports@2.0.3: {} + resolve@1.22.11: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + resolve@1.7.1: + dependencies: + path-parse: 1.0.7 + resolve@2.0.0-next.5: dependencies: is-core-module: 2.16.1 @@ -12546,6 +17921,11 @@ snapshots: dependencies: lowercase-keys: 2.0.0 + restore-cursor@2.0.0: + dependencies: + onetime: 2.0.1 + signal-exit: 3.0.7 + restore-cursor@5.1.0: dependencies: onetime: 7.0.0 @@ -12659,6 +18039,8 @@ snapshots: sax@1.4.4: {} + scheduler@0.26.0: {} + scheduler@0.27.0: {} secure-json-parse@4.1.0: {} @@ -12668,8 +18050,30 @@ snapshots: semver@6.3.1: {} + semver@7.6.3: {} + + semver@7.7.2: {} + semver@7.7.3: {} + send@0.19.2: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.1 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + send@1.2.1: dependencies: debug: 4.4.3 @@ -12686,11 +18090,22 @@ snapshots: transitivePeerDependencies: - supports-color + serialize-error@2.1.0: {} + serialize-error@7.0.1: dependencies: type-fest: 0.13.1 optional: true + serve-static@1.16.3: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.2 + transitivePeerDependencies: + - supports-color + serve-static@2.2.1: dependencies: encodeurl: 2.0.0 @@ -12700,6 +18115,8 @@ snapshots: transitivePeerDependencies: - supports-color + server-only@0.0.1: {} + set-cookie-parser@2.7.2: {} set-function-length@1.2.2: @@ -12724,8 +18141,12 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 + setimmediate@1.0.5: {} + setprototypeof@1.2.0: {} + sf-symbols-typescript@2.2.0: {} + shadcn@3.7.0(@types/node@25.0.10)(hono@4.11.7)(typescript@5.9.3): dependencies: '@antfu/ni': 25.0.0 @@ -12770,6 +18191,8 @@ snapshots: - supports-color - typescript + shallowequal@1.1.0: {} + sharp@0.34.5: dependencies: '@img/colour': 1.0.0 @@ -12855,6 +18278,16 @@ snapshots: signal-exit@4.1.0: {} + simple-plist@1.3.1: + dependencies: + bplist-creator: 0.1.0 + bplist-parser: 0.3.1 + plist: 3.1.0 + + simple-swizzle@0.2.4: + dependencies: + is-arrayish: 0.3.4 + simple-update-notifier@2.0.0: dependencies: semver: 7.7.3 @@ -12870,6 +18303,8 @@ snapshots: is-fullwidth-code-point: 3.0.0 optional: true + slugify@1.6.6: {} + smart-buffer@4.2.0: {} socket.io-adapter@2.5.6: @@ -12942,21 +18377,39 @@ snapshots: buffer-from: 1.1.2 source-map: 0.6.1 + source-map@0.5.7: {} + source-map@0.6.1: {} space-separated-tokens@2.0.2: {} + split-on-first@1.1.0: {} + split2@4.2.0: {} + sprintf-js@1.0.3: {} + sprintf-js@1.1.3: optional: true stable-hash@0.0.5: {} + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + stackback@0.0.2: {} + stackframe@1.3.4: {} + + stacktrace-parser@0.1.11: + dependencies: + type-fest: 0.7.1 + stat-mode@1.0.0: {} + statuses@1.5.0: {} + statuses@2.0.2: {} std-env@3.10.0: {} @@ -12968,10 +18421,14 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 + stream-buffers@2.2.0: {} + streamsearch@1.1.0: {} strict-event-emitter@0.5.1: {} + strict-uri-encode@2.0.0: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -13059,6 +18516,10 @@ snapshots: is-obj: 3.0.0 is-regexp: 3.1.0 + strip-ansi@5.2.0: + dependencies: + ansi-regex: 4.1.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -13073,6 +18534,8 @@ snapshots: strip-final-newline@4.0.0: {} + strip-json-comments@2.0.1: {} + strip-json-comments@3.1.1: {} strip-json-comments@5.0.3: {} @@ -13083,6 +18546,8 @@ snapshots: dependencies: '@tokenizer/token': 0.3.0 + structured-headers@0.4.1: {} + style-to-js@1.1.21: dependencies: style-to-object: 1.0.14 @@ -13096,12 +18561,28 @@ snapshots: client-only: 0.0.1 react: 19.2.3 + styleq@0.1.3: {} + + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.15 + ts-interface-checker: 0.1.13 + sumchecker@3.0.1: dependencies: debug: 4.4.3 transitivePeerDependencies: - supports-color + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -13110,6 +18591,11 @@ snapshots: dependencies: has-flag: 4.0.0 + supports-hyperlinks@2.3.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + supports-preserve-symlinks-flag@1.0.0: {} tabbable@6.4.0: {} @@ -13118,6 +18604,37 @@ snapshots: tailwind-merge@3.4.0: {} + tailwindcss-animate@1.0.7(tailwindcss@3.4.17): + dependencies: + tailwindcss: 3.4.17 + + tailwindcss@3.4.17: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-import: 15.1.0(postcss@8.5.6) + postcss-js: 4.1.0(postcss@8.5.6) + postcss-load-config: 4.0.2(postcss@8.5.6) + postcss-nested: 6.2.0(postcss@8.5.6) + postcss-selector-parser: 6.1.2 + resolve: 1.22.11 + sucrase: 3.35.1 + transitivePeerDependencies: + - ts-node + tailwindcss@4.1.18: {} tapable@2.3.0: {} @@ -13139,11 +18656,39 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 + tar@7.5.7: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + + temp-dir@2.0.0: {} + temp-file@3.4.0: dependencies: async-exit-hook: 2.0.1 fs-extra: 10.1.0 + terminal-link@2.1.1: + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.3.0 + + terser@5.46.0: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.15.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + text-table@0.2.0: {} thenify-all@1.6.0: @@ -13158,6 +18703,8 @@ snapshots: dependencies: real-require: 0.2.0 + throat@5.0.0: {} + tiny-invariant@1.3.3: {} tinybench@2.9.0: {} @@ -13183,6 +18730,8 @@ snapshots: tmp@0.2.5: {} + tmpl@1.0.5: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -13199,6 +18748,8 @@ snapshots: dependencies: tldts: 7.0.19 + tr46@0.0.3: {} + tree-kill@1.2.2: {} trim-lines@3.0.1: {} @@ -13219,6 +18770,8 @@ snapshots: dependencies: typescript: 5.9.3 + ts-interface-checker@0.1.13: {} + ts-morph@26.0.0: dependencies: '@ts-morph/common': 0.27.0 @@ -13283,11 +18836,17 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-detect@4.0.8: {} + type-fest@0.13.1: optional: true type-fest@0.20.2: {} + type-fest@0.21.3: {} + + type-fest@0.7.1: {} + type-fest@5.4.2: dependencies: tagged-tag: 1.0.0 @@ -13351,6 +18910,8 @@ snapshots: typescript@5.9.3: {} + ua-parser-js@1.0.41: {} + uc.micro@2.1.0: {} uhyphen@0.2.0: {} @@ -13372,8 +18933,21 @@ snapshots: undici-types@7.16.0: {} + undici@6.23.0: {} + undici@7.19.2: {} + unicode-canonical-property-names-ecmascript@2.0.1: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.2.0 + + unicode-match-property-value-ecmascript@2.2.1: {} + + unicode-property-aliases-ecmascript@2.2.0: {} + unicorn-magic@0.3.0: {} unified@11.0.5: @@ -13386,6 +18960,10 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 + unique-string@2.0.0: + dependencies: + crypto-random-string: 2.0.0 + unist-util-is@6.0.1: dependencies: '@types/unist': 3.0.3 @@ -13451,6 +19029,29 @@ snapshots: dependencies: punycode: 2.3.1 + use-callback-ref@1.3.3(@types/react@19.1.17)(react@19.1.0): + dependencies: + react: 19.1.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.17 + + use-latest-callback@0.2.6(react@19.1.0): + dependencies: + react: 19.1.0 + + use-sidecar@1.1.3(@types/react@19.1.17)(react@19.1.0): + dependencies: + detect-node-es: 1.1.0 + react: 19.1.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.17 + + use-sync-external-store@1.6.0(react@19.1.0): + dependencies: + react: 19.1.0 + use-sync-external-store@1.6.0(react@19.2.3): dependencies: react: 19.2.3 @@ -13459,12 +19060,27 @@ snapshots: util-deprecate@1.0.2: {} + utils-merge@1.0.1: {} + uuid@13.0.0: {} + uuid@7.0.3: {} + + validate-npm-package-name@5.0.1: {} + validate-npm-package-name@7.0.2: {} vary@1.1.2: {} + vaul@1.1.2(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + verror@1.10.1: dependencies: assert-plus: 1.0.0 @@ -13493,7 +19109,7 @@ snapshots: optionalDependencies: vite-plugin-electron-renderer: 0.14.6 - vite@5.4.21(@types/node@25.0.10)(lightningcss@1.30.2): + vite@5.4.21(@types/node@25.0.10)(lightningcss@1.30.2)(terser@5.46.0): dependencies: esbuild: 0.21.5 postcss: 8.5.6 @@ -13502,8 +19118,9 @@ snapshots: '@types/node': 25.0.10 fsevents: 2.3.3 lightningcss: 1.30.2 + terser: 5.46.0 - vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): + vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) @@ -13516,13 +19133,14 @@ snapshots: fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 + terser: 5.46.0 tsx: 4.21.0 yaml: 2.8.2 - vitest@4.0.18(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.7(@types/node@25.0.10)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2): + vitest@4.0.18(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.7(@types/node@25.0.10)(typescript@5.9.3))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(msw@2.12.7(@types/node@25.0.10)(typescript@5.9.3))(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 4.0.18(msw@2.12.7(@types/node@25.0.10)(typescript@5.9.3))(vite@7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -13539,7 +19157,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 25.0.10 @@ -13556,10 +19174,39 @@ snapshots: - tsx - yaml + vlq@1.0.1: {} + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + warn-once@0.1.1: {} + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + web-namespaces@2.0.1: {} web-streams-polyfill@3.3.3: {} + webidl-conversions@3.0.1: {} + + webidl-conversions@5.0.0: {} + + whatwg-fetch@3.6.20: {} + + whatwg-url-without-unicode@8.0.0-3: + dependencies: + buffer: 5.7.1 + punycode: 2.3.1 + webidl-conversions: 5.0.0 + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -13614,6 +19261,8 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + wonka@6.3.5: {} + word-wrap@1.2.5: {} wrap-ansi@6.2.0: @@ -13636,6 +19285,17 @@ snapshots: wrappy@1.0.2: {} + write-file-atomic@4.0.2: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + + ws@6.2.3: + dependencies: + async-limiter: 1.0.1 + + ws@7.5.10: {} + ws@8.18.3: {} wsl-utils@0.3.1: @@ -13643,6 +19303,18 @@ snapshots: is-wsl: 3.1.0 powershell-utils: 0.1.0 + xcode@3.0.1: + dependencies: + simple-plist: 1.3.1 + uuid: 7.0.3 + + xml2js@0.6.0: + dependencies: + sax: 1.4.4 + xmlbuilder: 11.0.1 + + xmlbuilder@11.0.1: {} + xmlbuilder@15.1.1: {} xmlhttprequest-ssl@2.1.2: {} @@ -13655,6 +19327,8 @@ snapshots: yallist@4.0.0: {} + yallist@5.0.0: {} + yaml@2.8.2: {} yargs-parser@20.2.9: {} @@ -13710,6 +19384,12 @@ snapshots: zod@4.3.6: {} + zustand@5.0.10(@types/react@19.1.17)(react@19.1.0)(use-sync-external-store@1.6.0(react@19.1.0)): + optionalDependencies: + '@types/react': 19.1.17 + react: 19.1.0 + use-sync-external-store: 1.6.0(react@19.1.0) + zustand@5.0.10(@types/react@19.2.10)(react@19.2.3)(use-sync-external-store@1.6.0(react@19.2.3)): optionalDependencies: '@types/react': 19.2.10 From 85f71e0084f7e6701377c50db00028f158811b12 Mon Sep 17 00:00:00 2001 From: yushen Date: Tue, 3 Feb 2026 16:48:49 +0800 Subject: [PATCH 04/25] feat(agent): add subagent orchestration core Implement subagent registry, persistence store, and announcement flow for child agent lifecycle management. Includes types, registry with auto-archive sweeper, session JSONL reading for result extraction, and formatted announcement message delivery. Co-Authored-By: Claude Opus 4.5 --- src/agent/subagent/announce.test.ts | 127 +++++++++ src/agent/subagent/announce.ts | 226 +++++++++++++++ src/agent/subagent/index.ts | 37 +++ src/agent/subagent/registry-store.test.ts | 81 ++++++ src/agent/subagent/registry-store.ts | 61 ++++ src/agent/subagent/registry.ts | 321 ++++++++++++++++++++++ src/agent/subagent/types.ts | 74 +++++ 7 files changed, 927 insertions(+) create mode 100644 src/agent/subagent/announce.test.ts create mode 100644 src/agent/subagent/announce.ts create mode 100644 src/agent/subagent/index.ts create mode 100644 src/agent/subagent/registry-store.test.ts create mode 100644 src/agent/subagent/registry-store.ts create mode 100644 src/agent/subagent/registry.ts create mode 100644 src/agent/subagent/types.ts diff --git a/src/agent/subagent/announce.test.ts b/src/agent/subagent/announce.test.ts new file mode 100644 index 00000000..8f1a7140 --- /dev/null +++ b/src/agent/subagent/announce.test.ts @@ -0,0 +1,127 @@ +import { describe, it, expect } from "vitest"; +import { buildSubagentSystemPrompt, formatAnnouncementMessage } from "./announce.js"; +import type { FormatAnnouncementParams } from "./announce.js"; + +describe("buildSubagentSystemPrompt", () => { + it("includes task and session context", () => { + const prompt = buildSubagentSystemPrompt({ + requesterSessionId: "parent-123", + childSessionId: "child-456", + task: "Analyze the auth module for security issues", + }); + + expect(prompt).toContain("You are a subagent spawned to complete a specific task"); + expect(prompt).toContain("Analyze the auth module for security issues"); + expect(prompt).toContain("parent-123"); + expect(prompt).toContain("child-456"); + expect(prompt).toContain("Do NOT spawn nested subagents"); + }); + + it("includes label when provided", () => { + const prompt = buildSubagentSystemPrompt({ + requesterSessionId: "parent-123", + childSessionId: "child-456", + label: "Security Audit", + task: "Check for vulnerabilities", + }); + + expect(prompt).toContain('Label: "Security Audit"'); + }); + + it("omits label line when not provided", () => { + const prompt = buildSubagentSystemPrompt({ + requesterSessionId: "parent-123", + childSessionId: "child-456", + task: "Do something", + }); + + expect(prompt).not.toContain("Label:"); + }); +}); + +describe("formatAnnouncementMessage", () => { + const baseParams: FormatAnnouncementParams = { + runId: "run-1", + childSessionId: "child-456", + requesterSessionId: "parent-123", + task: "Analyze code", + label: "Code Analysis", + cleanup: "delete", + outcome: { status: "ok" }, + startedAt: 1000000, + endedAt: 1030000, + }; + + it("formats successful completion", () => { + const msg = formatAnnouncementMessage({ + ...baseParams, + findings: "Found 3 issues in the auth module.", + }); + + expect(msg).toContain('"Code Analysis" just completed successfully'); + expect(msg).toContain("Found 3 issues in the auth module."); + expect(msg).toContain("runtime 30s"); + expect(msg).toContain("session child-456"); + }); + + it("formats error outcome", () => { + const msg = formatAnnouncementMessage({ + ...baseParams, + outcome: { status: "error", error: "API key expired" }, + }); + + expect(msg).toContain("failed: API key expired"); + }); + + it("formats timeout outcome", () => { + const msg = formatAnnouncementMessage({ + ...baseParams, + outcome: { status: "timeout" }, + }); + + expect(msg).toContain("timed out"); + }); + + it("shows (no output) when findings is not provided", () => { + const msg = formatAnnouncementMessage(baseParams); + + expect(msg).toContain("(no output)"); + }); + + it("uses task text when label is not provided", () => { + const paramsNoLabel: FormatAnnouncementParams = { + ...baseParams, + label: undefined, + }; + const msg = formatAnnouncementMessage(paramsNoLabel); + + expect(msg).toContain('"Analyze code"'); + }); + + it("formats runtime for minutes", () => { + const msg = formatAnnouncementMessage({ + ...baseParams, + startedAt: 1000000, + endedAt: 1150000, // 150 seconds = 2m30s + }); + + expect(msg).toContain("runtime 2m30s"); + }); + + it("formats runtime for hours", () => { + const msg = formatAnnouncementMessage({ + ...baseParams, + startedAt: 1000000, + endedAt: 4600000, // 3600 seconds = 1h + }); + + expect(msg).toContain("runtime 1h"); + }); + + it("includes summarization instruction", () => { + const msg = formatAnnouncementMessage(baseParams); + + expect(msg).toContain("Summarize this naturally for the user"); + expect(msg).toContain("NO_REPLY"); + }); +}); diff --git a/src/agent/subagent/announce.ts b/src/agent/subagent/announce.ts new file mode 100644 index 00000000..e5d06c51 --- /dev/null +++ b/src/agent/subagent/announce.ts @@ -0,0 +1,226 @@ +/** + * Subagent announcement flow. + * + * Handles result propagation from child → parent agent: + * - Builds system prompts for child agents + * - Reads child session output + * - Formats and delivers announcement messages + */ + +import { readEntries } from "../session/storage.js"; +import { getHub } from "../../hub/hub-singleton.js"; +import type { + SubagentAnnounceParams, + SubagentRunOutcome, + SubagentSystemPromptParams, +} from "./types.js"; + +/** + * Build the system prompt injected into a subagent session. + */ +export function buildSubagentSystemPrompt(params: SubagentSystemPromptParams): string { + const { requesterSessionId, childSessionId, label, task } = params; + + const lines: string[] = [ + "You are a subagent spawned to complete a specific task.", + "", + "## Rules", + "- Stay focused on the assigned task below.", + "- Complete the task thoroughly and report your findings.", + "- Do NOT initiate side actions unrelated to the task.", + "- Do NOT attempt to communicate with the user directly.", + "- Do NOT spawn nested subagents.", + "- Your session is ephemeral and will be cleaned up after completion.", + "", + "## Context", + `Requester session: ${requesterSessionId}`, + `Child session: ${childSessionId}`, + ]; + + if (label) { + lines.push(`Label: "${label}"`); + } + + lines.push("", "## Task", task); + + return lines.join("\n"); +} + +/** + * Read the latest assistant reply from a session's JSONL file. + */ +export function readLatestAssistantReply(sessionId: string): string | undefined { + const entries = readEntries(sessionId); + + // Walk backwards to find last assistant message + for (let i = entries.length - 1; i >= 0; i--) { + const entry = entries[i]!; + if (entry.type !== "message") continue; + + const message = entry.message; + if (message.role !== "assistant") continue; + + return extractAssistantText(message); + } + + return undefined; +} + +/** + * Extract text content from an assistant message. + * AgentMessage.content for assistant is (TextContent | ThinkingContent | ToolCall)[]. + */ +function extractAssistantText(message: { role: string; content: unknown }): string { + const content = message.content; + if (typeof content === "string") { + return sanitizeText(content); + } + + if (!Array.isArray(content)) return ""; + + const textParts: string[] = []; + for (const block of content) { + if (block && typeof block === "object" && "type" in block && block.type === "text" && "text" in block) { + textParts.push(String(block.text)); + } + } + + return sanitizeText(textParts.join("\n")); +} + +/** + * Strip thinking tags and tool markers from text. + */ +function sanitizeText(text: string): string { + return text + .replace(/[\s\S]*?<\/thinking>/g, "") + .replace(/[\s\S]*?<\/tool_call>/g, "") + .trim(); +} + +/** + * Format the duration between two timestamps as a human-readable string. + */ +function formatDuration(startMs: number, endMs: number): string { + const totalSeconds = Math.round((endMs - startMs) / 1000); + if (totalSeconds < 60) return `${totalSeconds}s`; + + const minutes = Math.floor(totalSeconds / 60); + const seconds = totalSeconds % 60; + if (minutes < 60) return seconds > 0 ? `${minutes}m${seconds}s` : `${minutes}m`; + + const hours = Math.floor(minutes / 60); + const remainingMinutes = minutes % 60; + return remainingMinutes > 0 ? `${hours}h${remainingMinutes}m` : `${hours}h`; +} + +/** + * Format a status label from an outcome. + */ +function formatStatusLabel(outcome: SubagentRunOutcome | undefined): string { + if (!outcome) return "completed with unknown status"; + switch (outcome.status) { + case "ok": + return "completed successfully"; + case "error": + return outcome.error ? `failed: ${outcome.error}` : "failed"; + case "timeout": + return "timed out"; + default: + return "completed with unknown status"; + } +} + +/** Parameters for formatAnnouncementMessage */ +export interface FormatAnnouncementParams { + runId: string; + childSessionId: string; + requesterSessionId: string; + task: string; + label?: string | undefined; + cleanup: "delete" | "keep"; + outcome?: SubagentRunOutcome | undefined; + startedAt?: number | undefined; + endedAt?: number | undefined; + findings?: string | undefined; +} + +/** + * Format the announcement message sent to the parent agent. + */ +export function formatAnnouncementMessage(params: FormatAnnouncementParams): string { + const { task, label, outcome, findings, startedAt, endedAt, childSessionId } = params; + const displayName = label || task.slice(0, 60); + const statusLabel = formatStatusLabel(outcome); + + const parts: string[] = [ + `A background task "${displayName}" just ${statusLabel}.`, + "", + "Findings:", + findings || "(no output)", + ]; + + // Stats line + const stats: string[] = []; + if (startedAt && endedAt) { + stats.push(`runtime ${formatDuration(startedAt, endedAt)}`); + } + stats.push(`session ${childSessionId}`); + + parts.push("", `Stats: ${stats.join(" • ")}`); + + parts.push( + "", + "Summarize this naturally for the user. Keep it brief (1-2 sentences).", + "Flow it into the conversation naturally.", + "Do not mention technical details like session IDs or that this was a background task.", + "You can respond with NO_REPLY if no announcement is needed (e.g., internal task with no user-facing result).", + ); + + return parts.join("\n"); +} + +/** + * Run the full subagent announcement flow: + * 1. Read child's last assistant reply + * 2. Format announcement message + * 3. Send to parent agent via Hub + */ +export function runSubagentAnnounceFlow(params: SubagentAnnounceParams): boolean { + const { requesterSessionId, childSessionId } = params; + + // Read child's final output + const findings = readLatestAssistantReply(childSessionId); + + // Format the announcement + const message = formatAnnouncementMessage({ + runId: params.runId, + childSessionId: params.childSessionId, + requesterSessionId: params.requesterSessionId, + task: params.task, + label: params.label, + cleanup: params.cleanup, + outcome: params.outcome, + startedAt: params.startedAt, + endedAt: params.endedAt, + findings, + }); + + // Deliver to parent agent via Hub + try { + const hub = getHub(); + const parentAgent = hub.getAgent(requesterSessionId); + if (!parentAgent || parentAgent.closed) { + console.warn( + `[SubagentAnnounce] Parent agent not found or closed: ${requesterSessionId}`, + ); + return false; + } + + parentAgent.write(message); + return true; + } catch (err) { + console.error(`[SubagentAnnounce] Failed to announce to parent:`, err); + return false; + } +} diff --git a/src/agent/subagent/index.ts b/src/agent/subagent/index.ts new file mode 100644 index 00000000..d0a24d99 --- /dev/null +++ b/src/agent/subagent/index.ts @@ -0,0 +1,37 @@ +/** + * Subagent orchestration system. + * + * Provides child agent spawning, lifecycle management, + * persistent registry, and result announcement flow. + */ + +export type { + SubagentRunOutcome, + SubagentRunRecord, + RegisterSubagentRunParams, + SubagentAnnounceParams, + SubagentSystemPromptParams, +} from "./types.js"; + +export { + initSubagentRegistry, + registerSubagentRun, + listSubagentRuns, + releaseSubagentRun, + getSubagentRun, + resetSubagentRegistryForTests, +} from "./registry.js"; + +export { + buildSubagentSystemPrompt, + readLatestAssistantReply, + formatAnnouncementMessage, + runSubagentAnnounceFlow, +} from "./announce.js"; +export type { FormatAnnouncementParams } from "./announce.js"; + +export { + loadSubagentRuns, + saveSubagentRuns, + getSubagentStorePath, +} from "./registry-store.js"; diff --git a/src/agent/subagent/registry-store.test.ts b/src/agent/subagent/registry-store.test.ts new file mode 100644 index 00000000..7247203c --- /dev/null +++ b/src/agent/subagent/registry-store.test.ts @@ -0,0 +1,81 @@ +import { describe, it, expect, beforeEach, afterEach } from "vitest"; +import { mkdtempSync, rmSync, existsSync } from "node:fs"; +import { join } from "node:path"; +import { tmpdir } from "node:os"; +import type { SubagentRunRecord } from "./types.js"; + +// We need to test the store functions with a custom directory. +// Since the store uses DATA_DIR from shared, we test the serialization logic directly. + +describe("registry-store serialization", () => { + let tempDir: string; + + beforeEach(() => { + tempDir = mkdtempSync(join(tmpdir(), "subagent-store-test-")); + }); + + afterEach(() => { + rmSync(tempDir, { recursive: true, force: true }); + }); + + it("round-trips SubagentRunRecord through JSON", () => { + const record: SubagentRunRecord = { + runId: "run-123", + childSessionId: "child-456", + requesterSessionId: "parent-789", + task: "Analyze code quality", + label: "Code Review", + cleanup: "delete", + createdAt: Date.now(), + startedAt: Date.now(), + endedAt: Date.now() + 30000, + outcome: { status: "ok" }, + archiveAtMs: Date.now() + 3600000, + cleanupHandled: true, + cleanupCompletedAt: Date.now() + 30100, + }; + + // Serialize and deserialize + const json = JSON.stringify({ version: 1, runs: { "run-123": record } }); + const parsed = JSON.parse(json); + + expect(parsed.version).toBe(1); + expect(parsed.runs["run-123"]).toEqual(record); + }); + + it("handles record with minimal fields", () => { + const record: SubagentRunRecord = { + runId: "run-minimal", + childSessionId: "child-1", + requesterSessionId: "parent-1", + task: "Do something", + cleanup: "keep", + createdAt: Date.now(), + }; + + const json = JSON.stringify({ version: 1, runs: { "run-minimal": record } }); + const parsed = JSON.parse(json); + + expect(parsed.runs["run-minimal"].runId).toBe("run-minimal"); + expect(parsed.runs["run-minimal"].outcome).toBeUndefined(); + expect(parsed.runs["run-minimal"].label).toBeUndefined(); + }); + + it("handles error outcome serialization", () => { + const record: SubagentRunRecord = { + runId: "run-err", + childSessionId: "child-err", + requesterSessionId: "parent-1", + task: "Fail", + cleanup: "delete", + createdAt: Date.now(), + outcome: { status: "error", error: "Something went wrong" }, + }; + + const json = JSON.stringify(record); + const parsed = JSON.parse(json) as SubagentRunRecord; + + expect(parsed.outcome?.status).toBe("error"); + expect(parsed.outcome?.error).toBe("Something went wrong"); + }); +}); diff --git a/src/agent/subagent/registry-store.ts b/src/agent/subagent/registry-store.ts new file mode 100644 index 00000000..b96a315c --- /dev/null +++ b/src/agent/subagent/registry-store.ts @@ -0,0 +1,61 @@ +/** + * Persistent storage for subagent run records. + * + * File: ~/.super-multica/subagents/runs.json + */ + +import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; +import { join } from "node:path"; +import { DATA_DIR } from "../../shared/index.js"; +import type { SubagentRunRecord } from "./types.js"; + +const SUBAGENTS_DIR = join(DATA_DIR, "subagents"); +const RUNS_FILE = join(SUBAGENTS_DIR, "runs.json"); + +interface SubagentRunsStore { + version: 1; + runs: Record; +} + +function ensureDir(): void { + if (!existsSync(SUBAGENTS_DIR)) { + mkdirSync(SUBAGENTS_DIR, { recursive: true }); + } +} + +/** Get the path to the subagent store file (for testing) */ +export function getSubagentStorePath(): string { + return RUNS_FILE; +} + +/** Load all persisted subagent runs */ +export function loadSubagentRuns(): Map { + if (!existsSync(RUNS_FILE)) return new Map(); + + try { + const content = readFileSync(RUNS_FILE, "utf-8"); + const store = JSON.parse(content) as SubagentRunsStore; + + if (store.version !== 1) { + console.warn(`[SubagentStore] Unknown store version: ${store.version}, ignoring`); + return new Map(); + } + + return new Map(Object.entries(store.runs)); + } catch (err) { + console.warn(`[SubagentStore] Failed to load runs:`, err); + return new Map(); + } +} + +/** Save all subagent runs to disk */ +export function saveSubagentRuns(runs: Map): void { + ensureDir(); + + const store: SubagentRunsStore = { + version: 1, + runs: Object.fromEntries(runs), + }; + + writeFileSync(RUNS_FILE, JSON.stringify(store, null, 2), "utf-8"); +} diff --git a/src/agent/subagent/registry.ts b/src/agent/subagent/registry.ts new file mode 100644 index 00000000..9915e4a0 --- /dev/null +++ b/src/agent/subagent/registry.ts @@ -0,0 +1,321 @@ +/** + * Subagent registry — in-memory tracking + lifecycle management. + * + * Tracks all active subagent runs, persists state to disk, + * watches for child completion, and triggers announce flow. + */ + +import { getHub } from "../../hub/hub-singleton.js"; +import { loadSubagentRuns, saveSubagentRuns } from "./registry-store.js"; +import { runSubagentAnnounceFlow } from "./announce.js"; +import type { + RegisterSubagentRunParams, + SubagentRunRecord, +} from "./types.js"; +import { resolveSessionDir } from "../session/storage.js"; +import { rmSync } from "node:fs"; + +/** Default archive retention: 60 minutes after completion */ +const DEFAULT_ARCHIVE_AFTER_MS = 60 * 60 * 1000; + +/** Archive sweep interval: 60 seconds */ +const SWEEP_INTERVAL_MS = 60 * 1000; + +// ============================================================================ +// Module-level state +// ============================================================================ + +const subagentRuns = new Map(); +let sweepTimer: ReturnType | undefined; +const resumedRuns = new Set(); + +// ============================================================================ +// Public API +// ============================================================================ + +/** Initialize registry from persisted state. Call once at startup. */ +export function initSubagentRegistry(): void { + const persisted = loadSubagentRuns(); + for (const [runId, record] of persisted) { + subagentRuns.set(runId, record); + + // Resume incomplete runs + if (!record.cleanupHandled) { + if (record.endedAt) { + // Completed but cleanup not done — run announce flow + if (!resumedRuns.has(runId)) { + resumedRuns.add(runId); + handleRunCompletion(record); + } + } + // If not ended, the child agent session is lost on restart — + // mark as ended with unknown outcome + else if (!record.startedAt) { + record.endedAt = Date.now(); + record.outcome = { status: "unknown" }; + persist(); + if (!resumedRuns.has(runId)) { + resumedRuns.add(runId); + handleRunCompletion(record); + } + } + } + } + + if (subagentRuns.size > 0) { + startSweeper(); + console.log(`[SubagentRegistry] Loaded ${subagentRuns.size} persisted run(s)`); + } +} + +/** Register a new subagent run and start tracking its lifecycle. */ +export function registerSubagentRun(params: RegisterSubagentRunParams): SubagentRunRecord { + const { + runId, + childSessionId, + requesterSessionId, + task, + label, + cleanup = "delete", + timeoutSeconds, + } = params; + + const record: SubagentRunRecord = { + runId, + childSessionId, + requesterSessionId, + task, + label, + cleanup, + createdAt: Date.now(), + }; + + subagentRuns.set(runId, record); + persist(); + startSweeper(); + + // Start watching the child agent for completion + watchChildAgent(record, timeoutSeconds); + + return record; +} + +/** List all active runs for a given requester session. */ +export function listSubagentRuns(requesterSessionId: string): SubagentRunRecord[] { + const result: SubagentRunRecord[] = []; + for (const record of subagentRuns.values()) { + if (record.requesterSessionId === requesterSessionId) { + result.push(record); + } + } + return result; +} + +/** Remove a run from the registry. */ +export function releaseSubagentRun(runId: string): boolean { + const deleted = subagentRuns.delete(runId); + if (deleted) { + persist(); + if (subagentRuns.size === 0) { + stopSweeper(); + } + } + return deleted; +} + +/** Get a run by ID. */ +export function getSubagentRun(runId: string): SubagentRunRecord | undefined { + return subagentRuns.get(runId); +} + +/** Reset all state (for testing). */ +export function resetSubagentRegistryForTests(): void { + subagentRuns.clear(); + resumedRuns.clear(); + stopSweeper(); +} + +// ============================================================================ +// Lifecycle watching +// ============================================================================ + +function watchChildAgent(record: SubagentRunRecord, timeoutSeconds?: number): void { + const { runId, childSessionId } = record; + + // Mark as started + record.startedAt = Date.now(); + persist(); + + // Set up timeout if specified + let timeoutTimer: ReturnType | undefined; + if (timeoutSeconds && timeoutSeconds > 0) { + timeoutTimer = setTimeout(() => { + if (!record.endedAt) { + record.endedAt = Date.now(); + record.outcome = { status: "timeout" }; + persist(); + + // Try to close the child agent + try { + const hub = getHub(); + hub.closeAgent(childSessionId); + } catch { + // Hub may not be available + } + + handleRunCompletion(record); + } + }, timeoutSeconds * 1000); + } + + // Watch the child agent's channel for closure + void (async () => { + try { + const hub = getHub(); + const childAgent = hub.getAgent(childSessionId); + if (!childAgent) { + record.endedAt = Date.now(); + record.outcome = { status: "error", error: "Child agent not found" }; + persist(); + handleRunCompletion(record); + return; + } + + // Consume the child's output stream — when it ends, the agent is done + for await (const item of childAgent.read()) { + // Check for error messages + if ("content" in item && typeof item.content === "string" && item.content.startsWith("[error]")) { + record.outcome = { status: "error", error: item.content }; + } + } + + // Stream ended — child agent completed + if (!record.endedAt) { + if (timeoutTimer) clearTimeout(timeoutTimer); + record.endedAt = Date.now(); + if (!record.outcome) { + record.outcome = { status: "ok" }; + } + persist(); + handleRunCompletion(record); + } + } catch (err) { + if (!record.endedAt) { + if (timeoutTimer) clearTimeout(timeoutTimer); + record.endedAt = Date.now(); + record.outcome = { + status: "error", + error: err instanceof Error ? err.message : String(err), + }; + persist(); + handleRunCompletion(record); + } + } + })(); +} + +// ============================================================================ +// Cleanup + Announce +// ============================================================================ + +function handleRunCompletion(record: SubagentRunRecord): void { + if (record.cleanupHandled) return; + record.cleanupHandled = true; + persist(); + + // Run announce flow + const announced = runSubagentAnnounceFlow({ + runId: record.runId, + childSessionId: record.childSessionId, + requesterSessionId: record.requesterSessionId, + task: record.task, + label: record.label, + cleanup: record.cleanup, + outcome: record.outcome, + startedAt: record.startedAt, + endedAt: record.endedAt, + }); + + if (!announced) { + console.warn(`[SubagentRegistry] Announce flow failed for run ${record.runId}`); + } + + // Handle session cleanup + if (record.cleanup === "delete") { + deleteChildSession(record.childSessionId); + } + + // Schedule archive + record.archiveAtMs = Date.now() + DEFAULT_ARCHIVE_AFTER_MS; + record.cleanupCompletedAt = Date.now(); + persist(); +} + +function deleteChildSession(sessionId: string): void { + try { + const sessionDir = resolveSessionDir(sessionId); + rmSync(sessionDir, { recursive: true, force: true }); + console.log(`[SubagentRegistry] Deleted child session: ${sessionId}`); + } catch (err) { + console.warn(`[SubagentRegistry] Failed to delete child session ${sessionId}:`, err); + } + + // Also close the agent in Hub + try { + const hub = getHub(); + hub.closeAgent(sessionId); + } catch { + // Hub may not be available + } +} + +// ============================================================================ +// Archive sweeper +// ============================================================================ + +function startSweeper(): void { + if (sweepTimer) return; + sweepTimer = setInterval(sweep, SWEEP_INTERVAL_MS); + // Don't prevent process exit + if (sweepTimer.unref) sweepTimer.unref(); +} + +function stopSweeper(): void { + if (sweepTimer) { + clearInterval(sweepTimer); + sweepTimer = undefined; + } +} + +function sweep(): void { + const now = Date.now(); + let removed = 0; + + for (const [runId, record] of subagentRuns) { + if (record.archiveAtMs && record.archiveAtMs <= now) { + subagentRuns.delete(runId); + removed++; + } + } + + if (removed > 0) { + persist(); + console.log(`[SubagentRegistry] Archived ${removed} completed run(s)`); + } + + if (subagentRuns.size === 0) { + stopSweeper(); + } +} + +// ============================================================================ +// Persistence helper +// ============================================================================ + +function persist(): void { + try { + saveSubagentRuns(subagentRuns); + } catch (err) { + console.error(`[SubagentRegistry] Failed to persist runs:`, err); + } +} diff --git a/src/agent/subagent/types.ts b/src/agent/subagent/types.ts new file mode 100644 index 00000000..dfbf62bb --- /dev/null +++ b/src/agent/subagent/types.ts @@ -0,0 +1,74 @@ +/** + * Subagent orchestration types. + * + * Models the lifecycle of spawned child agents: + * created → started → ended → cleanup + */ + +/** Final outcome of a subagent run */ +export type SubagentRunOutcome = { + status: "ok" | "error" | "timeout" | "unknown"; + error?: string | undefined; +}; + +/** Persistent record tracking a single subagent run */ +export type SubagentRunRecord = { + /** Unique run identifier (UUIDv7) */ + runId: string; + /** Session ID of the child agent */ + childSessionId: string; + /** Session ID of the parent (requester) agent */ + requesterSessionId: string; + /** The task description / prompt given to the child */ + task: string; + /** Optional human-readable label */ + label?: string | undefined; + /** Session cleanup strategy after completion */ + cleanup: "delete" | "keep"; + /** Timestamp when the run was created */ + createdAt: number; + /** Timestamp when the child agent started execution */ + startedAt?: number | undefined; + /** Timestamp when the child agent finished */ + endedAt?: number | undefined; + /** Final status of the run */ + outcome?: SubagentRunOutcome | undefined; + /** Scheduled auto-archive time (ms since epoch) */ + archiveAtMs?: number | undefined; + /** Whether the cleanup/announce flow has been initiated */ + cleanupHandled?: boolean | undefined; + /** Timestamp when cleanup completed */ + cleanupCompletedAt?: number | undefined; +}; + +/** Parameters for registering a new subagent run */ +export type RegisterSubagentRunParams = { + runId: string; + childSessionId: string; + requesterSessionId: string; + task: string; + label?: string | undefined; + cleanup?: "delete" | "keep" | undefined; + timeoutSeconds?: number | undefined; +}; + +/** Parameters for the announce flow */ +export type SubagentAnnounceParams = { + runId: string; + childSessionId: string; + requesterSessionId: string; + task: string; + label?: string | undefined; + cleanup: "delete" | "keep"; + outcome?: SubagentRunOutcome | undefined; + startedAt?: number | undefined; + endedAt?: number | undefined; +}; + +/** Parameters for building the subagent system prompt */ +export type SubagentSystemPromptParams = { + requesterSessionId: string; + childSessionId: string; + label?: string | undefined; + task: string; +}; From 5b6a1c695337d42ae20b97514a48904bde6e79d2 Mon Sep 17 00:00:00 2001 From: yushen Date: Tue, 3 Feb 2026 16:49:05 +0800 Subject: [PATCH 05/25] feat(hub): add singleton pattern and subagent spawning Add global Hub singleton for cross-module access by subagent tools. Add createSubagent() method to Hub for spawning ephemeral child agents with isSubagent flag and custom system prompts. Co-Authored-By: Claude Opus 4.5 --- src/hub/hub-singleton.ts | 28 ++++++++++++++++++++++++++++ src/hub/hub.ts | 26 ++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 src/hub/hub-singleton.ts diff --git a/src/hub/hub-singleton.ts b/src/hub/hub-singleton.ts new file mode 100644 index 00000000..5d04d0f7 --- /dev/null +++ b/src/hub/hub-singleton.ts @@ -0,0 +1,28 @@ +/** + * Global Hub singleton for cross-module access. + * + * Used by subagent tools and announce flow to interact with the Hub + * without threading references through the entire call chain. + */ + +import type { Hub } from "./hub.js"; + +let _hub: Hub | undefined; + +/** Set the global Hub instance. Called once during Hub construction. */ +export function setHub(hub: Hub): void { + _hub = hub; +} + +/** Get the global Hub instance. Throws if not yet initialized. */ +export function getHub(): Hub { + if (!_hub) { + throw new Error("[Hub] Hub singleton not initialized. Ensure Hub is constructed before accessing."); + } + return _hub; +} + +/** Check if the Hub singleton has been initialized. */ +export function isHubInitialized(): boolean { + return _hub !== undefined; +} diff --git a/src/hub/hub.ts b/src/hub/hub.ts index 10236ff3..bc86bfdb 100644 --- a/src/hub/hub.ts +++ b/src/hub/hub.ts @@ -9,7 +9,9 @@ import { type ResponseErrorPayload, } from "@multica/sdk"; import { AsyncAgent } from "../agent/async-agent.js"; +import type { AgentOptions } from "../agent/types.js"; import { getHubId } from "./hub-identity.js"; +import { setHub } from "./hub-singleton.js"; import { loadAgentRecords, addAgentRecord, removeAgentRecord } from "./agent-store.js"; import { RpcDispatcher, RpcError } from "./rpc/dispatcher.js"; import { createGetAgentMessagesHandler } from "./rpc/handlers/get-agent-messages.js"; @@ -48,6 +50,9 @@ export class Hub { this.rpc.register("deleteAgent", createDeleteAgentHandler(this)); this.rpc.register("updateGateway", createUpdateGatewayHandler(this)); + // Register as global singleton for cross-module access (subagent tools, announce flow) + setHub(this); + this.client = this.createClient(this.url); this.client.connect(); this.restoreAgents(); @@ -243,6 +248,27 @@ export class Hub { } } + /** Create a subagent with specific options (isSubagent, systemPrompt, model) */ + createSubagent(sessionId: string, options: Omit = {}): AsyncAgent { + const existing = this.agents.get(sessionId); + if (existing && !existing.closed) { + return existing; + } + + const agent = new AsyncAgent({ + ...options, + sessionId, + isSubagent: true, + }); + this.agents.set(agent.sessionId, agent); + + // Subagents are ephemeral — don't persist to agent store + void this.consumeAgent(agent); + + console.log(`[Hub] Subagent created: ${agent.sessionId}`); + return agent; + } + getAgent(id: string): AsyncAgent | undefined { return this.agents.get(id); } From 83b557a6fc1b999f82e4c5f2aa20a3e644ef3830 Mon Sep 17 00:00:00 2001 From: yushen Date: Tue, 3 Feb 2026 16:49:27 +0800 Subject: [PATCH 06/25] feat(agent): add sessions_spawn tool for subagent orchestration Register sessions_spawn tool in the tool system with TypeBox schema. Subagents are blocked from spawning nested subagents via both tool policy (DEFAULT_SUBAGENT_TOOL_DENY) and runtime guard. Add group:subagent tool group and parentSessionId to AgentOptions. Co-Authored-By: Claude Opus 4.5 --- src/agent/tools.ts | 16 ++- src/agent/tools/groups.ts | 15 +-- src/agent/tools/sessions-spawn.test.ts | 40 +++++++ src/agent/tools/sessions-spawn.ts | 142 +++++++++++++++++++++++++ src/agent/types.ts | 2 + 5 files changed, 204 insertions(+), 11 deletions(-) create mode 100644 src/agent/tools/sessions-spawn.test.ts create mode 100644 src/agent/tools/sessions-spawn.ts diff --git a/src/agent/tools.ts b/src/agent/tools.ts index 8190cb86..56c9b766 100644 --- a/src/agent/tools.ts +++ b/src/agent/tools.ts @@ -6,6 +6,7 @@ import { createProcessTool } from "./tools/process.js"; import { createGlobTool } from "./tools/glob.js"; import { createWebFetchTool, createWebSearchTool } from "./tools/web/index.js"; import { createMemoryTools } from "./tools/memory/index.js"; +import { createSessionsSpawnTool } from "./tools/sessions-spawn.js"; import { filterTools } from "./tools/policy.js"; import { isMulticaError, isRetryableError } from "../shared/errors.js"; @@ -19,6 +20,10 @@ export interface CreateToolsOptions { profileId?: string | undefined; /** Base directory for profiles (optional) */ profileBaseDir?: string | undefined; + /** Whether this agent is a subagent (passed to sessions_spawn tool) */ + isSubagent?: boolean | undefined; + /** Session ID of the agent (passed to sessions_spawn tool) */ + sessionId?: string | undefined; } type ToolErrorPayload = { @@ -88,7 +93,7 @@ function wrapTool( export function createAllTools(options: CreateToolsOptions | string): AgentTool[] { // Support legacy string argument for backwards compatibility const opts: CreateToolsOptions = typeof options === "string" ? { cwd: options } : options; - const { cwd, profileId, profileBaseDir } = opts; + const { cwd, profileId, profileBaseDir, isSubagent, sessionId } = opts; const baseTools = createCodingTools(cwd).filter( (tool) => tool.name !== "bash", @@ -118,6 +123,13 @@ export function createAllTools(options: CreateToolsOptions | string): AgentTool< tools.push(...memoryTools); } + // Add sessions_spawn tool (will be filtered by policy for subagents) + const sessionsSpawnTool = createSessionsSpawnTool({ + isSubagent: isSubagent ?? false, + sessionId, + }); + tools.push(sessionsSpawnTool as AgentTool); + return tools; } @@ -138,6 +150,8 @@ export function resolveTools(options: AgentOptions): AgentTool[] { cwd, profileId: options.profileId, profileBaseDir: options.profileBaseDir, + isSubagent: options.isSubagent, + sessionId: options.sessionId, }); // Apply policy filtering diff --git a/src/agent/tools/groups.ts b/src/agent/tools/groups.ts index a886b22b..1e9edf6c 100644 --- a/src/agent/tools/groups.ts +++ b/src/agent/tools/groups.ts @@ -35,6 +35,9 @@ export const TOOL_GROUPS: Record = { // Memory tools (requires profileId) "group:memory": ["memory_get", "memory_set", "memory_delete", "memory_list"], + // Subagent tools + "group:subagent": ["sessions_spawn"], + // All core tools "group:core": [ "read", @@ -76,16 +79,8 @@ export const TOOL_PROFILES: Record { + it("has correct name and description", () => { + const tool = createSessionsSpawnTool({ isSubagent: false, sessionId: "test-session" }); + expect(tool.name).toBe("sessions_spawn"); + expect(tool.label).toBe("Spawn Subagent"); + expect(tool.description).toContain("Spawn a background subagent"); + }); + + it("rejects spawn from subagent sessions", async () => { + const tool = createSessionsSpawnTool({ isSubagent: true, sessionId: "child-session" }); + + const result = await tool.execute( + "call-1", + { task: "do something" } as any, + new AbortController().signal, + ); + + expect(result.details.status).toBe("error"); + expect(result.details.error).toContain("not allowed from sub-agent sessions"); + const firstContent = result.content[0] as { type: string; text: string }; + expect(firstContent.text).toContain("not allowed"); + }); + + it("fails gracefully when Hub is not initialized", async () => { + const tool = createSessionsSpawnTool({ isSubagent: false, sessionId: "parent-session" }); + + const result = await tool.execute( + "call-2", + { task: "analyze code", label: "Code Analysis" } as any, + new AbortController().signal, + ); + + // Should get an error because Hub singleton is not set up in test + expect(result.details.status).toBe("error"); + expect(result.details.error).toContain("Hub"); + }); +}); diff --git a/src/agent/tools/sessions-spawn.ts b/src/agent/tools/sessions-spawn.ts new file mode 100644 index 00000000..a8ca4f96 --- /dev/null +++ b/src/agent/tools/sessions-spawn.ts @@ -0,0 +1,142 @@ +/** + * sessions_spawn tool — allows a parent agent to spawn subagent runs. + * + * Subagents run in isolated sessions with restricted tools. + * Results are announced back to the parent when the child completes. + */ + +import { v7 as uuidv7 } from "uuid"; +import { Type } from "@sinclair/typebox"; +import type { AgentTool } from "@mariozechner/pi-agent-core"; +import { getHub } from "../../hub/hub-singleton.js"; +import { buildSubagentSystemPrompt } from "../subagent/announce.js"; +import { registerSubagentRun } from "../subagent/registry.js"; + +const SessionsSpawnSchema = Type.Object({ + task: Type.String({ description: "The task for the subagent to perform." }), + label: Type.Optional( + Type.String({ description: "Human-readable label for this background task." }), + ), + model: Type.Optional( + Type.String({ description: "Override the LLM model for the subagent (e.g. 'gpt-4o', 'claude-sonnet')." }), + ), + cleanup: Type.Optional( + Type.Union([Type.Literal("delete"), Type.Literal("keep")], { + description: "Session cleanup after completion. 'delete' removes session files, 'keep' preserves for audit. Default: 'delete'.", + }), + ), + timeoutSeconds: Type.Optional( + Type.Number({ + description: "Execution timeout in seconds. The subagent will be terminated if it exceeds this.", + minimum: 1, + }), + ), +}); + +type SessionsSpawnArgs = { + task: string; + label?: string; + model?: string; + cleanup?: "delete" | "keep"; + timeoutSeconds?: number; +}; + +export type SessionsSpawnResult = { + status: "accepted" | "error"; + childSessionId?: string; + runId?: string; + error?: string; +}; + +export interface CreateSessionsSpawnToolOptions { + /** Whether the current agent is itself a subagent */ + isSubagent?: boolean; + /** Session ID of the current (requester) agent */ + sessionId?: string; +} + +export function createSessionsSpawnTool( + options: CreateSessionsSpawnToolOptions, +): AgentTool { + return { + name: "sessions_spawn", + label: "Spawn Subagent", + description: + "Spawn a background subagent to handle a specific task. The subagent runs in an isolated session with its own tool set. " + + "When it completes, its findings are announced back to you automatically. " + + "Use this for parallelizable work, long-running analysis, or tasks that benefit from isolation.", + parameters: SessionsSpawnSchema, + execute: async (_toolCallId, args) => { + const { task, label, model, cleanup = "delete", timeoutSeconds } = args as SessionsSpawnArgs; + + // Guard: subagents cannot spawn subagents + if (options.isSubagent) { + return { + content: [{ type: "text", text: "Error: sessions_spawn is not allowed from sub-agent sessions." }], + details: { + status: "error", + error: "sessions_spawn is not allowed from sub-agent sessions", + }, + }; + } + + const requesterSessionId = options.sessionId ?? "unknown"; + const runId = uuidv7(); + const childSessionId = uuidv7(); + + // Build system prompt for the child + const systemPrompt = buildSubagentSystemPrompt({ + requesterSessionId, + childSessionId, + label, + task, + }); + + // Spawn child agent via Hub + try { + const hub = getHub(); + const childAgent = hub.createSubagent(childSessionId, { + systemPrompt, + model, + }); + + // Register the run for lifecycle tracking + registerSubagentRun({ + runId, + childSessionId, + requesterSessionId, + task, + label, + cleanup, + timeoutSeconds, + }); + + // Write the task to the child (non-blocking) + childAgent.write(task); + + return { + content: [ + { + type: "text", + text: `Subagent spawned successfully.\n\nRun ID: ${runId}\nSession: ${childSessionId}\nTask: ${label || task.slice(0, 80)}\n\nThe subagent is now working in the background. You will receive its findings when it completes.`, + }, + ], + details: { + status: "accepted", + childSessionId, + runId, + }, + }; + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + return { + content: [{ type: "text", text: `Error spawning subagent: ${message}` }], + details: { + status: "error", + error: message, + }, + }; + } + }, + }; +} diff --git a/src/agent/types.ts b/src/agent/types.ts index 75e53ad1..06ffb217 100644 --- a/src/agent/types.ts +++ b/src/agent/types.ts @@ -66,6 +66,8 @@ export type AgentOptions = { tools?: ToolsConfig | undefined; /** Whether this is a subagent (applies restricted tool set) */ isSubagent?: boolean | undefined; + /** Parent session ID (for subagent lineage tracking) */ + parentSessionId?: string | undefined; }; export interface Message { From d5b31eeddb1b5d25c601d426961326019f01ac13 Mon Sep 17 00:00:00 2001 From: Naiyuan Qing <145280634+NevilleQingNY@users.noreply.github.com> Date: Tue, 3 Feb 2026 16:54:34 +0800 Subject: [PATCH 07/25] fix(sdk,store): align frontend streaming protocol with new AgentEvent format Backend Hub now sends raw AgentEvent in stream payloads instead of the old delta/final/error state machine. Update StreamPayload type to use event field, add extractTextFromEvent helper, and rewrite gateway store handler to dispatch on event.type (message_start/update/end). Co-Authored-By: Claude Opus 4.5 --- packages/sdk/src/actions/index.ts | 9 +++++- packages/sdk/src/actions/stream.ts | 49 ++++++++++++++++++++++++------ packages/store/src/gateway.ts | 36 +++++++++++++--------- 3 files changed, 68 insertions(+), 26 deletions(-) diff --git a/packages/sdk/src/actions/index.ts b/packages/sdk/src/actions/index.ts index 2f6ab2e3..d9fb2b1b 100644 --- a/packages/sdk/src/actions/index.ts +++ b/packages/sdk/src/actions/index.ts @@ -27,4 +27,11 @@ export { type UpdateGatewayResult, } from "./rpc"; -export { StreamAction, type StreamState, type StreamPayload } from "./stream"; +export { + StreamAction, + type StreamPayload, + type StreamEvent, + type StreamMessageEvent, + type StreamToolEvent, + extractTextFromEvent, +} from "./stream"; diff --git a/packages/sdk/src/actions/stream.ts b/packages/sdk/src/actions/stream.ts index da8dae31..51329040 100644 --- a/packages/sdk/src/actions/stream.ts +++ b/packages/sdk/src/actions/stream.ts @@ -2,19 +2,48 @@ export const StreamAction = "stream" as const; -/** 流消息状态 */ -export type StreamState = "delta" | "final" | "error"; +/** + * AgentEvent types forwarded by the Hub to frontend clients. + * These mirror the subset of AgentEvent from @mariozechner/pi-agent-core + * that the Hub forwards (filtered at the Hub layer). + */ +export interface StreamMessageEvent { + type: "message_start" | "message_update" | "message_end"; + message: { + id?: string; + role: string; + content?: Array<{ type: string; text?: string }>; + }; + assistantMessageEvent?: unknown; +} -/** 流消息 payload */ +export interface StreamToolEvent { + type: "tool_execution_start" | "tool_execution_end"; + toolCallId: string; + toolName: string; + args?: unknown; + result?: unknown; + isError?: boolean; +} + +export type StreamEvent = StreamMessageEvent | StreamToolEvent; + +/** 流消息 payload — wraps a raw AgentEvent with stream/agent identifiers */ export interface StreamPayload { - /** 流 ID(即 messageId),关联同一个流的所有消息 */ + /** 流 ID,关联同一个流的所有消息 */ streamId: string; /** 所属 agent ID */ agentId: string; - /** 流状态 */ - state: StreamState; - /** 累计文本内容(delta/final 时) */ - content?: string; - /** 错误信息(error 时) */ - error?: string; + /** Raw agent event from the engine */ + event: StreamEvent; +} + +/** Extract plain text from an AgentMessage content array */ +export function extractTextFromEvent(event: StreamMessageEvent): string { + const content = event.message?.content; + if (!Array.isArray(content)) return ""; + return content + .filter((c) => c.type === "text") + .map((c) => c.text ?? "") + .join(""); } diff --git a/packages/store/src/gateway.ts b/packages/store/src/gateway.ts index 5682b70a..ed1d4814 100644 --- a/packages/store/src/gateway.ts +++ b/packages/store/src/gateway.ts @@ -1,5 +1,5 @@ import { create } from "zustand" -import { GatewayClient, StreamAction, type ConnectionState, type DeviceInfo, type SendErrorResponse, type StreamPayload } from "@multica/sdk" +import { GatewayClient, StreamAction, extractTextFromEvent, type ConnectionState, type DeviceInfo, type SendErrorResponse, type StreamPayload, type StreamMessageEvent } from "@multica/sdk" import { useMessagesStore } from "./messages" const DEFAULT_GATEWAY_URL = "http://localhost:3000" @@ -45,26 +45,32 @@ export const useGatewayStore = create()((set, get) => ({ }) .onStateChange((connectionState) => set({ connectionState })) .onMessage((msg) => { - // Handle streaming messages + // Handle streaming messages (new protocol: payload.event is a raw AgentEvent) if (msg.action === StreamAction) { const payload = msg.payload as StreamPayload const store = useMessagesStore.getState() - switch (payload.state) { - case "delta": { - const exists = store.messages.some((m) => m.id === payload.streamId) - if (!exists) { - store.startStream(payload.streamId, payload.agentId) - } - if (payload.content) { - store.appendStream(payload.streamId, payload.content) - } + const { event } = payload + + switch (event.type) { + case "message_start": { + store.startStream(payload.streamId, payload.agentId) + const text = extractTextFromEvent(event as StreamMessageEvent) + if (text) store.appendStream(payload.streamId, text) break } - case "final": - store.endStream(payload.streamId, payload.content ?? "") + case "message_update": { + const text = extractTextFromEvent(event as StreamMessageEvent) + store.appendStream(payload.streamId, text) break - case "error": - store.endStream(payload.streamId, `[error] ${payload.error}`) + } + case "message_end": { + const text = extractTextFromEvent(event as StreamMessageEvent) + store.endStream(payload.streamId, text) + break + } + case "tool_execution_start": + case "tool_execution_end": + // TODO: surface tool execution status in UI break } return From d89b409add4412ca594ab6f4e9bf77bc917d7aa8 Mon Sep 17 00:00:00 2001 From: yushen Date: Tue, 3 Feb 2026 16:55:42 +0800 Subject: [PATCH 08/25] feat(agent): add auth profile rotation and cooldown module Implement multi-profile auth system with exponential-backoff cooldowns, modeled after OpenClaw's auth-profiles system. Includes types, constants, persistent store (auth-profiles.json), usage tracking with cooldown calculation, and profile ordering with round-robin and explicit modes. Co-Authored-By: Claude Opus 4.5 --- src/agent/auth-profiles/constants.ts | 45 +++++++ src/agent/auth-profiles/index.ts | 45 +++++++ src/agent/auth-profiles/order.test.ts | 176 ++++++++++++++++++++++++++ src/agent/auth-profiles/order.ts | 94 ++++++++++++++ src/agent/auth-profiles/store.ts | 84 ++++++++++++ src/agent/auth-profiles/types.ts | 47 +++++++ src/agent/auth-profiles/usage.test.ts | 147 +++++++++++++++++++++ src/agent/auth-profiles/usage.ts | 169 +++++++++++++++++++++++++ 8 files changed, 807 insertions(+) create mode 100644 src/agent/auth-profiles/constants.ts create mode 100644 src/agent/auth-profiles/index.ts create mode 100644 src/agent/auth-profiles/order.test.ts create mode 100644 src/agent/auth-profiles/order.ts create mode 100644 src/agent/auth-profiles/store.ts create mode 100644 src/agent/auth-profiles/types.ts create mode 100644 src/agent/auth-profiles/usage.test.ts create mode 100644 src/agent/auth-profiles/usage.ts diff --git a/src/agent/auth-profiles/constants.ts b/src/agent/auth-profiles/constants.ts new file mode 100644 index 00000000..d519a246 --- /dev/null +++ b/src/agent/auth-profiles/constants.ts @@ -0,0 +1,45 @@ +/** + * Auth Profile Constants + * + * Cooldown timings, store version, and file names. + */ + +/** Store format version */ +export const AUTH_STORE_VERSION = 1; + +/** Runtime store filename (inside ~/.super-multica/) */ +export const AUTH_PROFILE_STORE_FILENAME = "auth-profiles.json"; + +// ============================================================ +// Non-billing cooldown (rate_limit, auth, timeout, unknown) +// Progression: 1min -> 5min -> 25min -> 1hr (cap) +// Formula: min(MAX, BASE * FACTOR ^ min(errorCount - 1, 3)) +// ============================================================ + +/** Base cooldown duration in milliseconds (1 minute) */ +export const COOLDOWN_BASE_MS = 60_000; + +/** Exponential factor for cooldown progression */ +export const COOLDOWN_FACTOR = 5; + +/** Maximum cooldown duration in milliseconds (1 hour) */ +export const COOLDOWN_MAX_MS = 3_600_000; + +// ============================================================ +// Billing disable (longer backoff for payment/quota issues) +// Progression: 5h -> 10h -> 20h -> 24h (cap) +// Formula: min(MAX_HOURS, BASE_HOURS * 2 ^ (count - 1)) +// ============================================================ + +/** Base billing disable duration in hours */ +export const BILLING_BACKOFF_HOURS = 5; + +/** Maximum billing disable duration in hours */ +export const BILLING_MAX_HOURS = 24; + +// ============================================================ +// Failure window +// ============================================================ + +/** Failure window in milliseconds (24 hours) — errors older than this are forgotten */ +export const FAILURE_WINDOW_MS = 24 * 60 * 60 * 1000; diff --git a/src/agent/auth-profiles/index.ts b/src/agent/auth-profiles/index.ts new file mode 100644 index 00000000..bd87cbb7 --- /dev/null +++ b/src/agent/auth-profiles/index.ts @@ -0,0 +1,45 @@ +/** + * Auth Profiles — barrel export + */ + +export type { + AuthProfileFailureReason, + AuthProfileStore, + ProfileUsageStats, + ResolvedProfileAuth, +} from "./types.js"; + +export { + AUTH_STORE_VERSION, + AUTH_PROFILE_STORE_FILENAME, + COOLDOWN_BASE_MS, + COOLDOWN_FACTOR, + COOLDOWN_MAX_MS, + BILLING_BACKOFF_HOURS, + BILLING_MAX_HOURS, + FAILURE_WINDOW_MS, +} from "./constants.js"; + +export { + resolveAuthStorePath, + loadAuthProfileStore, + saveAuthProfileStore, + updateAuthProfileStore, +} from "./store.js"; + +export { + listProfilesForProvider, + resolveAuthProfileOrder, +} from "./order.js"; + +export { + isProfileInCooldown, + resolveProfileUnusableUntil, + calculateCooldownMs, + calculateBillingDisableMs, + computeNextProfileUsageStats, + markAuthProfileFailure, + markAuthProfileUsed, + markAuthProfileGood, + clearAuthProfileCooldown, +} from "./usage.js"; diff --git a/src/agent/auth-profiles/order.test.ts b/src/agent/auth-profiles/order.test.ts new file mode 100644 index 00000000..dd729719 --- /dev/null +++ b/src/agent/auth-profiles/order.test.ts @@ -0,0 +1,176 @@ +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { resolveAuthProfileOrder, listProfilesForProvider } from "./order.js"; +import type { AuthProfileStore } from "./types.js"; + +// Mock credentialManager +vi.mock("../credentials.js", () => { + let _profiles: Record = {}; + let _order: Record = {}; + + return { + credentialManager: { + listProfileIdsForProvider(provider: string): string[] { + return Object.keys(_profiles).filter( + (key) => key === provider || key.startsWith(`${provider}:`), + ); + }, + getLlmOrder(provider: string): string[] | undefined { + return _order[provider]; + }, + // Test helpers + __setProfiles(profiles: Record) { + _profiles = profiles; + }, + __setOrder(order: Record) { + _order = order; + }, + }, + }; +}); + +// Import the mock to use test helpers +import { credentialManager } from "../credentials.js"; +const mock = credentialManager as unknown as { + __setProfiles: (p: Record) => void; + __setOrder: (o: Record) => void; +}; + +beforeEach(() => { + mock.__setProfiles({}); + mock.__setOrder({}); +}); + +// ============================================================ +// listProfilesForProvider +// ============================================================ + +describe("listProfilesForProvider", () => { + it("returns profiles matching the provider", () => { + mock.__setProfiles({ + anthropic: { apiKey: "sk-1" }, + "anthropic:backup": { apiKey: "sk-2" }, + openai: { apiKey: "sk-3" }, + }); + expect(listProfilesForProvider("anthropic")).toEqual([ + "anthropic", + "anthropic:backup", + ]); + }); + + it("returns empty array when no profiles match", () => { + mock.__setProfiles({ openai: { apiKey: "sk-1" } }); + expect(listProfilesForProvider("anthropic")).toEqual([]); + }); +}); + +// ============================================================ +// resolveAuthProfileOrder +// ============================================================ + +describe("resolveAuthProfileOrder", () => { + const now = 1_000_000; + + it("returns round-robin order by lastUsed when no explicit order", () => { + mock.__setProfiles({ + "anthropic": { apiKey: "sk-1" }, + "anthropic:b": { apiKey: "sk-2" }, + "anthropic:c": { apiKey: "sk-3" }, + }); + const store: AuthProfileStore = { + version: 1, + usageStats: { + "anthropic": { lastUsed: 300 }, + "anthropic:b": { lastUsed: 100 }, + "anthropic:c": { lastUsed: 200 }, + }, + }; + + const order = resolveAuthProfileOrder("anthropic", store, now); + // Sorted by lastUsed ascending: b(100) -> c(200) -> default(300) + expect(order).toEqual(["anthropic:b", "anthropic:c", "anthropic"]); + }); + + it("respects explicit order from config", () => { + mock.__setProfiles({ + "anthropic": { apiKey: "sk-1" }, + "anthropic:b": { apiKey: "sk-2" }, + "anthropic:c": { apiKey: "sk-3" }, + }); + mock.__setOrder({ anthropic: ["anthropic:c", "anthropic", "anthropic:b"] }); + + const store: AuthProfileStore = { version: 1 }; + const order = resolveAuthProfileOrder("anthropic", store, now); + expect(order).toEqual(["anthropic:c", "anthropic", "anthropic:b"]); + }); + + it("pushes cooldown profiles to the end", () => { + mock.__setProfiles({ + "anthropic": { apiKey: "sk-1" }, + "anthropic:b": { apiKey: "sk-2" }, + "anthropic:c": { apiKey: "sk-3" }, + }); + const store: AuthProfileStore = { + version: 1, + usageStats: { + "anthropic": { lastUsed: 100 }, + "anthropic:b": { lastUsed: 200, cooldownUntil: now + 5000 }, + "anthropic:c": { lastUsed: 300 }, + }, + }; + + const order = resolveAuthProfileOrder("anthropic", store, now); + // anthropic and anthropic:c are available; anthropic:b is in cooldown -> pushed to end + expect(order).toEqual(["anthropic", "anthropic:c", "anthropic:b"]); + }); + + it("sorts cooldown profiles by earliest recovery", () => { + mock.__setProfiles({ + "anthropic": { apiKey: "sk-1" }, + "anthropic:b": { apiKey: "sk-2" }, + "anthropic:c": { apiKey: "sk-3" }, + }); + const store: AuthProfileStore = { + version: 1, + usageStats: { + "anthropic": { cooldownUntil: now + 10_000 }, + "anthropic:b": { cooldownUntil: now + 1_000 }, + "anthropic:c": { cooldownUntil: now + 5_000 }, + }, + }; + + const order = resolveAuthProfileOrder("anthropic", store, now); + // All in cooldown, sorted by soonest recovery + expect(order).toEqual(["anthropic:b", "anthropic:c", "anthropic"]); + }); + + it("deduplicates profile IDs", () => { + mock.__setProfiles({ + "anthropic": { apiKey: "sk-1" }, + "anthropic:b": { apiKey: "sk-2" }, + }); + // Explicit order has duplicate + mock.__setOrder({ anthropic: ["anthropic", "anthropic", "anthropic:b"] }); + + const store: AuthProfileStore = { version: 1 }; + const order = resolveAuthProfileOrder("anthropic", store, now); + expect(order).toEqual(["anthropic", "anthropic:b"]); + }); + + it("appends unlisted profiles to explicit order", () => { + mock.__setProfiles({ + "anthropic": { apiKey: "sk-1" }, + "anthropic:b": { apiKey: "sk-2" }, + "anthropic:c": { apiKey: "sk-3" }, + }); + // Only lists one profile in explicit order + mock.__setOrder({ anthropic: ["anthropic:b"] }); + + const store: AuthProfileStore = { version: 1 }; + const order = resolveAuthProfileOrder("anthropic", store, now); + // anthropic:b first (explicit), then the rest + expect(order[0]).toBe("anthropic:b"); + expect(order).toHaveLength(3); + expect(order).toContain("anthropic"); + expect(order).toContain("anthropic:c"); + }); +}); diff --git a/src/agent/auth-profiles/order.ts b/src/agent/auth-profiles/order.ts new file mode 100644 index 00000000..16055e81 --- /dev/null +++ b/src/agent/auth-profiles/order.ts @@ -0,0 +1,94 @@ +/** + * Auth Profile Ordering + * + * Determines the order in which auth profiles are tried for a given provider. + * Supports explicit ordering (from credentials.json5) and automatic round-robin + * based on lastUsed time. Profiles in cooldown are pushed to the end. + */ + +import { credentialManager } from "../credentials.js"; +import type { AuthProfileStore, ProfileUsageStats } from "./types.js"; +import { isProfileInCooldown, resolveProfileUnusableUntil } from "./usage.js"; + +// ============================================================ +// Profile discovery +// ============================================================ + +/** + * List all profile IDs from credentials.json5 that belong to a given provider. + * A profile matches if its key equals the provider exactly or starts with "provider:". + */ +export function listProfilesForProvider(provider: string): string[] { + return credentialManager.listProfileIdsForProvider(provider); +} + +// ============================================================ +// Ordering +// ============================================================ + +/** + * Resolve the ordered list of profile IDs to try for a given provider. + * + * Strategy: + * 1. If credentials.json5 has `llm.order[provider]`, use that explicit order. + * 2. Otherwise, use round-robin ordered by `lastUsed` ascending (oldest first). + * + * In both cases, profiles currently in cooldown are pushed to the end, + * sorted by earliest cooldown expiry (soonest-to-recover first). + */ +export function resolveAuthProfileOrder( + provider: string, + store: AuthProfileStore, + now?: number, +): string[] { + const ts = now ?? Date.now(); + + // Gather candidates + const explicitOrder = credentialManager.getLlmOrder(provider); + const allProfiles = listProfilesForProvider(provider); + + let candidates: string[]; + if (explicitOrder && explicitOrder.length > 0) { + // Use explicit order, filter to only existing profiles + const profileSet = new Set(allProfiles); + candidates = explicitOrder.filter((id) => profileSet.has(id)); + // Append any profiles not in the explicit order + for (const id of allProfiles) { + if (!candidates.includes(id)) { + candidates.push(id); + } + } + } else { + // Round-robin by lastUsed (oldest first) + candidates = [...allProfiles].sort((a, b) => { + const statsA = store.usageStats?.[a]; + const statsB = store.usageStats?.[b]; + return (statsA?.lastUsed ?? 0) - (statsB?.lastUsed ?? 0); + }); + } + + // Deduplicate + candidates = [...new Set(candidates)]; + + // Partition into available and in-cooldown + const available: string[] = []; + const inCooldown: string[] = []; + + for (const id of candidates) { + const stats = store.usageStats?.[id]; + if (stats && isProfileInCooldown(stats, ts)) { + inCooldown.push(id); + } else { + available.push(id); + } + } + + // Sort cooldown profiles by soonest recovery + inCooldown.sort((a, b) => { + const statsA = store.usageStats?.[a] ?? {}; + const statsB = store.usageStats?.[b] ?? {}; + return resolveProfileUnusableUntil(statsA) - resolveProfileUnusableUntil(statsB); + }); + + return [...available, ...inCooldown]; +} diff --git a/src/agent/auth-profiles/store.ts b/src/agent/auth-profiles/store.ts new file mode 100644 index 00000000..3bb0480f --- /dev/null +++ b/src/agent/auth-profiles/store.ts @@ -0,0 +1,84 @@ +/** + * Auth Profile Store + * + * Persistence layer for auth profile runtime state. + * Stores usage stats, cooldowns, and last-good info in ~/.super-multica/auth-profiles.json. + */ + +import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs"; +import { join, dirname } from "node:path"; +import { DATA_DIR } from "../../shared/paths.js"; +import { AUTH_STORE_VERSION, AUTH_PROFILE_STORE_FILENAME } from "./constants.js"; +import type { AuthProfileStore } from "./types.js"; + +// ============================================================ +// Paths +// ============================================================ + +/** Resolve the auth profile store file path */ +export function resolveAuthStorePath(): string { + return join(DATA_DIR, AUTH_PROFILE_STORE_FILENAME); +} + +// ============================================================ +// Load / Save +// ============================================================ + +function createEmptyStore(): AuthProfileStore { + return { version: AUTH_STORE_VERSION }; +} + +function coerceStore(raw: unknown): AuthProfileStore { + if (!raw || typeof raw !== "object") return createEmptyStore(); + + const obj = raw as Record; + const store: AuthProfileStore = { + version: typeof obj.version === "number" ? obj.version : AUTH_STORE_VERSION, + }; + + if (obj.lastGood && typeof obj.lastGood === "object") { + store.lastGood = obj.lastGood as Record; + } + if (obj.usageStats && typeof obj.usageStats === "object") { + store.usageStats = obj.usageStats as AuthProfileStore["usageStats"]; + } + + return store; +} + +/** Load auth profile store from disk. Returns empty store if file doesn't exist. */ +export function loadAuthProfileStore(): AuthProfileStore { + const storePath = resolveAuthStorePath(); + if (!existsSync(storePath)) return createEmptyStore(); + + try { + const raw = readFileSync(storePath, "utf8"); + return coerceStore(JSON.parse(raw)); + } catch { + return createEmptyStore(); + } +} + +/** Save auth profile store to disk */ +export function saveAuthProfileStore(store: AuthProfileStore): void { + const storePath = resolveAuthStorePath(); + const dir = dirname(storePath); + if (!existsSync(dir)) { + mkdirSync(dir, { recursive: true }); + } + writeFileSync(storePath, JSON.stringify(store, null, 2), "utf8"); +} + +/** + * Atomic load-update-save cycle. + * The updater receives the current store and should mutate it in place. + * Returns the updated store. + */ +export function updateAuthProfileStore( + updater: (store: AuthProfileStore) => void, +): AuthProfileStore { + const store = loadAuthProfileStore(); + updater(store); + saveAuthProfileStore(store); + return store; +} diff --git a/src/agent/auth-profiles/types.ts b/src/agent/auth-profiles/types.ts new file mode 100644 index 00000000..e4e34eb2 --- /dev/null +++ b/src/agent/auth-profiles/types.ts @@ -0,0 +1,47 @@ +/** + * Auth Profile Types + * + * Type definitions for the auth profile rotation and cooldown system. + */ + +/** Reason for an auth profile failure, determines cooldown behavior */ +export type AuthProfileFailureReason = + | "auth" + | "rate_limit" + | "billing" + | "timeout" + | "unknown"; + +/** Per-profile usage and cooldown state (persisted in auth-profiles.json) */ +export type ProfileUsageStats = { + /** Timestamp of last successful use */ + lastUsed?: number | undefined; + /** Cooldown expiry for non-billing failures (rate_limit, auth, timeout, unknown) */ + cooldownUntil?: number | undefined; + /** Disable expiry for billing failures (longer backoff) */ + disabledUntil?: number | undefined; + /** Reason for the current disable period */ + disabledReason?: AuthProfileFailureReason | undefined; + /** Consecutive error count (resets on success or after failure window) */ + errorCount?: number | undefined; + /** Per-reason failure counts within the failure window */ + failureCounts?: Partial> | undefined; + /** Timestamp of the last failure (used for failure window expiry) */ + lastFailureAt?: number | undefined; +}; + +/** Persisted runtime store for auth profile state */ +export type AuthProfileStore = { + version: number; + /** Last known good profile per provider */ + lastGood?: Record | undefined; + /** Per-profile usage/cooldown stats */ + usageStats?: Record | undefined; +}; + +/** Resolved auth info returned by profile-aware key resolution */ +export type ResolvedProfileAuth = { + apiKey: string; + profileId: string; + provider: string; +}; diff --git a/src/agent/auth-profiles/usage.test.ts b/src/agent/auth-profiles/usage.test.ts new file mode 100644 index 00000000..daaeed8e --- /dev/null +++ b/src/agent/auth-profiles/usage.test.ts @@ -0,0 +1,147 @@ +import { describe, it, expect } from "vitest"; +import { + calculateCooldownMs, + calculateBillingDisableMs, + computeNextProfileUsageStats, + isProfileInCooldown, + resolveProfileUnusableUntil, +} from "./usage.js"; +import { + COOLDOWN_BASE_MS, + COOLDOWN_MAX_MS, + FAILURE_WINDOW_MS, +} from "./constants.js"; +import type { ProfileUsageStats } from "./types.js"; + +// ============================================================ +// calculateCooldownMs +// ============================================================ + +describe("calculateCooldownMs", () => { + it("applies exponential backoff with a 1h cap", () => { + expect(calculateCooldownMs(1)).toBe(60_000); // 1 min + expect(calculateCooldownMs(2)).toBe(5 * 60_000); // 5 min + expect(calculateCooldownMs(3)).toBe(25 * 60_000); // 25 min + expect(calculateCooldownMs(4)).toBe(60 * 60_000); // 1 hour (cap) + expect(calculateCooldownMs(5)).toBe(60 * 60_000); // 1 hour (cap) + expect(calculateCooldownMs(100)).toBe(60 * 60_000); // still capped + }); + + it("returns 0 for errorCount <= 0", () => { + expect(calculateCooldownMs(0)).toBe(0); + expect(calculateCooldownMs(-1)).toBe(0); + }); +}); + +// ============================================================ +// calculateBillingDisableMs +// ============================================================ + +describe("calculateBillingDisableMs", () => { + it("applies exponential backoff with a 24h cap", () => { + const h = 60 * 60 * 1000; + expect(calculateBillingDisableMs(1)).toBe(5 * h); // 5h + expect(calculateBillingDisableMs(2)).toBe(10 * h); // 10h + expect(calculateBillingDisableMs(3)).toBe(20 * h); // 20h + expect(calculateBillingDisableMs(4)).toBe(24 * h); // 24h (cap) + expect(calculateBillingDisableMs(5)).toBe(24 * h); // still capped + }); + + it("returns 0 for count <= 0", () => { + expect(calculateBillingDisableMs(0)).toBe(0); + expect(calculateBillingDisableMs(-1)).toBe(0); + }); +}); + +// ============================================================ +// isProfileInCooldown / resolveProfileUnusableUntil +// ============================================================ + +describe("isProfileInCooldown", () => { + const now = 1_000_000; + + it("returns false for empty stats", () => { + expect(isProfileInCooldown({}, now)).toBe(false); + }); + + it("returns true when cooldownUntil is in the future", () => { + expect(isProfileInCooldown({ cooldownUntil: now + 1000 }, now)).toBe(true); + }); + + it("returns false when cooldownUntil has passed", () => { + expect(isProfileInCooldown({ cooldownUntil: now - 1 }, now)).toBe(false); + }); + + it("returns true when disabledUntil is in the future", () => { + expect(isProfileInCooldown({ disabledUntil: now + 1000 }, now)).toBe(true); + }); + + it("uses max of cooldownUntil and disabledUntil", () => { + const stats: ProfileUsageStats = { + cooldownUntil: now - 1, + disabledUntil: now + 5000, + }; + expect(isProfileInCooldown(stats, now)).toBe(true); + expect(resolveProfileUnusableUntil(stats)).toBe(now + 5000); + }); +}); + +// ============================================================ +// computeNextProfileUsageStats +// ============================================================ + +describe("computeNextProfileUsageStats", () => { + const now = 1_700_000_000_000; + + it("increments errorCount and sets cooldown for non-billing failure", () => { + const next = computeNextProfileUsageStats({}, "rate_limit", now); + expect(next.errorCount).toBe(1); + expect(next.lastFailureAt).toBe(now); + expect(next.cooldownUntil).toBe(now + COOLDOWN_BASE_MS); + expect(next.failureCounts?.rate_limit).toBe(1); + expect(next.disabledUntil).toBeUndefined(); + }); + + it("applies exponential backoff on consecutive failures", () => { + const stats: ProfileUsageStats = { + errorCount: 2, + lastFailureAt: now - 1000, + failureCounts: { rate_limit: 2 }, + }; + const next = computeNextProfileUsageStats(stats, "rate_limit", now); + expect(next.errorCount).toBe(3); + // Error 3 -> 25 min cooldown + expect(next.cooldownUntil).toBe(now + 25 * 60_000); + }); + + it("sets disabledUntil for billing failures (~5h by default)", () => { + const next = computeNextProfileUsageStats({}, "billing", now); + expect(next.errorCount).toBe(1); + expect(next.disabledUntil).toBe(now + 5 * 60 * 60 * 1000); + expect(next.disabledReason).toBe("billing"); + expect(next.failureCounts?.billing).toBe(1); + }); + + it("resets counters when lastFailureAt is outside the failure window", () => { + const oldFailure = now - FAILURE_WINDOW_MS - 1000; + const stats: ProfileUsageStats = { + errorCount: 5, + lastFailureAt: oldFailure, + failureCounts: { auth: 3, rate_limit: 2 }, + }; + const next = computeNextProfileUsageStats(stats, "auth", now); + // Counters reset, so this is treated as error #1 + expect(next.errorCount).toBe(1); + expect(next.failureCounts?.auth).toBe(1); + expect(next.cooldownUntil).toBe(now + COOLDOWN_BASE_MS); + }); + + it("caps cooldown at COOLDOWN_MAX_MS", () => { + const stats: ProfileUsageStats = { + errorCount: 10, + lastFailureAt: now - 1000, + }; + const next = computeNextProfileUsageStats(stats, "unknown", now); + expect(next.cooldownUntil).toBe(now + COOLDOWN_MAX_MS); + }); +}); diff --git a/src/agent/auth-profiles/usage.ts b/src/agent/auth-profiles/usage.ts new file mode 100644 index 00000000..181c78de --- /dev/null +++ b/src/agent/auth-profiles/usage.ts @@ -0,0 +1,169 @@ +/** + * Auth Profile Usage Tracking + * + * Tracks per-profile usage, computes cooldown durations with exponential backoff, + * and manages failure/success state transitions. + */ + +import { + COOLDOWN_BASE_MS, + COOLDOWN_FACTOR, + COOLDOWN_MAX_MS, + BILLING_BACKOFF_HOURS, + BILLING_MAX_HOURS, + FAILURE_WINDOW_MS, +} from "./constants.js"; +import { updateAuthProfileStore } from "./store.js"; +import type { + AuthProfileFailureReason, + AuthProfileStore, + ProfileUsageStats, +} from "./types.js"; + +// ============================================================ +// Cooldown checks +// ============================================================ + +/** Returns the timestamp until which a profile is unusable (0 if available) */ +export function resolveProfileUnusableUntil(stats: ProfileUsageStats): number { + return Math.max(stats.cooldownUntil ?? 0, stats.disabledUntil ?? 0); +} + +/** Check if a profile is currently in cooldown or disabled */ +export function isProfileInCooldown(stats: ProfileUsageStats, now?: number): boolean { + return resolveProfileUnusableUntil(stats) > (now ?? Date.now()); +} + +// ============================================================ +// Cooldown duration calculation +// ============================================================ + +/** + * Calculate non-billing cooldown duration in milliseconds. + * Exponential backoff: 1min -> 5min -> 25min -> 1hr (cap). + * + * Formula: min(COOLDOWN_MAX_MS, COOLDOWN_BASE_MS * COOLDOWN_FACTOR ^ min(errorCount - 1, 3)) + */ +export function calculateCooldownMs(errorCount: number): number { + if (errorCount <= 0) return 0; + const exponent = Math.min(errorCount - 1, 3); + return Math.min(COOLDOWN_MAX_MS, COOLDOWN_BASE_MS * COOLDOWN_FACTOR ** exponent); +} + +/** + * Calculate billing disable duration in milliseconds. + * Exponential backoff: 5h -> 10h -> 20h -> 24h (cap). + * + * Formula: min(BILLING_MAX_HOURS, BILLING_BACKOFF_HOURS * 2 ^ (count - 1)) * hours_to_ms + */ +export function calculateBillingDisableMs(billingFailCount: number): number { + if (billingFailCount <= 0) return 0; + const hours = Math.min( + BILLING_MAX_HOURS, + BILLING_BACKOFF_HOURS * 2 ** (billingFailCount - 1), + ); + return hours * 60 * 60 * 1000; +} + +// ============================================================ +// State transitions +// ============================================================ + +function ensureUsageStats(store: AuthProfileStore, profileId: string): ProfileUsageStats { + if (!store.usageStats) store.usageStats = {}; + if (!store.usageStats[profileId]) store.usageStats[profileId] = {}; + return store.usageStats[profileId]; +} + +/** + * Compute updated usage stats after a failure. + * Pure function — does not mutate the input stats. + */ +export function computeNextProfileUsageStats( + stats: ProfileUsageStats, + reason: AuthProfileFailureReason, + now?: number, +): ProfileUsageStats { + const ts = now ?? Date.now(); + const next = { ...stats }; + + // Reset counters if last failure is outside the failure window + if (next.lastFailureAt && ts - next.lastFailureAt > FAILURE_WINDOW_MS) { + next.errorCount = 0; + next.failureCounts = {}; + } + + // Increment counters + next.errorCount = (next.errorCount ?? 0) + 1; + next.lastFailureAt = ts; + + if (!next.failureCounts) next.failureCounts = {}; + next.failureCounts = { + ...next.failureCounts, + [reason]: (next.failureCounts[reason] ?? 0) + 1, + }; + + // Apply cooldown based on failure reason + if (reason === "billing") { + const billingCount = next.failureCounts.billing ?? 1; + const disableMs = calculateBillingDisableMs(billingCount); + next.disabledUntil = ts + disableMs; + next.disabledReason = "billing"; + } else { + const cooldownMs = calculateCooldownMs(next.errorCount); + next.cooldownUntil = ts + cooldownMs; + } + + return next; +} + +/** + * Mark a profile as having failed. Persists updated stats to disk. + */ +export function markAuthProfileFailure( + profileId: string, + reason: AuthProfileFailureReason, + now?: number, +): void { + updateAuthProfileStore((store) => { + const current = ensureUsageStats(store, profileId); + const next = computeNextProfileUsageStats(current, reason, now); + store.usageStats![profileId] = next; + }); +} + +/** + * Mark a profile as successfully used. Resets all cooldown/error state. + */ +export function markAuthProfileUsed(profileId: string, now?: number): void { + updateAuthProfileStore((store) => { + const stats = ensureUsageStats(store, profileId); + stats.lastUsed = now ?? Date.now(); + stats.errorCount = 0; + stats.cooldownUntil = undefined; + stats.disabledUntil = undefined; + stats.disabledReason = undefined; + stats.failureCounts = undefined; + }); +} + +/** + * Mark a profile as the last known good for a provider. + */ +export function markAuthProfileGood(provider: string, profileId: string): void { + updateAuthProfileStore((store) => { + if (!store.lastGood) store.lastGood = {}; + store.lastGood[provider] = profileId; + }); +} + +/** + * Clear cooldown for a specific profile. + */ +export function clearAuthProfileCooldown(profileId: string): void { + updateAuthProfileStore((store) => { + const stats = ensureUsageStats(store, profileId); + stats.errorCount = 0; + stats.cooldownUntil = undefined; + }); +} From dcc336f2d03101d15edc14be4cd1611c093b74bb Mon Sep 17 00:00:00 2001 From: yushen Date: Tue, 3 Feb 2026 16:56:04 +0800 Subject: [PATCH 09/25] feat(agent): integrate auth profile rotation into runner and resolver Extend credentials.ts with llm.order and listProfileIdsForProvider. Add resolveApiKeyForProfile and resolveApiKeyForProvider to resolver. Modify runner to support dynamic API key swapping and automatic rotation on auth/rate_limit/billing errors with retry. Co-Authored-By: Claude Opus 4.5 --- src/agent/credentials.ts | 26 +++++ src/agent/providers/index.ts | 2 + src/agent/providers/resolver.ts | 71 ++++++++++++ src/agent/runner.ts | 184 +++++++++++++++++++++++++++++--- src/agent/types.ts | 2 + 5 files changed, 273 insertions(+), 12 deletions(-) diff --git a/src/agent/credentials.ts b/src/agent/credentials.ts index 6e1e3dc5..5f4c7555 100644 --- a/src/agent/credentials.ts +++ b/src/agent/credentials.ts @@ -21,6 +21,8 @@ export type CredentialsConfig = { llm?: { provider?: string | undefined; providers?: Record | undefined; + /** Explicit profile ordering per provider (e.g. { anthropic: ["anthropic", "anthropic:backup"] }) */ + order?: Record | undefined; } | undefined; tools?: Record | undefined; }; @@ -185,6 +187,30 @@ export class CredentialManager { return name in process.env; } + /** + * Get explicit profile order for a provider from credentials.json5 `llm.order`. + * Returns undefined if no explicit order is configured. + */ + getLlmOrder(provider: string): string[] | undefined { + this.loadCore(); + return this.coreConfig?.llm?.order?.[provider]; + } + + /** + * List all profile IDs from `llm.providers` that belong to a given provider. + * A profile matches if its key equals the provider exactly or starts with "provider:". + */ + listProfileIdsForProvider(provider: string): string[] { + this.loadCore(); + const providers = this.coreConfig?.llm?.providers; + if (!providers) return []; + + const prefix = `${provider}:`; + return Object.keys(providers).filter( + (key) => key === provider || key.startsWith(prefix), + ); + } + getResolvedEnvSnapshot(): Record { return { ...this.getResolvedSkillsEnv() }; } diff --git a/src/agent/providers/index.ts b/src/agent/providers/index.ts index 25108916..9cce3f56 100644 --- a/src/agent/providers/index.ts +++ b/src/agent/providers/index.ts @@ -28,6 +28,8 @@ export { type ProviderConfig, resolveProviderConfig, resolveApiKey, + resolveApiKeyForProfile, + resolveApiKeyForProvider, resolveBaseUrl, resolveModelId, resolveModel, diff --git a/src/agent/providers/resolver.ts b/src/agent/providers/resolver.ts index 7ec8dd14..7a18ef88 100644 --- a/src/agent/providers/resolver.ts +++ b/src/agent/providers/resolver.ts @@ -18,6 +18,12 @@ import { isOAuthProvider, } from "./registry.js"; import type { AgentOptions } from "../types.js"; +import { + loadAuthProfileStore, + resolveAuthProfileOrder, + isProfileInCooldown, +} from "../auth-profiles/index.js"; +import type { ResolvedProfileAuth } from "../auth-profiles/index.js"; // ============================================================ // Types @@ -128,6 +134,71 @@ export function resolveModelId(provider: string, explicitModel?: string): string return credentialManager.getLlmProviderConfig(provider)?.model ?? getDefaultModel(provider); } +// ============================================================ +// Profile-aware API Key Resolution +// ============================================================ + +/** + * Resolve API key for a specific auth profile ID. + * Profile IDs follow the convention: "provider" or "provider:label". + */ +export function resolveApiKeyForProfile(profileId: string): string | undefined { + const config = credentialManager.getLlmProviderConfig(profileId); + return config?.apiKey; +} + +/** + * Resolve API key by iterating auth profiles for a provider. + * Returns the first available (non-cooldown) profile with a valid key. + * Falls back to the legacy single-key resolution if no profiles are configured. + */ +export function resolveApiKeyForProvider( + provider: string, + explicitKey?: string, +): ResolvedProfileAuth | undefined { + if (explicitKey) { + return { apiKey: explicitKey, profileId: provider, provider }; + } + + // Try OAuth providers first + const providerConfig = resolveProviderConfig(provider); + if (providerConfig?.apiKey || providerConfig?.accessToken) { + const key = providerConfig.apiKey ?? providerConfig.accessToken; + if (key) return { apiKey: key, profileId: provider, provider }; + } + + // Try auth profiles (multi-key rotation) + const store = loadAuthProfileStore(); + const candidates = resolveAuthProfileOrder(provider, store); + + if (candidates.length > 0) { + for (const profileId of candidates) { + const stats = store.usageStats?.[profileId]; + if (stats && isProfileInCooldown(stats)) continue; + + const apiKey = resolveApiKeyForProfile(profileId); + if (apiKey) { + return { apiKey, profileId, provider }; + } + } + // All in cooldown — return the first one (will be retried when cooldown expires) + for (const profileId of candidates) { + const apiKey = resolveApiKeyForProfile(profileId); + if (apiKey) { + return { apiKey, profileId, provider }; + } + } + } + + // Fall back to single-key credentials.json5 + const fallbackKey = credentialManager.getLlmProviderConfig(provider)?.apiKey; + if (fallbackKey) { + return { apiKey: fallbackKey, profileId: provider, provider }; + } + + return undefined; +} + // ============================================================ // Model Resolution // ============================================================ diff --git a/src/agent/runner.ts b/src/agent/runner.ts index 90f5416a..695a0467 100644 --- a/src/agent/runner.ts +++ b/src/agent/runner.ts @@ -3,7 +3,13 @@ import { v7 as uuidv7 } from "uuid"; import type { AgentOptions, AgentRunResult } from "./types.js"; import { createAgentOutput } from "./cli/output.js"; import { resolveModel, resolveTools } from "./tools.js"; -import { resolveApiKey, resolveBaseUrl, resolveModelId } from "./providers/index.js"; +import { + resolveApiKey, + resolveApiKeyForProfile, + resolveApiKeyForProvider, + resolveBaseUrl, + resolveModelId, +} from "./providers/index.js"; import { SessionManager } from "./session/session-manager.js"; import { ProfileManager } from "./profile/index.js"; import { SkillManager } from "./skills/index.js"; @@ -14,6 +20,42 @@ import { type ContextWindowGuardResult, } from "./context-window/index.js"; import { mergeToolsConfig, type ToolsConfig } from "./tools/policy.js"; +import { + loadAuthProfileStore, + resolveAuthProfileOrder, + isProfileInCooldown, + markAuthProfileFailure, + markAuthProfileUsed, + markAuthProfileGood, +} from "./auth-profiles/index.js"; +import type { AuthProfileFailureReason } from "./auth-profiles/index.js"; + +// ============================================================ +// Error classification for auth profile rotation +// ============================================================ + +function classifyError(error: unknown): AuthProfileFailureReason { + const msg = error instanceof Error ? error.message.toLowerCase() : String(error).toLowerCase(); + + if (msg.includes("401") || msg.includes("403") || msg.includes("unauthorized") || msg.includes("invalid api key") || msg.includes("authentication")) { + return "auth"; + } + if (msg.includes("429") || msg.includes("rate limit") || msg.includes("rate_limit") || msg.includes("too many requests")) { + return "rate_limit"; + } + if (msg.includes("billing") || msg.includes("quota") || msg.includes("insufficient") || msg.includes("payment")) { + return "billing"; + } + if (msg.includes("timeout") || msg.includes("timed out") || msg.includes("econnreset") || msg.includes("etimedout")) { + return "timeout"; + } + return "unknown"; +} + +/** Check if an error is potentially retryable via profile rotation */ +function isRotatableError(reason: AuthProfileFailureReason): boolean { + return reason === "auth" || reason === "rate_limit" || reason === "billing"; +} export class Agent { private readonly agent: PiAgentCore; @@ -23,24 +65,67 @@ export class Agent { private readonly skillManager?: SkillManager; private readonly contextWindowGuard: ContextWindowGuardResult; private readonly debug: boolean; + private readonly stderr: NodeJS.WritableStream; + + // Auth profile rotation state + private readonly resolvedProvider: string; + private currentApiKey: string | undefined; + private currentProfileId: string | undefined; + private profileCandidates: string[]; + private profileIndex: number; + private readonly pinnedProfile: boolean; /** Current session ID */ readonly sessionId: string; constructor(options: AgentOptions = {}) { const stdout = options.logger?.stdout ?? process.stdout; - const stderr = options.logger?.stderr ?? process.stderr; - this.output = createAgentOutput({ stdout, stderr }); + this.stderr = options.logger?.stderr ?? process.stderr; + this.output = createAgentOutput({ stdout, stderr: this.stderr }); this.debug = options.debug ?? false; // Resolve provider and model from options > env vars > defaults - const resolvedProvider = options.provider ?? credentialManager.getLlmProvider() ?? "kimi-coding"; - const resolvedModel = resolveModelId(resolvedProvider, options.model); - const apiKey = resolveApiKey(resolvedProvider, options.apiKey); + this.resolvedProvider = options.provider ?? credentialManager.getLlmProvider() ?? "kimi-coding"; + const resolvedModel = resolveModelId(this.resolvedProvider, options.model); + + // === Auth profile resolution === + this.pinnedProfile = !!(options.authProfileId || options.apiKey); + + if (options.apiKey) { + // Explicit API key — no rotation + this.currentApiKey = options.apiKey; + this.currentProfileId = this.resolvedProvider; + this.profileCandidates = []; + this.profileIndex = 0; + } else if (options.authProfileId) { + // Pinned profile — no rotation + this.currentApiKey = resolveApiKeyForProfile(options.authProfileId) + ?? resolveApiKey(this.resolvedProvider); + this.currentProfileId = options.authProfileId; + this.profileCandidates = []; + this.profileIndex = 0; + } else { + // Profile-aware resolution with rotation support + const resolved = resolveApiKeyForProvider(this.resolvedProvider); + if (resolved) { + this.currentApiKey = resolved.apiKey; + this.currentProfileId = resolved.profileId; + } else { + this.currentApiKey = undefined; + this.currentProfileId = undefined; + } + + // Load full candidate list for rotation + const store = loadAuthProfileStore(); + this.profileCandidates = resolveAuthProfileOrder(this.resolvedProvider, store); + this.profileIndex = this.currentProfileId + ? Math.max(0, this.profileCandidates.indexOf(this.currentProfileId)) + : 0; + } this.agent = new PiAgentCore( - apiKey - ? { getApiKey: (_provider: string) => apiKey } + this.currentApiKey + ? { getApiKey: (_provider: string) => this.currentApiKey! } : {}, ); @@ -86,7 +171,7 @@ export class Agent { return tempSession.getMeta(); })(); - const effectiveProvider = resolvedModel ? resolvedProvider : (options.provider ?? storedMeta?.provider); + const effectiveProvider = resolvedModel ? this.resolvedProvider : (options.provider ?? storedMeta?.provider); const effectiveModel = resolvedModel ?? options.model ?? storedMeta?.model; let model = resolveModel({ ...options, provider: effectiveProvider, model: effectiveModel }); @@ -112,7 +197,7 @@ export class Agent { // 警告:context window 较小 if (this.contextWindowGuard.shouldWarn) { - stderr.write( + this.stderr.write( `[Context Window Guard] WARNING: Low context window: ${this.contextWindowGuard.tokens} tokens (source: ${this.contextWindowGuard.source})\n`, ); } @@ -130,7 +215,7 @@ export class Agent { // 获取 API Key(用于 summary 模式) const summaryApiKey = compactionMode === "summary" - ? resolveApiKey(resolvedProvider, options.apiKey) + ? resolveApiKey(this.resolvedProvider, options.apiKey) : undefined; // 创建 SessionManager(带 context window 配置) @@ -208,6 +293,10 @@ export class Agent { this.output.handleEvent(event); this.handleSessionEvent(event); }); + + if (this.debug && this.currentProfileId) { + console.error(`[debug] Auth profile: ${this.currentProfileId} (pinned=${this.pinnedProfile}, candidates=${this.profileCandidates.length})`); + } } /** Subscribe to raw AgentEvent from the underlying engine */ @@ -217,10 +306,81 @@ export class Agent { async run(prompt: string): Promise { this.output.state.lastAssistantText = ""; - await this.agent.prompt(prompt); + + try { + await this.agent.prompt(prompt); + } catch (error) { + // Attempt auth profile rotation on retryable errors + if (!this.pinnedProfile && this.profileCandidates.length > 1 && this.currentProfileId) { + const reason = classifyError(error); + if (isRotatableError(reason)) { + markAuthProfileFailure(this.currentProfileId, reason); + + if (this.debug) { + this.stderr.write( + `[auth-profile] Profile "${this.currentProfileId}" failed (${reason}), attempting rotation...\n`, + ); + } + + if (this.advanceAuthProfile()) { + if (this.debug) { + this.stderr.write( + `[auth-profile] Rotated to profile "${this.currentProfileId}"\n`, + ); + } + // Retry with new profile + this.output.state.lastAssistantText = ""; + await this.agent.prompt(prompt); + } else { + throw error; // No more profiles to try + } + } else { + throw error; // Non-rotatable error + } + } else { + throw error; // Pinned profile or single profile + } + } + + // Mark success + if (this.currentProfileId) { + markAuthProfileUsed(this.currentProfileId); + markAuthProfileGood(this.resolvedProvider, this.currentProfileId); + } + return { text: this.output.state.lastAssistantText, error: this.agent.state.error }; } + /** + * Advance to the next non-cooldown auth profile. + * Returns true if a new profile was activated, false if exhausted. + */ + private advanceAuthProfile(): boolean { + const store = loadAuthProfileStore(); + const startIndex = this.profileIndex; + + for (let i = 1; i < this.profileCandidates.length; i++) { + const nextIndex = (startIndex + i) % this.profileCandidates.length; + const candidateId = this.profileCandidates[nextIndex] as string | undefined; + if (!candidateId) continue; + + // Skip profiles in cooldown + const stats = store.usageStats?.[candidateId]; + if (stats && isProfileInCooldown(stats)) continue; + + // Try to resolve API key + const apiKey = resolveApiKeyForProfile(candidateId); + if (!apiKey) continue; + + this.currentApiKey = apiKey; + this.currentProfileId = candidateId; + this.profileIndex = nextIndex; + return true; + } + + return false; + } + private handleSessionEvent(event: AgentEvent) { if (event.type === "message_end") { const message = event.message as AgentMessage; diff --git a/src/agent/types.ts b/src/agent/types.ts index 75e53ad1..c7e37658 100644 --- a/src/agent/types.ts +++ b/src/agent/types.ts @@ -21,6 +21,8 @@ export type AgentOptions = { model?: string | undefined; /** Custom API key (overrides environment variable) */ apiKey?: string | undefined; + /** Pin a specific auth profile ID (e.g. "anthropic:backup"). Disables rotation. */ + authProfileId?: string | undefined; /** Custom base URL for the provider endpoint */ baseUrl?: string | undefined; /** System prompt, if profileId is set will auto-construct from profile */ From 918b5d294d595858d7c5f79e775cc3e2f9990214 Mon Sep 17 00:00:00 2001 From: yushen Date: Tue, 3 Feb 2026 17:01:49 +0800 Subject: [PATCH 10/25] fix(agent): resolve stream race condition and add lifecycle tests Replace for-await stream consumption in watchChildAgent with waitForIdle() + onClose() callbacks on AsyncAgent. This prevents conflict with Hub.consumeAgent() which also reads the Channel. Add shutdownSubagentRegistry() for clean Hub shutdown, guard Hub access with isHubInitialized(), and clean resumedRuns in sweep. Co-Authored-By: Claude Opus 4.5 --- src/agent/async-agent.ts | 26 ++++- src/agent/subagent/index.ts | 1 + src/agent/subagent/registry.test.ts | 161 ++++++++++++++++++++++++++++ src/agent/subagent/registry.ts | 125 +++++++++++---------- 4 files changed, 254 insertions(+), 59 deletions(-) create mode 100644 src/agent/subagent/registry.test.ts diff --git a/src/agent/async-agent.ts b/src/agent/async-agent.ts index 97b47378..c5bcdc07 100644 --- a/src/agent/async-agent.ts +++ b/src/agent/async-agent.ts @@ -14,6 +14,7 @@ export class AsyncAgent { private readonly channel = new Channel(); private _closed = false; private queue: Promise = Promise.resolve(); + private closeCallbacks: Array<() => void> = []; readonly sessionId: string; constructor(options?: AgentOptions) { @@ -57,10 +58,33 @@ export class AsyncAgent { return this.channel; } - /** Close agent, stop all reads */ + /** Returns a promise that resolves when the current message queue is drained */ + waitForIdle(): Promise { + return this.queue; + } + + /** Register a callback to be invoked when the agent is closed */ + onClose(callback: () => void): void { + if (this._closed) { + // Already closed, fire immediately + callback(); + return; + } + this.closeCallbacks.push(callback); + } + + /** Close agent, stop all reads, fire close callbacks */ close(): void { if (this._closed) return; this._closed = true; this.channel.close(); + for (const cb of this.closeCallbacks) { + try { + cb(); + } catch { + // Don't let callback errors prevent other callbacks + } + } + this.closeCallbacks = []; } } diff --git a/src/agent/subagent/index.ts b/src/agent/subagent/index.ts index d0a24d99..2785d86e 100644 --- a/src/agent/subagent/index.ts +++ b/src/agent/subagent/index.ts @@ -20,6 +20,7 @@ export { releaseSubagentRun, getSubagentRun, resetSubagentRegistryForTests, + shutdownSubagentRegistry, } from "./registry.js"; export { diff --git a/src/agent/subagent/registry.test.ts b/src/agent/subagent/registry.test.ts new file mode 100644 index 00000000..dda78917 --- /dev/null +++ b/src/agent/subagent/registry.test.ts @@ -0,0 +1,161 @@ +import { describe, it, expect, beforeEach } from "vitest"; +import { + registerSubagentRun, + listSubagentRuns, + getSubagentRun, + releaseSubagentRun, + resetSubagentRegistryForTests, + shutdownSubagentRegistry, +} from "./registry.js"; + +// Note: These tests exercise the registry's in-memory state management. +// They do NOT test the full lifecycle (which requires a live Hub + AsyncAgent). + +beforeEach(() => { + resetSubagentRegistryForTests(); +}); + +describe("subagent registry", () => { + it("registers a run and retrieves it by ID", () => { + const record = registerSubagentRun({ + runId: "run-1", + childSessionId: "child-1", + requesterSessionId: "parent-1", + task: "Analyze code", + label: "Code Analysis", + }); + + expect(record.runId).toBe("run-1"); + expect(record.childSessionId).toBe("child-1"); + expect(record.requesterSessionId).toBe("parent-1"); + expect(record.task).toBe("Analyze code"); + expect(record.label).toBe("Code Analysis"); + expect(record.cleanup).toBe("delete"); // default + expect(record.createdAt).toBeGreaterThan(0); + expect(record.startedAt).toBeGreaterThan(0); // set by watchChildAgent + + const retrieved = getSubagentRun("run-1"); + expect(retrieved).toBe(record); + }); + + it("lists runs filtered by requester session", () => { + registerSubagentRun({ + runId: "run-1", + childSessionId: "child-1", + requesterSessionId: "parent-A", + task: "Task 1", + }); + registerSubagentRun({ + runId: "run-2", + childSessionId: "child-2", + requesterSessionId: "parent-B", + task: "Task 2", + }); + registerSubagentRun({ + runId: "run-3", + childSessionId: "child-3", + requesterSessionId: "parent-A", + task: "Task 3", + }); + + const parentARuns = listSubagentRuns("parent-A"); + expect(parentARuns).toHaveLength(2); + expect(parentARuns.map((r) => r.runId).sort()).toEqual(["run-1", "run-3"]); + + const parentBRuns = listSubagentRuns("parent-B"); + expect(parentBRuns).toHaveLength(1); + expect(parentBRuns[0]!.runId).toBe("run-2"); + + const emptyRuns = listSubagentRuns("parent-C"); + expect(emptyRuns).toHaveLength(0); + }); + + it("releases a run from the registry", () => { + registerSubagentRun({ + runId: "run-1", + childSessionId: "child-1", + requesterSessionId: "parent-1", + task: "Task", + }); + + expect(getSubagentRun("run-1")).toBeDefined(); + + const released = releaseSubagentRun("run-1"); + expect(released).toBe(true); + expect(getSubagentRun("run-1")).toBeUndefined(); + + // Double release returns false + const releasedAgain = releaseSubagentRun("run-1"); + expect(releasedAgain).toBe(false); + }); + + it("applies custom cleanup value", () => { + const record = registerSubagentRun({ + runId: "run-keep", + childSessionId: "child-1", + requesterSessionId: "parent-1", + task: "Keep session", + cleanup: "keep", + }); + + expect(record.cleanup).toBe("keep"); + }); + + it("registers a run and ends it with error when Hub is not available", () => { + // Without Hub initialized, watchChildAgent detects missing Hub + // and immediately ends the run with an error + registerSubagentRun({ + runId: "run-no-hub", + childSessionId: "child-1", + requesterSessionId: "parent-1", + task: "Running task", + }); + + const record = getSubagentRun("run-no-hub"); + expect(record?.startedAt).toBeGreaterThan(0); + expect(record?.endedAt).toBeGreaterThan(0); + expect(record?.outcome?.status).toBe("error"); + expect(record?.outcome?.error).toContain("Hub not initialized"); + }); + + it("shutdownSubagentRegistry marks unfinished runs as ended", () => { + // Directly set up a record without going through watchChildAgent + // to simulate a run that is still active + registerSubagentRun({ + runId: "run-active", + childSessionId: "child-1", + requesterSessionId: "parent-1", + task: "Running task", + }); + + // The above run already ended due to no Hub; reset its endedAt + // to simulate a truly active run + const record = getSubagentRun("run-active"); + if (record) { + record.endedAt = undefined; + record.outcome = undefined; + } + + shutdownSubagentRegistry(); + + const after = getSubagentRun("run-active"); + expect(after?.endedAt).toBeGreaterThan(0); + expect(after?.outcome?.status).toBe("unknown"); + }); + + it("resetSubagentRegistryForTests clears all state", () => { + registerSubagentRun({ + runId: "run-1", + childSessionId: "child-1", + requesterSessionId: "parent-1", + task: "Task", + }); + + expect(listSubagentRuns("parent-1")).toHaveLength(1); + + resetSubagentRegistryForTests(); + + expect(listSubagentRuns("parent-1")).toHaveLength(0); + expect(getSubagentRun("run-1")).toBeUndefined(); + }); +}); diff --git a/src/agent/subagent/registry.ts b/src/agent/subagent/registry.ts index 9915e4a0..b2cc8446 100644 --- a/src/agent/subagent/registry.ts +++ b/src/agent/subagent/registry.ts @@ -5,7 +5,7 @@ * watches for child completion, and triggers announce flow. */ -import { getHub } from "../../hub/hub-singleton.js"; +import { getHub, isHubInitialized } from "../../hub/hub-singleton.js"; import { loadSubagentRuns, saveSubagentRuns } from "./registry-store.js"; import { runSubagentAnnounceFlow } from "./announce.js"; import type { @@ -128,6 +128,27 @@ export function getSubagentRun(runId: string): SubagentRunRecord | undefined { return subagentRuns.get(runId); } +/** Mark all active (non-ended) runs as ended with "unknown" status. Called during Hub shutdown. */ +export function shutdownSubagentRegistry(): void { + const now = Date.now(); + let updated = 0; + + for (const record of subagentRuns.values()) { + if (!record.endedAt) { + record.endedAt = now; + record.outcome = { status: "unknown" }; + updated++; + } + } + + if (updated > 0) { + persist(); + console.log(`[SubagentRegistry] Marked ${updated} active run(s) as ended during shutdown`); + } + + stopSweeper(); +} + /** Reset all state (for testing). */ export function resetSubagentRegistryForTests(): void { subagentRuns.clear(); @@ -140,78 +161,65 @@ export function resetSubagentRegistryForTests(): void { // ============================================================================ function watchChildAgent(record: SubagentRunRecord, timeoutSeconds?: number): void { - const { runId, childSessionId } = record; + const { childSessionId } = record; // Mark as started record.startedAt = Date.now(); persist(); + const cleanup = (outcome: { status: "ok" | "error" | "timeout" | "unknown"; error?: string | undefined }) => { + if (record.endedAt) return; // Already finalized + if (timeoutTimer) clearTimeout(timeoutTimer); + record.endedAt = Date.now(); + record.outcome = outcome; + persist(); + handleRunCompletion(record); + }; + // Set up timeout if specified let timeoutTimer: ReturnType | undefined; if (timeoutSeconds && timeoutSeconds > 0) { timeoutTimer = setTimeout(() => { - if (!record.endedAt) { - record.endedAt = Date.now(); - record.outcome = { status: "timeout" }; - persist(); + cleanup({ status: "timeout" }); - // Try to close the child agent - try { - const hub = getHub(); - hub.closeAgent(childSessionId); - } catch { - // Hub may not be available - } - - handleRunCompletion(record); + // Try to close the child agent + try { + const hub = getHub(); + hub.closeAgent(childSessionId); + } catch { + // Hub may not be available } }, timeoutSeconds * 1000); } - // Watch the child agent's channel for closure - void (async () => { - try { - const hub = getHub(); - const childAgent = hub.getAgent(childSessionId); - if (!childAgent) { - record.endedAt = Date.now(); - record.outcome = { status: "error", error: "Child agent not found" }; - persist(); - handleRunCompletion(record); - return; - } + // Get child agent reference (Hub may not be available in tests) + if (!isHubInitialized()) { + cleanup({ status: "error", error: "Hub not initialized" }); + return; + } - // Consume the child's output stream — when it ends, the agent is done - for await (const item of childAgent.read()) { - // Check for error messages - if ("content" in item && typeof item.content === "string" && item.content.startsWith("[error]")) { - record.outcome = { status: "error", error: item.content }; - } - } + const hub = getHub(); + const childAgent = hub.getAgent(childSessionId); + if (!childAgent) { + cleanup({ status: "error", error: "Child agent not found" }); + return; + } - // Stream ended — child agent completed - if (!record.endedAt) { - if (timeoutTimer) clearTimeout(timeoutTimer); - record.endedAt = Date.now(); - if (!record.outcome) { - record.outcome = { status: "ok" }; - } - persist(); - handleRunCompletion(record); - } - } catch (err) { - if (!record.endedAt) { - if (timeoutTimer) clearTimeout(timeoutTimer); - record.endedAt = Date.now(); - record.outcome = { - status: "error", - error: err instanceof Error ? err.message : String(err), - }; - persist(); - handleRunCompletion(record); - } - } - })(); + // Wait for the child agent's task queue to drain (task completion), + // then trigger announce flow. Uses waitForIdle() instead of consuming + // the stream (which would conflict with Hub.consumeAgent). + childAgent.waitForIdle().then( + () => cleanup({ status: "ok" }), + (err) => cleanup({ + status: "error", + error: err instanceof Error ? err.message : String(err), + }), + ); + + // Also handle explicit close (e.g., timeout kill, Hub shutdown) + childAgent.onClose(() => { + cleanup({ status: record.outcome?.status ?? "unknown" }); + }); } // ============================================================================ @@ -292,8 +300,9 @@ function sweep(): void { let removed = 0; for (const [runId, record] of subagentRuns) { - if (record.archiveAtMs && record.archiveAtMs <= now) { + if (record.archiveAtMs !== undefined && record.archiveAtMs <= now) { subagentRuns.delete(runId); + resumedRuns.delete(runId); removed++; } } From 6bd068a97f73435ff391a126847801e26f4b9181 Mon Sep 17 00:00:00 2001 From: yushen Date: Tue, 3 Feb 2026 17:01:56 +0800 Subject: [PATCH 11/25] fix(hub): init subagent registry on startup and cleanup on shutdown Call initSubagentRegistry() after setHub() in Hub constructor to restore persisted runs. Call shutdownSubagentRegistry() before closing agents in shutdown() to mark active runs as ended. Co-Authored-By: Claude Opus 4.5 --- src/hub/hub.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/hub/hub.ts b/src/hub/hub.ts index bc86bfdb..31818950 100644 --- a/src/hub/hub.ts +++ b/src/hub/hub.ts @@ -12,6 +12,7 @@ import { AsyncAgent } from "../agent/async-agent.js"; import type { AgentOptions } from "../agent/types.js"; import { getHubId } from "./hub-identity.js"; import { setHub } from "./hub-singleton.js"; +import { initSubagentRegistry, shutdownSubagentRegistry } from "../agent/subagent/index.js"; import { loadAgentRecords, addAgentRecord, removeAgentRecord } from "./agent-store.js"; import { RpcDispatcher, RpcError } from "./rpc/dispatcher.js"; import { createGetAgentMessagesHandler } from "./rpc/handlers/get-agent-messages.js"; @@ -53,6 +54,9 @@ export class Hub { // Register as global singleton for cross-module access (subagent tools, announce flow) setHub(this); + // Restore subagent registry from persistent state + initSubagentRegistry(); + this.client = this.createClient(this.url); this.client.connect(); this.restoreAgents(); @@ -292,6 +296,9 @@ export class Hub { } shutdown(): void { + // Finalize subagent registry before closing agents + shutdownSubagentRegistry(); + for (const [id, agent] of this.agents) { agent.close(); this.agents.delete(id); From 1cd778b84570b9a9140a8c3e5150561fd23f8b86 Mon Sep 17 00:00:00 2001 From: yushen Date: Tue, 3 Feb 2026 17:02:03 +0800 Subject: [PATCH 12/25] fix(agent): add task minLength validation, remove unused parentSessionId Add minLength:1 to sessions_spawn task parameter to prevent empty task strings. Remove parentSessionId from AgentOptions as the subagent registry tracks lineage via requesterSessionId. Co-Authored-By: Claude Opus 4.5 --- src/agent/tools/sessions-spawn.ts | 2 +- src/agent/types.ts | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/agent/tools/sessions-spawn.ts b/src/agent/tools/sessions-spawn.ts index a8ca4f96..0dfb5c8c 100644 --- a/src/agent/tools/sessions-spawn.ts +++ b/src/agent/tools/sessions-spawn.ts @@ -13,7 +13,7 @@ import { buildSubagentSystemPrompt } from "../subagent/announce.js"; import { registerSubagentRun } from "../subagent/registry.js"; const SessionsSpawnSchema = Type.Object({ - task: Type.String({ description: "The task for the subagent to perform." }), + task: Type.String({ description: "The task for the subagent to perform.", minLength: 1 }), label: Type.Optional( Type.String({ description: "Human-readable label for this background task." }), ), diff --git a/src/agent/types.ts b/src/agent/types.ts index 06ffb217..75e53ad1 100644 --- a/src/agent/types.ts +++ b/src/agent/types.ts @@ -66,8 +66,6 @@ export type AgentOptions = { tools?: ToolsConfig | undefined; /** Whether this is a subagent (applies restricted tool set) */ isSubagent?: boolean | undefined; - /** Parent session ID (for subagent lineage tracking) */ - parentSessionId?: string | undefined; }; export interface Message { From 37e5b2ce7f700f7a89e7cda184a114e7e53035fe Mon Sep 17 00:00:00 2001 From: yushen Date: Tue, 3 Feb 2026 17:21:15 +0800 Subject: [PATCH 13/25] feat(session): add write lock, file repair, and transcript repair modules Port from OpenClaw: - session-write-lock: file-level write lock with atomic creation, reference counting, stale lock detection, and process cleanup handlers - session-file-repair: auto-detect and repair malformed JSONL lines with backup and atomic rename - session-transcript-repair: fix tool call/result pairing issues including displaced results, duplicates, orphans, and missing inputs Co-Authored-By: Claude Opus 4.5 --- src/agent/session/session-file-repair.test.ts | 80 +++++ src/agent/session/session-file-repair.ts | 96 ++++++ .../session/session-transcript-repair.test.ts | 150 +++++++++ .../session/session-transcript-repair.ts | 295 ++++++++++++++++++ src/agent/session/session-write-lock.test.ts | 160 ++++++++++ src/agent/session/session-write-lock.ts | 208 ++++++++++++ 6 files changed, 989 insertions(+) create mode 100644 src/agent/session/session-file-repair.test.ts create mode 100644 src/agent/session/session-file-repair.ts create mode 100644 src/agent/session/session-transcript-repair.test.ts create mode 100644 src/agent/session/session-transcript-repair.ts create mode 100644 src/agent/session/session-write-lock.test.ts create mode 100644 src/agent/session/session-write-lock.ts diff --git a/src/agent/session/session-file-repair.test.ts b/src/agent/session/session-file-repair.test.ts new file mode 100644 index 00000000..caeebe3e --- /dev/null +++ b/src/agent/session/session-file-repair.test.ts @@ -0,0 +1,80 @@ +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import { describe, expect, it, vi } from "vitest"; +import { repairSessionFileIfNeeded } from "./session-file-repair.js"; + +describe("repairSessionFileIfNeeded", () => { + it("rewrites session files that contain malformed lines", async () => { + const dir = await fs.mkdtemp(path.join(os.tmpdir(), "multica-session-repair-")); + const file = path.join(dir, "session.jsonl"); + const meta = { + type: "meta", + meta: { provider: "kimi", model: "moonshot-v1-128k" }, + timestamp: Date.now(), + }; + const message = { + type: "message", + message: { role: "user", content: "hello" }, + timestamp: Date.now(), + }; + + const content = `${JSON.stringify(meta)}\n${JSON.stringify(message)}\n{"type":"message"`; + await fs.writeFile(file, content, "utf-8"); + + const result = await repairSessionFileIfNeeded({ sessionFile: file }); + expect(result.repaired).toBe(true); + expect(result.droppedLines).toBe(1); + expect(result.backupPath).toBeTruthy(); + + const repaired = await fs.readFile(file, "utf-8"); + expect(repaired.trim().split("\n")).toHaveLength(2); + + if (result.backupPath) { + const backup = await fs.readFile(result.backupPath, "utf-8"); + expect(backup).toBe(content); + } + }); + + it("does not drop CRLF-terminated JSONL lines", async () => { + const dir = await fs.mkdtemp(path.join(os.tmpdir(), "multica-session-repair-")); + const file = path.join(dir, "session.jsonl"); + const meta = { + type: "meta", + meta: { provider: "kimi", model: "moonshot-v1-128k" }, + timestamp: Date.now(), + }; + const message = { + type: "message", + message: { role: "user", content: "hello" }, + timestamp: Date.now(), + }; + const content = `${JSON.stringify(meta)}\r\n${JSON.stringify(message)}\r\n`; + await fs.writeFile(file, content, "utf-8"); + + const result = await repairSessionFileIfNeeded({ sessionFile: file }); + expect(result.repaired).toBe(false); + expect(result.droppedLines).toBe(0); + }); + + it("returns reason when file is empty after dropping all lines", async () => { + const dir = await fs.mkdtemp(path.join(os.tmpdir(), "multica-session-repair-")); + const file = path.join(dir, "session.jsonl"); + await fs.writeFile(file, "{broken\n{also broken\n", "utf-8"); + + const result = await repairSessionFileIfNeeded({ sessionFile: file }); + expect(result.repaired).toBe(false); + expect(result.reason).toBe("empty session file"); + }); + + it("returns a detailed reason when read errors are not ENOENT", async () => { + const dir = await fs.mkdtemp(path.join(os.tmpdir(), "multica-session-repair-")); + const warn = vi.fn(); + + const result = await repairSessionFileIfNeeded({ sessionFile: dir, warn }); + + expect(result.repaired).toBe(false); + expect(result.reason).toContain("failed to read session file"); + expect(warn).toHaveBeenCalledTimes(1); + }); +}); diff --git a/src/agent/session/session-file-repair.ts b/src/agent/session/session-file-repair.ts new file mode 100644 index 00000000..cb284f23 --- /dev/null +++ b/src/agent/session/session-file-repair.ts @@ -0,0 +1,96 @@ +import fs from "node:fs/promises"; +import path from "node:path"; + +type RepairReport = { + repaired: boolean; + droppedLines: number; + backupPath?: string; + reason?: string; +}; + +export type { RepairReport }; + +export async function repairSessionFileIfNeeded(params: { + sessionFile: string; + warn?: (message: string) => void; +}): Promise { + const sessionFile = params.sessionFile.trim(); + if (!sessionFile) { + return { repaired: false, droppedLines: 0, reason: "missing session file" }; + } + + let content: string; + try { + content = await fs.readFile(sessionFile, "utf-8"); + } catch (err) { + const code = (err as { code?: unknown } | undefined)?.code; + if (code === "ENOENT") { + return { repaired: false, droppedLines: 0, reason: "missing session file" }; + } + const reason = `failed to read session file: ${err instanceof Error ? err.message : "unknown error"}`; + params.warn?.(`session file repair skipped: ${reason} (${path.basename(sessionFile)})`); + return { repaired: false, droppedLines: 0, reason }; + } + + const lines = content.split(/\r?\n/); + const entries: unknown[] = []; + let droppedLines = 0; + + for (const line of lines) { + if (!line.trim()) { + continue; + } + try { + const entry = JSON.parse(line); + entries.push(entry); + } catch { + droppedLines += 1; + } + } + + if (entries.length === 0) { + return { repaired: false, droppedLines, reason: "empty session file" }; + } + + if (droppedLines === 0) { + return { repaired: false, droppedLines: 0 }; + } + + const cleaned = `${entries.map((entry) => JSON.stringify(entry)).join("\n")}\n`; + const backupPath = `${sessionFile}.bak-${process.pid}-${Date.now()}`; + const tmpPath = `${sessionFile}.repair-${process.pid}-${Date.now()}.tmp`; + try { + const stat = await fs.stat(sessionFile).catch(() => null); + await fs.writeFile(backupPath, content, "utf-8"); + if (stat) { + await fs.chmod(backupPath, stat.mode); + } + await fs.writeFile(tmpPath, cleaned, "utf-8"); + if (stat) { + await fs.chmod(tmpPath, stat.mode); + } + await fs.rename(tmpPath, sessionFile); + } catch (err) { + try { + await fs.unlink(tmpPath); + } catch (cleanupErr) { + params.warn?.( + `session file repair cleanup failed: ${cleanupErr instanceof Error ? cleanupErr.message : "unknown error"} (${path.basename( + tmpPath, + )})`, + ); + } + return { + repaired: false, + droppedLines, + reason: `repair failed: ${err instanceof Error ? err.message : "unknown error"}`, + }; + } + + params.warn?.( + `session file repaired: dropped ${droppedLines} malformed line(s) (${path.basename( + sessionFile, + )})`, + ); + return { repaired: true, droppedLines, backupPath }; +} diff --git a/src/agent/session/session-transcript-repair.test.ts b/src/agent/session/session-transcript-repair.test.ts new file mode 100644 index 00000000..7607f86f --- /dev/null +++ b/src/agent/session/session-transcript-repair.test.ts @@ -0,0 +1,150 @@ +import type { AgentMessage } from "@mariozechner/pi-agent-core"; +import { describe, expect, it } from "vitest"; +import { + sanitizeToolCallInputs, + sanitizeToolUseResultPairing, +} from "./session-transcript-repair.js"; + +describe("sanitizeToolUseResultPairing", () => { + it("moves tool results directly after tool calls and inserts missing results", () => { + const input = [ + { + role: "assistant", + content: [ + { type: "toolCall", id: "call_1", name: "read", arguments: {} }, + { type: "toolCall", id: "call_2", name: "exec", arguments: {} }, + ], + }, + { role: "user", content: "user message that should come after tool use" }, + { + role: "toolResult", + toolCallId: "call_2", + toolName: "exec", + content: [{ type: "text", text: "ok" }], + isError: false, + }, + ] satisfies AgentMessage[]; + + const out = sanitizeToolUseResultPairing(input); + expect(out[0]?.role).toBe("assistant"); + expect(out[1]?.role).toBe("toolResult"); + expect((out[1] as { toolCallId?: string }).toolCallId).toBe("call_1"); + expect(out[2]?.role).toBe("toolResult"); + expect((out[2] as { toolCallId?: string }).toolCallId).toBe("call_2"); + expect(out[3]?.role).toBe("user"); + }); + + it("drops duplicate tool results for the same id within a span", () => { + const input = [ + { + role: "assistant", + content: [{ type: "toolCall", id: "call_1", name: "read", arguments: {} }], + }, + { + role: "toolResult", + toolCallId: "call_1", + toolName: "read", + content: [{ type: "text", text: "first" }], + isError: false, + }, + { + role: "toolResult", + toolCallId: "call_1", + toolName: "read", + content: [{ type: "text", text: "second" }], + isError: false, + }, + { role: "user", content: "ok" }, + ] satisfies AgentMessage[]; + + const out = sanitizeToolUseResultPairing(input); + expect(out.filter((m) => m.role === "toolResult")).toHaveLength(1); + }); + + it("drops duplicate tool results for the same id across the transcript", () => { + const input = [ + { + role: "assistant", + content: [{ type: "toolCall", id: "call_1", name: "read", arguments: {} }], + }, + { + role: "toolResult", + toolCallId: "call_1", + toolName: "read", + content: [{ type: "text", text: "first" }], + isError: false, + }, + { role: "assistant", content: [{ type: "text", text: "ok" }] }, + { + role: "toolResult", + toolCallId: "call_1", + toolName: "read", + content: [{ type: "text", text: "second (duplicate)" }], + isError: false, + }, + ] satisfies AgentMessage[]; + + const out = sanitizeToolUseResultPairing(input); + const results = out.filter((m) => m.role === "toolResult") as Array<{ + toolCallId?: string; + }>; + expect(results).toHaveLength(1); + expect(results[0]?.toolCallId).toBe("call_1"); + }); + + it("drops orphan tool results that do not match any tool call", () => { + const input = [ + { role: "user", content: "hello" }, + { + role: "toolResult", + toolCallId: "call_orphan", + toolName: "read", + content: [{ type: "text", text: "orphan" }], + isError: false, + }, + { + role: "assistant", + content: [{ type: "text", text: "ok" }], + }, + ] satisfies AgentMessage[]; + + const out = sanitizeToolUseResultPairing(input); + expect(out.some((m) => m.role === "toolResult")).toBe(false); + expect(out.map((m) => m.role)).toEqual(["user", "assistant"]); + }); +}); + +describe("sanitizeToolCallInputs", () => { + it("drops tool calls missing input or arguments", () => { + const input: AgentMessage[] = [ + { + role: "assistant", + content: [{ type: "toolCall", id: "call_1", name: "read" }], + }, + { role: "user", content: "hello" }, + ]; + + const out = sanitizeToolCallInputs(input); + expect(out.map((m) => m.role)).toEqual(["user"]); + }); + + it("keeps valid tool calls and preserves text blocks", () => { + const input: AgentMessage[] = [ + { + role: "assistant", + content: [ + { type: "text", text: "before" }, + { type: "toolUse", id: "call_ok", name: "read", input: { path: "a" } }, + { type: "toolCall", id: "call_drop", name: "read" }, + ], + }, + ]; + + const out = sanitizeToolCallInputs(input); + const assistant = out[0] as Extract; + const types = Array.isArray(assistant.content) + ? assistant.content.map((block) => (block as { type?: unknown }).type) + : []; + expect(types).toEqual(["text", "toolUse"]); + }); +}); diff --git a/src/agent/session/session-transcript-repair.ts b/src/agent/session/session-transcript-repair.ts new file mode 100644 index 00000000..aa43071e --- /dev/null +++ b/src/agent/session/session-transcript-repair.ts @@ -0,0 +1,295 @@ +import type { AgentMessage } from "@mariozechner/pi-agent-core"; + +type ToolCallLike = { + id: string; + name?: string; +}; + +const TOOL_CALL_TYPES = new Set(["toolCall", "toolUse", "functionCall"]); + +type ToolCallBlock = { + type?: unknown; + id?: unknown; + name?: unknown; + input?: unknown; + arguments?: unknown; +}; + +function extractToolCallsFromAssistant( + msg: Extract, +): ToolCallLike[] { + const content = msg.content; + if (!Array.isArray(content)) { + return []; + } + + const toolCalls: ToolCallLike[] = []; + for (const block of content) { + if (!block || typeof block !== "object") { + continue; + } + const rec = block as { type?: unknown; id?: unknown; name?: unknown }; + if (typeof rec.id !== "string" || !rec.id) { + continue; + } + + if (rec.type === "toolCall" || rec.type === "toolUse" || rec.type === "functionCall") { + toolCalls.push({ + id: rec.id, + name: typeof rec.name === "string" ? rec.name : undefined, + }); + } + } + return toolCalls; +} + +function isToolCallBlock(block: unknown): block is ToolCallBlock { + if (!block || typeof block !== "object") { + return false; + } + const type = (block as { type?: unknown }).type; + return typeof type === "string" && TOOL_CALL_TYPES.has(type); +} + +function hasToolCallInput(block: ToolCallBlock): boolean { + const hasInput = "input" in block ? block.input !== undefined && block.input !== null : false; + const hasArguments = + "arguments" in block ? block.arguments !== undefined && block.arguments !== null : false; + return hasInput || hasArguments; +} + +function extractToolResultId(msg: Extract): string | null { + const toolCallId = (msg as { toolCallId?: unknown }).toolCallId; + if (typeof toolCallId === "string" && toolCallId) { + return toolCallId; + } + const toolUseId = (msg as { toolUseId?: unknown }).toolUseId; + if (typeof toolUseId === "string" && toolUseId) { + return toolUseId; + } + return null; +} + +function makeMissingToolResult(params: { + toolCallId: string; + toolName?: string; +}): Extract { + return { + role: "toolResult", + toolCallId: params.toolCallId, + toolName: params.toolName ?? "unknown", + content: [ + { + type: "text", + text: "[multica] missing tool result in session history; inserted synthetic error result for transcript repair.", + }, + ], + isError: true, + timestamp: Date.now(), + } as Extract; +} + +export { makeMissingToolResult }; + +export type ToolCallInputRepairReport = { + messages: AgentMessage[]; + droppedToolCalls: number; + droppedAssistantMessages: number; +}; + +export function repairToolCallInputs(messages: AgentMessage[]): ToolCallInputRepairReport { + let droppedToolCalls = 0; + let droppedAssistantMessages = 0; + let changed = false; + const out: AgentMessage[] = []; + + for (const msg of messages) { + if (!msg || typeof msg !== "object") { + out.push(msg); + continue; + } + + if (msg.role !== "assistant" || !Array.isArray(msg.content)) { + out.push(msg); + continue; + } + + const nextContent = []; + let droppedInMessage = 0; + + for (const block of msg.content) { + if (isToolCallBlock(block) && !hasToolCallInput(block)) { + droppedToolCalls += 1; + droppedInMessage += 1; + changed = true; + continue; + } + nextContent.push(block); + } + + if (droppedInMessage > 0) { + if (nextContent.length === 0) { + droppedAssistantMessages += 1; + changed = true; + continue; + } + out.push({ ...msg, content: nextContent }); + continue; + } + + out.push(msg); + } + + return { + messages: changed ? out : messages, + droppedToolCalls, + droppedAssistantMessages, + }; +} + +export function sanitizeToolCallInputs(messages: AgentMessage[]): AgentMessage[] { + return repairToolCallInputs(messages).messages; +} + +export function sanitizeToolUseResultPairing(messages: AgentMessage[]): AgentMessage[] { + return repairToolUseResultPairing(messages).messages; +} + +export type ToolUseRepairReport = { + messages: AgentMessage[]; + added: Array>; + droppedDuplicateCount: number; + droppedOrphanCount: number; + moved: boolean; +}; + +export function repairToolUseResultPairing(messages: AgentMessage[]): ToolUseRepairReport { + const out: AgentMessage[] = []; + const added: Array> = []; + const seenToolResultIds = new Set(); + let droppedDuplicateCount = 0; + let droppedOrphanCount = 0; + let moved = false; + let changed = false; + + const pushToolResult = (msg: Extract) => { + const id = extractToolResultId(msg); + if (id && seenToolResultIds.has(id)) { + droppedDuplicateCount += 1; + changed = true; + return; + } + if (id) { + seenToolResultIds.add(id); + } + out.push(msg); + }; + + for (let i = 0; i < messages.length; i += 1) { + const msg = messages[i]; + if (!msg || typeof msg !== "object") { + out.push(msg); + continue; + } + + const role = (msg as { role?: unknown }).role; + if (role !== "assistant") { + if (role !== "toolResult") { + out.push(msg); + } else { + droppedOrphanCount += 1; + changed = true; + } + continue; + } + + const assistant = msg as Extract; + const toolCalls = extractToolCallsFromAssistant(assistant); + if (toolCalls.length === 0) { + out.push(msg); + continue; + } + + const toolCallIds = new Set(toolCalls.map((t) => t.id)); + + const spanResultsById = new Map>(); + const remainder: AgentMessage[] = []; + + let j = i + 1; + for (; j < messages.length; j += 1) { + const next = messages[j]; + if (!next || typeof next !== "object") { + remainder.push(next); + continue; + } + + const nextRole = (next as { role?: unknown }).role; + if (nextRole === "assistant") { + break; + } + + if (nextRole === "toolResult") { + const toolResult = next as Extract; + const id = extractToolResultId(toolResult); + if (id && toolCallIds.has(id)) { + if (seenToolResultIds.has(id)) { + droppedDuplicateCount += 1; + changed = true; + continue; + } + if (!spanResultsById.has(id)) { + spanResultsById.set(id, toolResult); + } + continue; + } + } + + if (nextRole !== "toolResult") { + remainder.push(next); + } else { + droppedOrphanCount += 1; + changed = true; + } + } + + out.push(msg); + + if (spanResultsById.size > 0 && remainder.length > 0) { + moved = true; + changed = true; + } + + for (const call of toolCalls) { + const existing = spanResultsById.get(call.id); + if (existing) { + pushToolResult(existing); + } else { + const missing = makeMissingToolResult({ + toolCallId: call.id, + toolName: call.name, + }); + added.push(missing); + changed = true; + pushToolResult(missing); + } + } + + for (const rem of remainder) { + if (!rem || typeof rem !== "object") { + out.push(rem); + continue; + } + out.push(rem); + } + i = j - 1; + } + + const changedOrMoved = changed || moved; + return { + messages: changedOrMoved ? out : messages, + added, + droppedDuplicateCount, + droppedOrphanCount, + moved: changedOrMoved, + }; +} diff --git a/src/agent/session/session-write-lock.test.ts b/src/agent/session/session-write-lock.test.ts new file mode 100644 index 00000000..1eb3f024 --- /dev/null +++ b/src/agent/session/session-write-lock.test.ts @@ -0,0 +1,160 @@ +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import { describe, expect, it } from "vitest"; +import { __testing, acquireSessionWriteLock } from "./session-write-lock.js"; + +describe("acquireSessionWriteLock", () => { + it("reuses locks across symlinked session paths", async () => { + if (process.platform === "win32") { + expect(true).toBe(true); + return; + } + + const root = await fs.mkdtemp(path.join(os.tmpdir(), "multica-lock-")); + try { + const realDir = path.join(root, "real"); + const linkDir = path.join(root, "link"); + await fs.mkdir(realDir, { recursive: true }); + await fs.symlink(realDir, linkDir); + + const sessionReal = path.join(realDir, "sessions.json"); + const sessionLink = path.join(linkDir, "sessions.json"); + + const lockA = await acquireSessionWriteLock({ sessionFile: sessionReal, timeoutMs: 500 }); + const lockB = await acquireSessionWriteLock({ sessionFile: sessionLink, timeoutMs: 500 }); + + await lockB.release(); + await lockA.release(); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } + }); + + it("keeps the lock file until the last release", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "multica-lock-")); + try { + const sessionFile = path.join(root, "sessions.json"); + const lockPath = `${sessionFile}.lock`; + + const lockA = await acquireSessionWriteLock({ sessionFile, timeoutMs: 500 }); + const lockB = await acquireSessionWriteLock({ sessionFile, timeoutMs: 500 }); + + await expect(fs.access(lockPath)).resolves.toBeUndefined(); + await lockA.release(); + await expect(fs.access(lockPath)).resolves.toBeUndefined(); + await lockB.release(); + await expect(fs.access(lockPath)).rejects.toThrow(); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } + }); + + it("reclaims stale lock files", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "multica-lock-")); + try { + const sessionFile = path.join(root, "sessions.json"); + const lockPath = `${sessionFile}.lock`; + await fs.writeFile( + lockPath, + JSON.stringify({ pid: 123456, createdAt: new Date(Date.now() - 60_000).toISOString() }), + "utf8", + ); + + const lock = await acquireSessionWriteLock({ sessionFile, timeoutMs: 500, staleMs: 10 }); + const raw = await fs.readFile(lockPath, "utf8"); + const payload = JSON.parse(raw) as { pid: number }; + + expect(payload.pid).toBe(process.pid); + await lock.release(); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } + }); + + it("removes held locks on termination signals", async () => { + const signals = ["SIGINT", "SIGTERM", "SIGQUIT", "SIGABRT"] as const; + for (const signal of signals) { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "multica-lock-cleanup-")); + // Prevent the signal from actually killing the vitest worker + const keepAlive = () => {}; + process.on(signal, keepAlive); + try { + const sessionFile = path.join(root, "sessions.json"); + const lockPath = `${sessionFile}.lock`; + await acquireSessionWriteLock({ sessionFile, timeoutMs: 500 }); + + __testing.handleTerminationSignal(signal); + + await expect(fs.stat(lockPath)).rejects.toThrow(); + } finally { + process.off(signal, keepAlive); + await fs.rm(root, { recursive: true, force: true }); + } + } + }); + + it("registers cleanup for SIGQUIT and SIGABRT", () => { + expect(__testing.cleanupSignals).toContain("SIGQUIT"); + expect(__testing.cleanupSignals).toContain("SIGABRT"); + }); + + it("cleans up locks on SIGINT without removing other handlers", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "multica-lock-")); + const originalKill = process.kill.bind(process) as typeof process.kill; + const killCalls: Array = []; + let otherHandlerCalled = false; + + process.kill = ((pid: number, signal?: NodeJS.Signals) => { + killCalls.push(signal); + return true; + }) as typeof process.kill; + + const otherHandler = () => { + otherHandlerCalled = true; + }; + + process.on("SIGINT", otherHandler); + + try { + const sessionFile = path.join(root, "sessions.json"); + const lockPath = `${sessionFile}.lock`; + await acquireSessionWriteLock({ sessionFile, timeoutMs: 500 }); + + process.emit("SIGINT"); + + await expect(fs.access(lockPath)).rejects.toThrow(); + expect(otherHandlerCalled).toBe(true); + expect(killCalls).toEqual([]); + } finally { + process.off("SIGINT", otherHandler); + process.kill = originalKill; + await fs.rm(root, { recursive: true, force: true }); + } + }); + + it("cleans up locks via releaseAllLocksSync", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "multica-lock-")); + try { + const sessionFile = path.join(root, "sessions.json"); + const lockPath = `${sessionFile}.lock`; + await acquireSessionWriteLock({ sessionFile, timeoutMs: 500 }); + + __testing.releaseAllLocksSync(); + + await expect(fs.access(lockPath)).rejects.toThrow(); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } + }); + + it("keeps other signal listeners registered", () => { + const keepAlive = () => {}; + process.on("SIGINT", keepAlive); + + __testing.handleTerminationSignal("SIGINT"); + + expect(process.listeners("SIGINT")).toContain(keepAlive); + process.off("SIGINT", keepAlive); + }); +}); diff --git a/src/agent/session/session-write-lock.ts b/src/agent/session/session-write-lock.ts new file mode 100644 index 00000000..7335abaf --- /dev/null +++ b/src/agent/session/session-write-lock.ts @@ -0,0 +1,208 @@ +import fsSync from "node:fs"; +import fs from "node:fs/promises"; +import path from "node:path"; + +type LockFilePayload = { + pid: number; + createdAt: string; +}; + +type HeldLock = { + count: number; + handle: fs.FileHandle; + lockPath: string; +}; + +const HELD_LOCKS = new Map(); +const CLEANUP_SIGNALS = ["SIGINT", "SIGTERM", "SIGQUIT", "SIGABRT"] as const; +type CleanupSignal = (typeof CLEANUP_SIGNALS)[number]; +const cleanupHandlers = new Map void>(); + +function isAlive(pid: number): boolean { + if (!Number.isFinite(pid) || pid <= 0) { + return false; + } + try { + process.kill(pid, 0); + return true; + } catch { + return false; + } +} + +/** + * Synchronously release all held locks. + * Used during process exit when async operations aren't reliable. + */ +function releaseAllLocksSync(): void { + for (const [sessionFile, held] of HELD_LOCKS) { + try { + if (typeof held.handle.close === "function") { + void held.handle.close().catch(() => {}); + } + } catch { + // Ignore errors during cleanup - best effort + } + try { + fsSync.rmSync(held.lockPath, { force: true }); + } catch { + // Ignore errors during cleanup - best effort + } + HELD_LOCKS.delete(sessionFile); + } +} + +let cleanupRegistered = false; + +function handleTerminationSignal(signal: CleanupSignal): void { + releaseAllLocksSync(); + const shouldReraise = process.listenerCount(signal) === 1; + if (shouldReraise) { + const handler = cleanupHandlers.get(signal); + if (handler) { + process.off(signal, handler); + } + try { + process.kill(process.pid, signal); + } catch { + // Ignore errors during shutdown + } + } +} + +function registerCleanupHandlers(): void { + if (cleanupRegistered) { + return; + } + cleanupRegistered = true; + + // Cleanup on normal exit and process.exit() calls + process.on("exit", () => { + releaseAllLocksSync(); + }); + + // Handle termination signals + for (const signal of CLEANUP_SIGNALS) { + try { + const handler = () => handleTerminationSignal(signal); + cleanupHandlers.set(signal, handler); + process.on(signal, handler); + } catch { + // Ignore unsupported signals on this platform. + } + } +} + +async function readLockPayload(lockPath: string): Promise { + try { + const raw = await fs.readFile(lockPath, "utf8"); + const parsed = JSON.parse(raw) as Partial; + if (typeof parsed.pid !== "number") { + return null; + } + if (typeof parsed.createdAt !== "string") { + return null; + } + return { pid: parsed.pid, createdAt: parsed.createdAt }; + } catch { + return null; + } +} + +export async function acquireSessionWriteLock(params: { + sessionFile: string; + timeoutMs?: number; + staleMs?: number; +}): Promise<{ + release: () => Promise; +}> { + registerCleanupHandlers(); + const timeoutMs = params.timeoutMs ?? 10_000; + const staleMs = params.staleMs ?? 30 * 60 * 1000; + const sessionFile = path.resolve(params.sessionFile); + const sessionDir = path.dirname(sessionFile); + await fs.mkdir(sessionDir, { recursive: true }); + let normalizedDir = sessionDir; + try { + normalizedDir = await fs.realpath(sessionDir); + } catch { + // Fall back to the resolved path if realpath fails (permissions, transient FS). + } + const normalizedSessionFile = path.join(normalizedDir, path.basename(sessionFile)); + const lockPath = `${normalizedSessionFile}.lock`; + + const held = HELD_LOCKS.get(normalizedSessionFile); + if (held) { + held.count += 1; + return { + release: async () => { + const current = HELD_LOCKS.get(normalizedSessionFile); + if (!current) { + return; + } + current.count -= 1; + if (current.count > 0) { + return; + } + HELD_LOCKS.delete(normalizedSessionFile); + await current.handle.close(); + await fs.rm(current.lockPath, { force: true }); + }, + }; + } + + const startedAt = Date.now(); + let attempt = 0; + while (Date.now() - startedAt < timeoutMs) { + attempt += 1; + try { + const handle = await fs.open(lockPath, "wx"); + await handle.writeFile( + JSON.stringify({ pid: process.pid, createdAt: new Date().toISOString() }, null, 2), + "utf8", + ); + HELD_LOCKS.set(normalizedSessionFile, { count: 1, handle, lockPath }); + return { + release: async () => { + const current = HELD_LOCKS.get(normalizedSessionFile); + if (!current) { + return; + } + current.count -= 1; + if (current.count > 0) { + return; + } + HELD_LOCKS.delete(normalizedSessionFile); + await current.handle.close(); + await fs.rm(current.lockPath, { force: true }); + }, + }; + } catch (err) { + const code = (err as { code?: unknown }).code; + if (code !== "EEXIST") { + throw err; + } + const payload = await readLockPayload(lockPath); + const createdAt = payload?.createdAt ? Date.parse(payload.createdAt) : NaN; + const stale = !Number.isFinite(createdAt) || Date.now() - createdAt > staleMs; + const alive = payload?.pid ? isAlive(payload.pid) : false; + if (stale || !alive) { + await fs.rm(lockPath, { force: true }); + continue; + } + + const delay = Math.min(1000, 50 * attempt); + await new Promise((r) => setTimeout(r, delay)); + } + } + + const payload = await readLockPayload(lockPath); + const owner = payload?.pid ? `pid=${payload.pid}` : "unknown"; + throw new Error(`session file locked (timeout ${timeoutMs}ms): ${owner} ${lockPath}`); +} + +export const __testing = { + cleanupSignals: [...CLEANUP_SIGNALS], + handleTerminationSignal, + releaseAllLocksSync, +}; From 0c549f76e665cc2650c54b703cccc61a11a47b3e Mon Sep 17 00:00:00 2001 From: yushen Date: Tue, 3 Feb 2026 17:21:26 +0800 Subject: [PATCH 14/25] feat(session): integrate write lock and auto-repair into session flow - storage.ts: acquire/release write lock in appendEntry and writeEntries - session-manager.ts: add repairIfNeeded() method, apply transcript sanitization in loadMessages() - runner.ts: move message loading to lazy async init in run(), call repair before loading messages (following OpenClaw's pattern) Co-Authored-By: Claude Opus 4.5 --- src/agent/runner.ts | 54 +++++++++++++++------------- src/agent/session/session-manager.ts | 14 ++++++-- src/agent/session/storage.ts | 17 +++++++-- 3 files changed, 55 insertions(+), 30 deletions(-) diff --git a/src/agent/runner.ts b/src/agent/runner.ts index 90f5416a..9ae9bf27 100644 --- a/src/agent/runner.ts +++ b/src/agent/runner.ts @@ -23,6 +23,7 @@ export class Agent { private readonly skillManager?: SkillManager; private readonly contextWindowGuard: ContextWindowGuardResult; private readonly debug: boolean; + private initialized = false; /** Current session ID */ readonly sessionId: string; @@ -172,31 +173,6 @@ export class Agent { } this.agent.setTools(tools); - const restoredMessages = this.session.loadMessages(); - if (restoredMessages.length > 0) { - if (this.debug) { - console.error(`[debug] Restoring ${restoredMessages.length} messages from session`); - for (const msg of restoredMessages) { - const msgAny = msg as any; - const content = Array.isArray(msgAny.content) - ? msgAny.content.map((c: any) => c.type || "text").join(", ") - : typeof msgAny.content; - console.error(`[debug] ${msg.role}: ${content}`); - if (Array.isArray(msgAny.content)) { - for (const block of msgAny.content) { - if (block.type === "tool_use") { - console.error(`[debug] tool_use id: ${block.id}, name: ${block.name}`); - } - if (block.type === "tool_result") { - console.error(`[debug] tool_result tool_use_id: ${block.tool_use_id}`); - } - } - } - } - } - this.agent.replaceMessages(restoredMessages); - } - this.session.saveMeta({ provider: this.agent.state.model?.provider, model: this.agent.state.model?.id, @@ -216,6 +192,34 @@ export class Agent { } async run(prompt: string): Promise { + if (!this.initialized) { + await this.session.repairIfNeeded((msg) => console.error(msg)); + const restoredMessages = this.session.loadMessages(); + if (restoredMessages.length > 0) { + if (this.debug) { + console.error(`[debug] Restoring ${restoredMessages.length} messages from session`); + for (const msg of restoredMessages) { + const msgAny = msg as any; + const content = Array.isArray(msgAny.content) + ? msgAny.content.map((c: any) => c.type || "text").join(", ") + : typeof msgAny.content; + console.error(`[debug] ${msg.role}: ${content}`); + if (Array.isArray(msgAny.content)) { + for (const block of msgAny.content) { + if (block.type === "tool_use") { + console.error(`[debug] tool_use id: ${block.id}, name: ${block.name}`); + } + if (block.type === "tool_result") { + console.error(`[debug] tool_result tool_use_id: ${block.tool_use_id}`); + } + } + } + } + } + this.agent.replaceMessages(restoredMessages); + } + this.initialized = true; + } this.output.state.lastAssistantText = ""; await this.agent.prompt(prompt); return { text: this.output.state.lastAssistantText, error: this.agent.state.error }; diff --git a/src/agent/session/session-manager.ts b/src/agent/session/session-manager.ts index e6793b36..a820072a 100644 --- a/src/agent/session/session-manager.ts +++ b/src/agent/session/session-manager.ts @@ -1,9 +1,11 @@ import type { AgentMessage } from "@mariozechner/pi-agent-core"; import { getModel, type Model } from "@mariozechner/pi-ai"; import type { SessionEntry, SessionMeta } from "./types.js"; -import { appendEntry, readEntries, writeEntries } from "./storage.js"; +import { appendEntry, readEntries, resolveSessionPath, writeEntries } from "./storage.js"; import { compactMessages, compactMessagesAsync } from "./compaction.js"; import { credentialManager } from "../credentials.js"; +import { repairSessionFileIfNeeded, type RepairReport } from "./session-file-repair.js"; +import { sanitizeToolCallInputs, sanitizeToolUseResultPairing } from "./session-transcript-repair.js"; /** Get Kimi model for summarization (use a cheaper model than k2-thinking) */ function getSummaryModel(): Model { @@ -140,11 +142,19 @@ export class SessionManager { return readEntries(this.sessionId, { baseDir: this.baseDir }); } + async repairIfNeeded(warn?: (message: string) => void): Promise { + const filePath = resolveSessionPath(this.sessionId, { baseDir: this.baseDir }); + return repairSessionFileIfNeeded({ sessionFile: filePath, warn }); + } + loadMessages(): AgentMessage[] { const entries = this.loadEntries(); - return entries + let messages = entries .filter((entry) => entry.type === "message") .map((entry) => entry.message); + messages = sanitizeToolCallInputs(messages); + messages = sanitizeToolUseResultPairing(messages); + return messages; } loadMeta(): SessionMeta | undefined { diff --git a/src/agent/session/storage.ts b/src/agent/session/storage.ts index b219fd95..63915783 100644 --- a/src/agent/session/storage.ts +++ b/src/agent/session/storage.ts @@ -3,6 +3,7 @@ import { existsSync, mkdirSync, readFileSync } from "fs"; import { appendFile, writeFile } from "fs/promises"; import type { SessionEntry } from "./types.js"; import { DATA_DIR } from "../../shared/index.js"; +import { acquireSessionWriteLock } from "./session-write-lock.js"; export type SessionStorageOptions = { baseDir?: string | undefined; @@ -50,7 +51,12 @@ export async function appendEntry( ) { ensureSessionDir(sessionId, options); const filePath = resolveSessionPath(sessionId, options); - await appendFile(filePath, `${JSON.stringify(entry)}\n`, "utf8"); + const lock = await acquireSessionWriteLock({ sessionFile: filePath }); + try { + await appendFile(filePath, `${JSON.stringify(entry)}\n`, "utf8"); + } finally { + await lock.release(); + } } export async function writeEntries( @@ -60,6 +66,11 @@ export async function writeEntries( ) { ensureSessionDir(sessionId, options); const filePath = resolveSessionPath(sessionId, options); - const content = entries.map((entry) => JSON.stringify(entry)).join("\n"); - await writeFile(filePath, content ? `${content}\n` : "", "utf8"); + const lock = await acquireSessionWriteLock({ sessionFile: filePath }); + try { + const content = entries.map((entry) => JSON.stringify(entry)).join("\n"); + await writeFile(filePath, content ? `${content}\n` : "", "utf8"); + } finally { + await lock.release(); + } } From 30f23459cec38dce45f62127ea47fca1cd5d4773 Mon Sep 17 00:00:00 2001 From: yushen Date: Tue, 3 Feb 2026 17:22:41 +0800 Subject: [PATCH 15/25] fix(agent): align subagent lifecycle with openclaw --- src/agent/subagent/registry.ts | 11 +++++++---- src/agent/tools/sessions-spawn.ts | 7 ++++--- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/agent/subagent/registry.ts b/src/agent/subagent/registry.ts index b2cc8446..d6f76b94 100644 --- a/src/agent/subagent/registry.ts +++ b/src/agent/subagent/registry.ts @@ -47,10 +47,9 @@ export function initSubagentRegistry(): void { resumedRuns.add(runId); handleRunCompletion(record); } - } - // If not ended, the child agent session is lost on restart — - // mark as ended with unknown outcome - else if (!record.startedAt) { + } else { + // If not ended, the child agent session is lost on restart — + // mark as ended with unknown outcome record.endedAt = Date.now(); record.outcome = { status: "unknown" }; persist(); @@ -246,6 +245,10 @@ function handleRunCompletion(record: SubagentRunRecord): void { if (!announced) { console.warn(`[SubagentRegistry] Announce flow failed for run ${record.runId}`); + // Allow retry on next restart if announce failed. + record.cleanupHandled = false; + persist(); + return; } // Handle session cleanup diff --git a/src/agent/tools/sessions-spawn.ts b/src/agent/tools/sessions-spawn.ts index 0dfb5c8c..9ae2cc69 100644 --- a/src/agent/tools/sessions-spawn.ts +++ b/src/agent/tools/sessions-spawn.ts @@ -100,6 +100,10 @@ export function createSessionsSpawnTool( model, }); + // Write the task to the child (non-blocking) before registering, + // so waitForIdle() observes the queued work. + childAgent.write(task); + // Register the run for lifecycle tracking registerSubagentRun({ runId, @@ -111,9 +115,6 @@ export function createSessionsSpawnTool( timeoutSeconds, }); - // Write the task to the child (non-blocking) - childAgent.write(task); - return { content: [ { From a8c50425543d7ee02fb39996b085fc096542cc04 Mon Sep 17 00:00:00 2001 From: yushen Date: Tue, 3 Feb 2026 17:26:09 +0800 Subject: [PATCH 16/25] fix(auth-profiles): add file locking, type priority sort, credential filtering - Add proper-lockfile for concurrent-safe store updates with fallback - Add "format" to AuthProfileFailureReason - Two-level round-robin sort: credential type priority (OAuth > API key), then lastUsed - Filter out profiles with missing/invalid credentials from candidates - Add preferredProfile option to resolveAuthProfileOrder - Export coerceStore and ensureAuthStoreFile for testing - Add store.test.ts with coerceStore, load/save round-trip, corruption handling - Update order.test.ts mocks for resolver and registry dependencies Co-Authored-By: Claude Opus 4.5 --- package.json | 4 +- pnpm-lock.yaml | 142 ++++++++++++++++++++++---- src/agent/auth-profiles/index.ts | 3 + src/agent/auth-profiles/order.test.ts | 88 +++++++++++----- src/agent/auth-profiles/order.ts | 67 ++++++++++-- src/agent/auth-profiles/store.test.ts | 131 ++++++++++++++++++++++++ src/agent/auth-profiles/store.ts | 62 +++++++++-- src/agent/auth-profiles/types.ts | 1 + 8 files changed, 433 insertions(+), 65 deletions(-) create mode 100644 src/agent/auth-profiles/store.test.ts diff --git a/package.json b/package.json index 68fa350c..d0952bbf 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "packageManager": "pnpm@10.28.2", "devDependencies": { "@types/node": "catalog:", + "@types/proper-lockfile": "^4.1.4", "@types/turndown": "^5.0.6", "@types/uuid": "^11.0.0", "@vitest/coverage-v8": "^4.0.18", @@ -42,11 +43,11 @@ "vitest": "^4.0.18" }, "dependencies": { - "@multica/sdk": "workspace:*", "@mariozechner/pi-agent-core": "^0.50.3", "@mariozechner/pi-ai": "^0.50.3", "@mariozechner/pi-coding-agent": "^0.50.3", "@mozilla/readability": "^0.6.0", + "@multica/sdk": "workspace:*", "@nestjs/common": "^11.1.12", "@nestjs/core": "^11.1.12", "@nestjs/platform-express": "^11.1.12", @@ -61,6 +62,7 @@ "pino": "^10.3.0", "pino-http": "^11.0.0", "pino-pretty": "^13.1.3", + "proper-lockfile": "^4.1.2", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.2", "socket.io": "^4.8.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a71a43c2..5d0fc218 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,13 +34,13 @@ importers: dependencies: '@mariozechner/pi-agent-core': specifier: ^0.50.3 - version: 0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@3.25.76))(ws@8.18.3)(zod@3.25.76) + version: 0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.18.3)(zod@4.3.6) '@mariozechner/pi-ai': specifier: ^0.50.3 - version: 0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@3.25.76))(ws@8.18.3)(zod@3.25.76) + version: 0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.18.3)(zod@4.3.6) '@mariozechner/pi-coding-agent': specifier: ^0.50.3 - version: 0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@3.25.76))(ws@8.18.3)(zod@3.25.76) + version: 0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.18.3)(zod@4.3.6) '@mozilla/readability': specifier: ^0.6.0 version: 0.6.0 @@ -89,6 +89,9 @@ importers: pino-pretty: specifier: ^13.1.3 version: 13.1.3 + proper-lockfile: + specifier: ^4.1.2 + version: 4.1.2 reflect-metadata: specifier: ^0.2.2 version: 0.2.2 @@ -117,6 +120,9 @@ importers: '@types/node': specifier: 'catalog:' version: 25.0.10 + '@types/proper-lockfile': + specifier: ^4.1.4 + version: 4.1.4 '@types/turndown': specifier: ^5.0.6 version: 5.0.6 @@ -1200,89 +1206,105 @@ packages: resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} @@ -1404,24 +1426,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@mariozechner/clipboard-linux-riscv64-gnu@0.3.0': resolution: {integrity: sha512-4BC08CIaOXSSAGRZLEjqJmQfioED8ohAzwt0k2amZPEbH96YKoBNorq5EdwPf5VT+odS0DeyCwhwtxokRLZIvQ==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] + libc: [glibc] '@mariozechner/clipboard-linux-x64-gnu@0.3.0': resolution: {integrity: sha512-GpNY5Y9nOzr0Vt0Qi5U88qwe6piiIHk44kSMexl8ns90LluN5UTNYmyfi7Xq3/lmPZCpnB2xvBTYbsXCxnopIA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@mariozechner/clipboard-linux-x64-musl@0.3.0': resolution: {integrity: sha512-+PnR48/x9GMY5Kh8BLjzHMx6trOegMtxAuqTM9X/bhV3QuW6sLLd7nojDHSGj/ZueK6i0tcQxvOrgNLozVtNDA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@mariozechner/clipboard-win32-arm64-msvc@0.3.0': resolution: {integrity: sha512-+dy2vZ1Ph4EYj0cotB+bVUVk/uKl2bh9LOp/zlnFqoCCYDN6sm+L0VyIOPPo3hjoEVdGpHe1MUxp3qG/OLwXgg==} @@ -1583,24 +1609,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-musl@16.1.6': resolution: {integrity: sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-x64-gnu@16.1.6': resolution: {integrity: sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-musl@16.1.6': resolution: {integrity: sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-win32-arm64-msvc@16.1.6': resolution: {integrity: sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==} @@ -1700,66 +1730,79 @@ packages: resolution: {integrity: sha512-eyrr5W08Ms9uM0mLcKfM/Uzx7hjhz2bcjv8P2uynfj0yU8GGPdz8iYrBPhiLOZqahoAMB8ZiolRZPbbU2MAi6Q==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.57.0': resolution: {integrity: sha512-Xds90ITXJCNyX9pDhqf85MKWUI4lqjiPAipJ8OLp8xqI2Ehk+TCVhF9rvOoN8xTbcafow3QOThkNnrM33uCFQA==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.57.0': resolution: {integrity: sha512-Xws2KA4CLvZmXjy46SQaXSejuKPhwVdaNinldoYfqruZBaJHqVo6hnRa8SDo9z7PBW5x84SH64+izmldCgbezw==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.57.0': resolution: {integrity: sha512-hrKXKbX5FdaRJj7lTMusmvKbhMJSGWJ+w++4KmjiDhpTgNlhYobMvKfDoIWecy4O60K6yA4SnztGuNTQF+Lplw==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.57.0': resolution: {integrity: sha512-6A+nccfSDGKsPm00d3xKcrsBcbqzCTAukjwWK6rbuAnB2bHaL3r9720HBVZ/no7+FhZLz/U3GwwZZEh6tOSI8Q==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.57.0': resolution: {integrity: sha512-4P1VyYUe6XAJtQH1Hh99THxr0GKMMwIXsRNOceLrJnaHTDgk1FTcTimDgneRJPvB3LqDQxUmroBclQ1S0cIJwQ==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.57.0': resolution: {integrity: sha512-8Vv6pLuIZCMcgXre6c3nOPhE0gjz1+nZP6T+hwWjr7sVH8k0jRkH+XnfjjOTglyMBdSKBPPz54/y1gToSKwrSQ==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.57.0': resolution: {integrity: sha512-r1te1M0Sm2TBVD/RxBPC6RZVwNqUTwJTA7w+C/IW5v9Ssu6xmxWEi+iJQlpBhtUiT1raJ5b48pI8tBvEjEFnFA==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.57.0': resolution: {integrity: sha512-say0uMU/RaPm3CDQLxUUTF2oNWL8ysvHkAjcCzV2znxBr23kFfaxocS9qJm+NdkRhF8wtdEEAJuYcLPhSPbjuQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.57.0': resolution: {integrity: sha512-/MU7/HizQGsnBREtRpcSbSV1zfkoxSTR7wLsRmBPQ8FwUj5sykrP1MyJTvsxP5KBq9SyE6kH8UQQQwa0ASeoQQ==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.57.0': resolution: {integrity: sha512-Q9eh+gUGILIHEaJf66aF6a414jQbDnn29zeu0eX3dHMuysnhTvsUvZTCAyZ6tJhUjnvzBKE4FtuaYxutxRZpOg==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.57.0': resolution: {integrity: sha512-OR5p5yG5OKSxHReWmwvM0P+VTPMwoBS45PXTMYaskKQqybkS3Kmugq1W+YbNWArF8/s7jQScgzXUhArzEQ7x0A==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.57.0': resolution: {integrity: sha512-XeatKzo4lHDsVEbm1XDHZlhYZZSQYym6dg2X/Ko0kSFgio+KXLsxwJQprnR48GvdIKDOpqWqssC3iBCjoMcMpw==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openbsd-x64@4.57.0': resolution: {integrity: sha512-Lu71y78F5qOfYmubYLHPcJm74GZLU6UJ4THkf/a1K7Tz2ycwC2VUbsqbJAXaR6Bx70SRdlVrt2+n5l7F0agTUw==} @@ -2075,24 +2118,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.1.18': resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.1.18': resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.1.18': resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.1.18': resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} @@ -2222,6 +2269,9 @@ packages: '@types/plist@3.0.5': resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} + '@types/proper-lockfile@4.1.4': + resolution: {integrity: sha512-uo2ABllncSqg9F1D4nugVl9v93RmjxF6LJzQLMLDdPaXCUIDPeOJ21Gbqi43xNKzBi/WQ0Q0dICqufzQbMjipQ==} + '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: @@ -2233,6 +2283,9 @@ packages: '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + '@types/retry@0.12.5': + resolution: {integrity: sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==} + '@types/statuses@2.0.6': resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} @@ -2417,41 +2470,49 @@ packages: resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-arm64-musl@1.11.1': resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} cpu: [arm64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} cpu: [riscv64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} cpu: [s390x] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-gnu@1.11.1': resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} cpu: [x64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-musl@1.11.1': resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} cpu: [x64] os: [linux] + libc: [musl] '@unrs/resolver-binding-wasm32-wasi@1.11.1': resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} @@ -4442,24 +4503,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.30.2: resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.30.2: resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.30.2: resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.30.2: resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} @@ -6441,11 +6506,11 @@ snapshots: package-manager-detector: 1.6.0 tinyexec: 1.0.2 - '@anthropic-ai/sdk@0.71.2(zod@3.25.76)': + '@anthropic-ai/sdk@0.71.2(zod@4.3.6)': dependencies: json-schema-to-ts: 3.1.1 optionalDependencies: - zod: 3.25.76 + zod: 4.3.6 '@aws-crypto/crc32@5.2.0': dependencies: @@ -7468,12 +7533,12 @@ snapshots: '@floating-ui/utils@0.2.10': {} - '@google/genai@1.34.0(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@3.25.76))': + '@google/genai@1.34.0(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))': dependencies: google-auth-library: 10.5.0 ws: 8.18.3 optionalDependencies: - '@modelcontextprotocol/sdk': 1.25.3(hono@4.11.7)(zod@3.25.76) + '@modelcontextprotocol/sdk': 1.25.3(hono@4.11.7)(zod@4.3.6) transitivePeerDependencies: - bufferutil - supports-color @@ -7728,9 +7793,9 @@ snapshots: std-env: 3.10.0 yoctocolors: 2.1.2 - '@mariozechner/pi-agent-core@0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@3.25.76))(ws@8.18.3)(zod@3.25.76)': + '@mariozechner/pi-agent-core@0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.18.3)(zod@4.3.6)': dependencies: - '@mariozechner/pi-ai': 0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@3.25.76))(ws@8.18.3)(zod@3.25.76) + '@mariozechner/pi-ai': 0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.18.3)(zod@4.3.6) '@mariozechner/pi-tui': 0.50.3 transitivePeerDependencies: - '@modelcontextprotocol/sdk' @@ -7741,21 +7806,21 @@ snapshots: - ws - zod - '@mariozechner/pi-ai@0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@3.25.76))(ws@8.18.3)(zod@3.25.76)': + '@mariozechner/pi-ai@0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.18.3)(zod@4.3.6)': dependencies: - '@anthropic-ai/sdk': 0.71.2(zod@3.25.76) + '@anthropic-ai/sdk': 0.71.2(zod@4.3.6) '@aws-sdk/client-bedrock-runtime': 3.978.0 - '@google/genai': 1.34.0(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@3.25.76)) + '@google/genai': 1.34.0(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6)) '@mistralai/mistralai': 1.10.0 '@sinclair/typebox': 0.34.48 ajv: 8.17.1 ajv-formats: 3.0.1(ajv@8.17.1) chalk: 5.6.2 - openai: 6.10.0(ws@8.18.3)(zod@3.25.76) + openai: 6.10.0(ws@8.18.3)(zod@4.3.6) partial-json: 0.1.7 proxy-agent: 6.5.0 undici: 7.19.2 - zod-to-json-schema: 3.25.1(zod@3.25.76) + zod-to-json-schema: 3.25.1(zod@4.3.6) transitivePeerDependencies: - '@modelcontextprotocol/sdk' - aws-crt @@ -7765,12 +7830,12 @@ snapshots: - ws - zod - '@mariozechner/pi-coding-agent@0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@3.25.76))(ws@8.18.3)(zod@3.25.76)': + '@mariozechner/pi-coding-agent@0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.18.3)(zod@4.3.6)': dependencies: '@mariozechner/clipboard': 0.3.0 '@mariozechner/jiti': 2.6.5 - '@mariozechner/pi-agent-core': 0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@3.25.76))(ws@8.18.3)(zod@3.25.76) - '@mariozechner/pi-ai': 0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@3.25.76))(ws@8.18.3)(zod@3.25.76) + '@mariozechner/pi-agent-core': 0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.18.3)(zod@4.3.6) + '@mariozechner/pi-ai': 0.50.3(@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6))(ws@8.18.3)(zod@4.3.6) '@mariozechner/pi-tui': 0.50.3 '@silvia-odwyer/photon-node': 0.3.4 chalk: 5.6.2 @@ -7828,6 +7893,29 @@ snapshots: - hono - supports-color + '@modelcontextprotocol/sdk@1.25.3(hono@4.11.7)(zod@4.3.6)': + dependencies: + '@hono/node-server': 1.19.9(hono@4.11.7) + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.6 + express: 5.2.1 + express-rate-limit: 7.5.1(express@5.2.1) + jose: 6.1.3 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 4.3.6 + zod-to-json-schema: 3.25.1(zod@4.3.6) + transitivePeerDependencies: + - hono + - supports-color + optional: true + '@mozilla/readability@0.6.0': {} '@mswjs/interceptors@0.40.0': @@ -8616,6 +8704,10 @@ snapshots: xmlbuilder: 15.1.1 optional: true + '@types/proper-lockfile@4.1.4': + dependencies: + '@types/retry': 0.12.5 + '@types/react-dom@19.2.3(@types/react@19.2.10)': dependencies: '@types/react': 19.2.10 @@ -8628,6 +8720,8 @@ snapshots: dependencies: '@types/node': 25.0.10 + '@types/retry@0.12.5': {} + '@types/statuses@2.0.6': {} '@types/turndown@5.0.6': {} @@ -10031,7 +10125,7 @@ snapshots: eslint: 9.39.2(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react: 7.37.5(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react-hooks: 7.0.1(eslint@9.39.2(jiti@2.6.1)) @@ -10064,7 +10158,7 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -10079,7 +10173,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -12067,10 +12161,10 @@ snapshots: powershell-utils: 0.1.0 wsl-utils: 0.3.1 - openai@6.10.0(ws@8.18.3)(zod@3.25.76): + openai@6.10.0(ws@8.18.3)(zod@4.3.6): optionalDependencies: ws: 8.18.3 - zod: 3.25.76 + zod: 4.3.6 optionator@0.9.4: dependencies: @@ -13702,6 +13796,10 @@ snapshots: dependencies: zod: 3.25.76 + zod-to-json-schema@3.25.1(zod@4.3.6): + dependencies: + zod: 4.3.6 + zod-validation-error@4.0.2(zod@4.3.6): dependencies: zod: 4.3.6 diff --git a/src/agent/auth-profiles/index.ts b/src/agent/auth-profiles/index.ts index bd87cbb7..9458ea55 100644 --- a/src/agent/auth-profiles/index.ts +++ b/src/agent/auth-profiles/index.ts @@ -22,6 +22,8 @@ export { export { resolveAuthStorePath, + coerceStore, + ensureAuthStoreFile, loadAuthProfileStore, saveAuthProfileStore, updateAuthProfileStore, @@ -30,6 +32,7 @@ export { export { listProfilesForProvider, resolveAuthProfileOrder, + type AuthProfileOrderOptions, } from "./order.js"; export { diff --git a/src/agent/auth-profiles/order.test.ts b/src/agent/auth-profiles/order.test.ts index dd729719..905724d8 100644 --- a/src/agent/auth-profiles/order.test.ts +++ b/src/agent/auth-profiles/order.test.ts @@ -2,11 +2,12 @@ import { describe, it, expect, vi, beforeEach } from "vitest"; import { resolveAuthProfileOrder, listProfilesForProvider } from "./order.js"; import type { AuthProfileStore } from "./types.js"; +// Track mock profiles for credential validation +let _profiles: Record = {}; +let _order: Record = {}; + // Mock credentialManager vi.mock("../credentials.js", () => { - let _profiles: Record = {}; - let _order: Record = {}; - return { credentialManager: { listProfileIdsForProvider(provider: string): string[] { @@ -17,27 +18,33 @@ vi.mock("../credentials.js", () => { getLlmOrder(provider: string): string[] | undefined { return _order[provider]; }, - // Test helpers - __setProfiles(profiles: Record) { - _profiles = profiles; - }, - __setOrder(order: Record) { - _order = order; + getLlmProviderConfig(profileId: string): { apiKey?: string } | undefined { + return _profiles[profileId]; }, }, }; }); -// Import the mock to use test helpers -import { credentialManager } from "../credentials.js"; -const mock = credentialManager as unknown as { - __setProfiles: (p: Record) => void; - __setOrder: (o: Record) => void; -}; +// Mock providers/registry — all test profiles are API-key based +vi.mock("../providers/registry.js", () => ({ + isOAuthProvider: (_provider: string) => false, +})); + +// Mock providers/resolver — delegate to our mock profiles +vi.mock("../providers/resolver.js", () => ({ + resolveApiKeyForProfile: (profileId: string) => _profiles[profileId]?.apiKey, +})); + +function setProfiles(profiles: Record) { + _profiles = profiles; +} +function setOrder(order: Record) { + _order = order; +} beforeEach(() => { - mock.__setProfiles({}); - mock.__setOrder({}); + _profiles = {}; + _order = {}; }); // ============================================================ @@ -46,7 +53,7 @@ beforeEach(() => { describe("listProfilesForProvider", () => { it("returns profiles matching the provider", () => { - mock.__setProfiles({ + setProfiles({ anthropic: { apiKey: "sk-1" }, "anthropic:backup": { apiKey: "sk-2" }, openai: { apiKey: "sk-3" }, @@ -58,7 +65,7 @@ describe("listProfilesForProvider", () => { }); it("returns empty array when no profiles match", () => { - mock.__setProfiles({ openai: { apiKey: "sk-1" } }); + setProfiles({ openai: { apiKey: "sk-1" } }); expect(listProfilesForProvider("anthropic")).toEqual([]); }); }); @@ -71,7 +78,7 @@ describe("resolveAuthProfileOrder", () => { const now = 1_000_000; it("returns round-robin order by lastUsed when no explicit order", () => { - mock.__setProfiles({ + setProfiles({ "anthropic": { apiKey: "sk-1" }, "anthropic:b": { apiKey: "sk-2" }, "anthropic:c": { apiKey: "sk-3" }, @@ -91,12 +98,12 @@ describe("resolveAuthProfileOrder", () => { }); it("respects explicit order from config", () => { - mock.__setProfiles({ + setProfiles({ "anthropic": { apiKey: "sk-1" }, "anthropic:b": { apiKey: "sk-2" }, "anthropic:c": { apiKey: "sk-3" }, }); - mock.__setOrder({ anthropic: ["anthropic:c", "anthropic", "anthropic:b"] }); + setOrder({ anthropic: ["anthropic:c", "anthropic", "anthropic:b"] }); const store: AuthProfileStore = { version: 1 }; const order = resolveAuthProfileOrder("anthropic", store, now); @@ -104,7 +111,7 @@ describe("resolveAuthProfileOrder", () => { }); it("pushes cooldown profiles to the end", () => { - mock.__setProfiles({ + setProfiles({ "anthropic": { apiKey: "sk-1" }, "anthropic:b": { apiKey: "sk-2" }, "anthropic:c": { apiKey: "sk-3" }, @@ -124,7 +131,7 @@ describe("resolveAuthProfileOrder", () => { }); it("sorts cooldown profiles by earliest recovery", () => { - mock.__setProfiles({ + setProfiles({ "anthropic": { apiKey: "sk-1" }, "anthropic:b": { apiKey: "sk-2" }, "anthropic:c": { apiKey: "sk-3" }, @@ -144,12 +151,12 @@ describe("resolveAuthProfileOrder", () => { }); it("deduplicates profile IDs", () => { - mock.__setProfiles({ + setProfiles({ "anthropic": { apiKey: "sk-1" }, "anthropic:b": { apiKey: "sk-2" }, }); // Explicit order has duplicate - mock.__setOrder({ anthropic: ["anthropic", "anthropic", "anthropic:b"] }); + setOrder({ anthropic: ["anthropic", "anthropic", "anthropic:b"] }); const store: AuthProfileStore = { version: 1 }; const order = resolveAuthProfileOrder("anthropic", store, now); @@ -157,13 +164,13 @@ describe("resolveAuthProfileOrder", () => { }); it("appends unlisted profiles to explicit order", () => { - mock.__setProfiles({ + setProfiles({ "anthropic": { apiKey: "sk-1" }, "anthropic:b": { apiKey: "sk-2" }, "anthropic:c": { apiKey: "sk-3" }, }); // Only lists one profile in explicit order - mock.__setOrder({ anthropic: ["anthropic:b"] }); + setOrder({ anthropic: ["anthropic:b"] }); const store: AuthProfileStore = { version: 1 }; const order = resolveAuthProfileOrder("anthropic", store, now); @@ -173,4 +180,29 @@ describe("resolveAuthProfileOrder", () => { expect(order).toContain("anthropic"); expect(order).toContain("anthropic:c"); }); + + it("filters out profiles with no valid API key", () => { + setProfiles({ + "anthropic": { apiKey: "sk-1" }, + "anthropic:empty": {}, // no apiKey + "anthropic:c": { apiKey: "sk-3" }, + }); + const store: AuthProfileStore = { version: 1 }; + const order = resolveAuthProfileOrder("anthropic", store, now); + expect(order).toEqual(["anthropic", "anthropic:c"]); + }); + + it("moves preferredProfile to front", () => { + setProfiles({ + "anthropic": { apiKey: "sk-1" }, + "anthropic:b": { apiKey: "sk-2" }, + "anthropic:c": { apiKey: "sk-3" }, + }); + const store: AuthProfileStore = { version: 1 }; + const order = resolveAuthProfileOrder("anthropic", store, now, { + preferredProfile: "anthropic:c", + }); + expect(order[0]).toBe("anthropic:c"); + expect(order).toHaveLength(3); + }); }); diff --git a/src/agent/auth-profiles/order.ts b/src/agent/auth-profiles/order.ts index 16055e81..09c99a32 100644 --- a/src/agent/auth-profiles/order.ts +++ b/src/agent/auth-profiles/order.ts @@ -3,11 +3,14 @@ * * Determines the order in which auth profiles are tried for a given provider. * Supports explicit ordering (from credentials.json5) and automatic round-robin - * based on lastUsed time. Profiles in cooldown are pushed to the end. + * with two-level sort: credential type priority (OAuth > API key), then lastUsed. + * Profiles in cooldown are pushed to the end. */ import { credentialManager } from "../credentials.js"; -import type { AuthProfileStore, ProfileUsageStats } from "./types.js"; +import { isOAuthProvider } from "../providers/registry.js"; +import { resolveApiKeyForProfile } from "../providers/resolver.js"; +import type { AuthProfileStore } from "./types.js"; import { isProfileInCooldown, resolveProfileUnusableUntil } from "./usage.js"; // ============================================================ @@ -22,24 +25,51 @@ export function listProfilesForProvider(provider: string): string[] { return credentialManager.listProfileIdsForProvider(provider); } +// ============================================================ +// Type priority +// ============================================================ + +/** + * Get the type-based priority for a profile. + * OAuth providers (e.g. claude-code, openai-codex) get priority 0 (preferred), + * API-key providers get priority 1. + * Lower number = higher priority. + */ +function getProfileTypePriority(profileId: string): number { + // Extract the provider portion from profileId (before ":" if present) + const provider = profileId.includes(":") ? profileId.split(":")[0]! : profileId; + return isOAuthProvider(provider) ? 0 : 1; +} + // ============================================================ // Ordering // ============================================================ +export interface AuthProfileOrderOptions { + /** Preferred profile to put first (used when user or agent selects a profile) */ + preferredProfile?: string | undefined; +} + /** * Resolve the ordered list of profile IDs to try for a given provider. * * Strategy: * 1. If credentials.json5 has `llm.order[provider]`, use that explicit order. - * 2. Otherwise, use round-robin ordered by `lastUsed` ascending (oldest first). + * 2. Otherwise, use round-robin with two-level sort: + * - First by credential type priority (OAuth > API key) + * - Then by `lastUsed` ascending within each type (oldest first) * - * In both cases, profiles currently in cooldown are pushed to the end, - * sorted by earliest cooldown expiry (soonest-to-recover first). + * In both cases: + * - Profiles with invalid/missing credentials are filtered out + * - Profiles currently in cooldown are pushed to the end, + * sorted by earliest cooldown expiry (soonest-to-recover first) + * - If `preferredProfile` is set, it is moved to the front */ export function resolveAuthProfileOrder( provider: string, store: AuthProfileStore, now?: number, + options?: AuthProfileOrderOptions, ): string[] { const ts = now ?? Date.now(); @@ -59,8 +89,11 @@ export function resolveAuthProfileOrder( } } } else { - // Round-robin by lastUsed (oldest first) + // Two-level sort: type priority first, then lastUsed within same type candidates = [...allProfiles].sort((a, b) => { + const priorityDiff = getProfileTypePriority(a) - getProfileTypePriority(b); + if (priorityDiff !== 0) return priorityDiff; + const statsA = store.usageStats?.[a]; const statsB = store.usageStats?.[b]; return (statsA?.lastUsed ?? 0) - (statsB?.lastUsed ?? 0); @@ -70,6 +103,16 @@ export function resolveAuthProfileOrder( // Deduplicate candidates = [...new Set(candidates)]; + // Filter out profiles with invalid/missing credentials + candidates = candidates.filter((id) => { + // For OAuth providers, resolveApiKeyForProfile won't find them in credentials.json5 + // but they are still valid candidates (resolved at runtime via OAuth flow) + const provider = id.includes(":") ? id.split(":")[0]! : id; + if (isOAuthProvider(provider)) return true; + + return resolveApiKeyForProfile(id) !== undefined; + }); + // Partition into available and in-cooldown const available: string[] = []; const inCooldown: string[] = []; @@ -90,5 +133,15 @@ export function resolveAuthProfileOrder( return resolveProfileUnusableUntil(statsA) - resolveProfileUnusableUntil(statsB); }); - return [...available, ...inCooldown]; + let result = [...available, ...inCooldown]; + + // Move preferred profile to front if specified + if (options?.preferredProfile && result.includes(options.preferredProfile)) { + result = [ + options.preferredProfile, + ...result.filter((id) => id !== options.preferredProfile), + ]; + } + + return result; } diff --git a/src/agent/auth-profiles/store.test.ts b/src/agent/auth-profiles/store.test.ts new file mode 100644 index 00000000..4e2d78f5 --- /dev/null +++ b/src/agent/auth-profiles/store.test.ts @@ -0,0 +1,131 @@ +import { describe, it, expect, beforeEach, afterEach } from "vitest"; +import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs"; +import { join } from "node:path"; +import { coerceStore, loadAuthProfileStore, saveAuthProfileStore, updateAuthProfileStore } from "./store.js"; +import { AUTH_STORE_VERSION } from "./constants.js"; +import type { AuthProfileStore } from "./types.js"; + +// Use a temp directory for tests to avoid touching real store +const TEST_DIR = join(import.meta.dirname ?? ".", "__test_store_tmp__"); +const TEST_STORE_PATH = join(TEST_DIR, "auth-profiles.json"); + +// We need to mock resolveAuthStorePath to point to our test dir +import { vi } from "vitest"; + +vi.mock("../../shared/paths.js", () => ({ + DATA_DIR: join(import.meta.dirname ?? ".", "__test_store_tmp__"), +})); + +beforeEach(() => { + if (!existsSync(TEST_DIR)) { + mkdirSync(TEST_DIR, { recursive: true }); + } +}); + +afterEach(() => { + if (existsSync(TEST_DIR)) { + rmSync(TEST_DIR, { recursive: true, force: true }); + } +}); + +// ============================================================ +// coerceStore +// ============================================================ + +describe("coerceStore", () => { + it("returns empty store for null", () => { + const store = coerceStore(null); + expect(store.version).toBe(AUTH_STORE_VERSION); + expect(store.lastGood).toBeUndefined(); + expect(store.usageStats).toBeUndefined(); + }); + + it("returns empty store for non-object", () => { + expect(coerceStore("hello").version).toBe(AUTH_STORE_VERSION); + expect(coerceStore(42).version).toBe(AUTH_STORE_VERSION); + expect(coerceStore(undefined).version).toBe(AUTH_STORE_VERSION); + }); + + it("preserves valid store data", () => { + const raw = { + version: 1, + lastGood: { anthropic: "anthropic:backup" }, + usageStats: { + "anthropic": { lastUsed: 1000, errorCount: 0 }, + }, + }; + const store = coerceStore(raw); + expect(store.version).toBe(1); + expect(store.lastGood?.anthropic).toBe("anthropic:backup"); + expect(store.usageStats?.anthropic?.lastUsed).toBe(1000); + }); + + it("defaults version when missing", () => { + const store = coerceStore({ lastGood: {} }); + expect(store.version).toBe(AUTH_STORE_VERSION); + }); +}); + +// ============================================================ +// loadAuthProfileStore / saveAuthProfileStore +// ============================================================ + +describe("loadAuthProfileStore / saveAuthProfileStore", () => { + it("returns empty store when file does not exist", () => { + const store = loadAuthProfileStore(); + expect(store.version).toBe(AUTH_STORE_VERSION); + }); + + it("round-trips save and load", () => { + const original: AuthProfileStore = { + version: 1, + lastGood: { anthropic: "anthropic:main" }, + usageStats: { + "anthropic:main": { lastUsed: 5000, errorCount: 1 }, + }, + }; + saveAuthProfileStore(original); + const loaded = loadAuthProfileStore(); + expect(loaded).toEqual(original); + }); + + it("handles corrupted JSON gracefully", () => { + writeFileSync(TEST_STORE_PATH, "not valid json{{{", "utf8"); + const store = loadAuthProfileStore(); + expect(store.version).toBe(AUTH_STORE_VERSION); + }); +}); + +// ============================================================ +// updateAuthProfileStore +// ============================================================ + +describe("updateAuthProfileStore", () => { + it("creates file and applies update when file does not exist", () => { + const result = updateAuthProfileStore((store) => { + if (!store.lastGood) store.lastGood = {}; + store.lastGood.openai = "openai:primary"; + }); + expect(result.lastGood?.openai).toBe("openai:primary"); + + // Verify persisted + const loaded = loadAuthProfileStore(); + expect(loaded.lastGood?.openai).toBe("openai:primary"); + }); + + it("preserves existing data across updates", () => { + saveAuthProfileStore({ + version: 1, + lastGood: { anthropic: "anthropic" }, + }); + + updateAuthProfileStore((store) => { + if (!store.usageStats) store.usageStats = {}; + store.usageStats["anthropic"] = { lastUsed: 9999 }; + }); + + const loaded = loadAuthProfileStore(); + expect(loaded.lastGood?.anthropic).toBe("anthropic"); + expect(loaded.usageStats?.anthropic?.lastUsed).toBe(9999); + }); +}); diff --git a/src/agent/auth-profiles/store.ts b/src/agent/auth-profiles/store.ts index 3bb0480f..1d0ab0ca 100644 --- a/src/agent/auth-profiles/store.ts +++ b/src/agent/auth-profiles/store.ts @@ -3,14 +3,31 @@ * * Persistence layer for auth profile runtime state. * Stores usage stats, cooldowns, and last-good info in ~/.super-multica/auth-profiles.json. + * Uses proper-lockfile for safe concurrent access across multiple agent processes. */ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs"; import { join, dirname } from "node:path"; +import lockfile from "proper-lockfile"; import { DATA_DIR } from "../../shared/paths.js"; import { AUTH_STORE_VERSION, AUTH_PROFILE_STORE_FILENAME } from "./constants.js"; import type { AuthProfileStore } from "./types.js"; +// ============================================================ +// Lock options (matches OpenClaw's AUTH_STORE_LOCK_OPTIONS) +// ============================================================ + +const LOCK_OPTIONS = { + retries: { + retries: 10, + factor: 2, + minTimeout: 100, + maxTimeout: 10_000, + randomize: true, + }, + stale: 30_000, +} as const; + // ============================================================ // Paths // ============================================================ @@ -28,7 +45,8 @@ function createEmptyStore(): AuthProfileStore { return { version: AUTH_STORE_VERSION }; } -function coerceStore(raw: unknown): AuthProfileStore { +/** Coerce raw JSON into a valid AuthProfileStore, defensive against malformed data */ +export function coerceStore(raw: unknown): AuthProfileStore { if (!raw || typeof raw !== "object") return createEmptyStore(); const obj = raw as Record; @@ -46,6 +64,19 @@ function coerceStore(raw: unknown): AuthProfileStore { return store; } +/** Ensure the store file exists on disk (creates it if missing) */ +export function ensureAuthStoreFile(): string { + const storePath = resolveAuthStorePath(); + const dir = dirname(storePath); + if (!existsSync(dir)) { + mkdirSync(dir, { recursive: true }); + } + if (!existsSync(storePath)) { + writeFileSync(storePath, JSON.stringify(createEmptyStore(), null, 2), "utf8"); + } + return storePath; +} + /** Load auth profile store from disk. Returns empty store if file doesn't exist. */ export function loadAuthProfileStore(): AuthProfileStore { const storePath = resolveAuthStorePath(); @@ -70,15 +101,32 @@ export function saveAuthProfileStore(store: AuthProfileStore): void { } /** - * Atomic load-update-save cycle. - * The updater receives the current store and should mutate it in place. + * Atomic load-update-save cycle with file locking. + * Acquires a lock on the store file, loads current state, runs the updater, + * and saves. Falls back to unlocked update if the lock cannot be acquired. * Returns the updated store. */ export function updateAuthProfileStore( updater: (store: AuthProfileStore) => void, ): AuthProfileStore { - const store = loadAuthProfileStore(); - updater(store); - saveAuthProfileStore(store); - return store; + const storePath = ensureAuthStoreFile(); + + try { + // Acquire file lock + const release = lockfile.lockSync(storePath, LOCK_OPTIONS); + try { + const store = loadAuthProfileStore(); + updater(store); + saveAuthProfileStore(store); + return store; + } finally { + release(); + } + } catch { + // Fallback: unlocked update (better than losing the write entirely) + const store = loadAuthProfileStore(); + updater(store); + saveAuthProfileStore(store); + return store; + } } diff --git a/src/agent/auth-profiles/types.ts b/src/agent/auth-profiles/types.ts index e4e34eb2..036341be 100644 --- a/src/agent/auth-profiles/types.ts +++ b/src/agent/auth-profiles/types.ts @@ -7,6 +7,7 @@ /** Reason for an auth profile failure, determines cooldown behavior */ export type AuthProfileFailureReason = | "auth" + | "format" | "rate_limit" | "billing" | "timeout" From e8815dbb97041a829e042da11e57d1db377b902b Mon Sep 17 00:00:00 2001 From: yushen Date: Tue, 3 Feb 2026 17:26:16 +0800 Subject: [PATCH 17/25] fix(agent): loop-based rotation, timeout rotatable, error classification tests - Replace single-retry with while loop that exhausts all candidate profiles - Add "format" detection to classifyError (400, malformed, bad request, schema) - Make timeout errors rotatable (some providers hang on rate limit) - Export classifyError and isRotatableError for testing - Add error-classification.test.ts with coverage for all failure reasons Co-Authored-By: Claude Opus 4.5 --- .../error-classification.test.ts | 65 +++++++++++++++++ src/agent/runner.ts | 72 +++++++++++-------- 2 files changed, 106 insertions(+), 31 deletions(-) create mode 100644 src/agent/auth-profiles/error-classification.test.ts diff --git a/src/agent/auth-profiles/error-classification.test.ts b/src/agent/auth-profiles/error-classification.test.ts new file mode 100644 index 00000000..c771c6b4 --- /dev/null +++ b/src/agent/auth-profiles/error-classification.test.ts @@ -0,0 +1,65 @@ +import { describe, it, expect } from "vitest"; +import { classifyError, isRotatableError } from "../runner.js"; + +// ============================================================ +// classifyError +// ============================================================ + +describe("classifyError", () => { + it("classifies 401/403/unauthorized as auth", () => { + expect(classifyError(new Error("HTTP 401 Unauthorized"))).toBe("auth"); + expect(classifyError(new Error("403 Forbidden"))).toBe("auth"); + expect(classifyError(new Error("Invalid API key provided"))).toBe("auth"); + expect(classifyError(new Error("Authentication failed"))).toBe("auth"); + }); + + it("classifies 400/malformed as format", () => { + expect(classifyError(new Error("400 Bad Request"))).toBe("format"); + expect(classifyError(new Error("Invalid request body"))).toBe("format"); + expect(classifyError(new Error("Malformed JSON in request"))).toBe("format"); + expect(classifyError(new Error("Schema validation failed"))).toBe("format"); + }); + + it("classifies 429/rate limit as rate_limit", () => { + expect(classifyError(new Error("429 Too Many Requests"))).toBe("rate_limit"); + expect(classifyError(new Error("Rate limit exceeded"))).toBe("rate_limit"); + expect(classifyError(new Error("rate_limit_error"))).toBe("rate_limit"); + }); + + it("classifies billing/quota as billing", () => { + expect(classifyError(new Error("Billing quota exceeded"))).toBe("billing"); + expect(classifyError(new Error("Insufficient credits"))).toBe("billing"); + expect(classifyError(new Error("Payment required"))).toBe("billing"); + }); + + it("classifies timeout/connection errors as timeout", () => { + expect(classifyError(new Error("Request timed out"))).toBe("timeout"); + expect(classifyError(new Error("ETIMEDOUT"))).toBe("timeout"); + expect(classifyError(new Error("ECONNRESET"))).toBe("timeout"); + expect(classifyError(new Error("Connection timeout"))).toBe("timeout"); + }); + + it("classifies unknown errors as unknown", () => { + expect(classifyError(new Error("Something went wrong"))).toBe("unknown"); + expect(classifyError("string error")).toBe("unknown"); + expect(classifyError(42)).toBe("unknown"); + }); +}); + +// ============================================================ +// isRotatableError +// ============================================================ + +describe("isRotatableError", () => { + it("considers auth, rate_limit, billing, timeout as rotatable", () => { + expect(isRotatableError("auth")).toBe(true); + expect(isRotatableError("rate_limit")).toBe(true); + expect(isRotatableError("billing")).toBe(true); + expect(isRotatableError("timeout")).toBe(true); + }); + + it("does not rotate on format or unknown errors", () => { + expect(isRotatableError("format")).toBe(false); + expect(isRotatableError("unknown")).toBe(false); + }); +}); diff --git a/src/agent/runner.ts b/src/agent/runner.ts index 695a0467..7605b27a 100644 --- a/src/agent/runner.ts +++ b/src/agent/runner.ts @@ -34,12 +34,16 @@ import type { AuthProfileFailureReason } from "./auth-profiles/index.js"; // Error classification for auth profile rotation // ============================================================ -function classifyError(error: unknown): AuthProfileFailureReason { +/** Classify an error into an auth profile failure reason */ +export function classifyError(error: unknown): AuthProfileFailureReason { const msg = error instanceof Error ? error.message.toLowerCase() : String(error).toLowerCase(); if (msg.includes("401") || msg.includes("403") || msg.includes("unauthorized") || msg.includes("invalid api key") || msg.includes("authentication")) { return "auth"; } + if (msg.includes("400") || msg.includes("invalid request") || msg.includes("malformed") || msg.includes("bad request") || msg.includes("schema")) { + return "format"; + } if (msg.includes("429") || msg.includes("rate limit") || msg.includes("rate_limit") || msg.includes("too many requests")) { return "rate_limit"; } @@ -53,8 +57,9 @@ function classifyError(error: unknown): AuthProfileFailureReason { } /** Check if an error is potentially retryable via profile rotation */ -function isRotatableError(reason: AuthProfileFailureReason): boolean { - return reason === "auth" || reason === "rate_limit" || reason === "billing"; +export function isRotatableError(reason: AuthProfileFailureReason): boolean { + // timeout is rotatable because some providers hang on rate limit instead of returning 429 + return reason === "auth" || reason === "rate_limit" || reason === "billing" || reason === "timeout"; } export class Agent { @@ -307,38 +312,43 @@ export class Agent { async run(prompt: string): Promise { this.output.state.lastAssistantText = ""; - try { - await this.agent.prompt(prompt); - } catch (error) { - // Attempt auth profile rotation on retryable errors - if (!this.pinnedProfile && this.profileCandidates.length > 1 && this.currentProfileId) { + const canRotate = !this.pinnedProfile && this.profileCandidates.length > 1; + let lastError: unknown; + + // Loop to exhaust all candidate profiles on rotatable errors + while (true) { + try { + await this.agent.prompt(prompt); + break; // success — exit loop + } catch (error) { + lastError = error; + + if (!canRotate || !this.currentProfileId) throw error; + const reason = classifyError(error); - if (isRotatableError(reason)) { - markAuthProfileFailure(this.currentProfileId, reason); + if (!isRotatableError(reason)) throw error; - if (this.debug) { - this.stderr.write( - `[auth-profile] Profile "${this.currentProfileId}" failed (${reason}), attempting rotation...\n`, - ); - } + markAuthProfileFailure(this.currentProfileId, reason); - if (this.advanceAuthProfile()) { - if (this.debug) { - this.stderr.write( - `[auth-profile] Rotated to profile "${this.currentProfileId}"\n`, - ); - } - // Retry with new profile - this.output.state.lastAssistantText = ""; - await this.agent.prompt(prompt); - } else { - throw error; // No more profiles to try - } - } else { - throw error; // Non-rotatable error + if (this.debug) { + this.stderr.write( + `[auth-profile] Profile "${this.currentProfileId}" failed (${reason}), attempting rotation...\n`, + ); } - } else { - throw error; // Pinned profile or single profile + + if (!this.advanceAuthProfile()) { + throw lastError; // All profiles exhausted + } + + if (this.debug) { + this.stderr.write( + `[auth-profile] Rotated to profile "${this.currentProfileId}"\n`, + ); + } + + // Reset output for retry + this.output.state.lastAssistantText = ""; + // continue loop with new profile } } From f2ca86aa1f08ac92a22c3df919f05d697c9bbaf3 Mon Sep 17 00:00:00 2001 From: yushen Date: Tue, 3 Feb 2026 17:47:41 +0800 Subject: [PATCH 18/25] fix(session): harden write lock and repair --- src/agent/session/session-file-repair.test.ts | 21 +++ src/agent/session/session-file-repair.ts | 134 +++++++++--------- src/agent/session/session-write-lock.test.ts | 34 +++++ src/agent/session/session-write-lock.ts | 30 +++- 4 files changed, 149 insertions(+), 70 deletions(-) diff --git a/src/agent/session/session-file-repair.test.ts b/src/agent/session/session-file-repair.test.ts index caeebe3e..d190dd52 100644 --- a/src/agent/session/session-file-repair.test.ts +++ b/src/agent/session/session-file-repair.test.ts @@ -3,6 +3,17 @@ import os from "node:os"; import path from "node:path"; import { describe, expect, it, vi } from "vitest"; import { repairSessionFileIfNeeded } from "./session-file-repair.js"; +import { acquireSessionWriteLock } from "./session-write-lock.js"; + +vi.mock("./session-write-lock.js", async () => { + const actual = await vi.importActual( + "./session-write-lock.js", + ); + return { + ...actual, + acquireSessionWriteLock: vi.fn(actual.acquireSessionWriteLock), + }; +}); describe("repairSessionFileIfNeeded", () => { it("rewrites session files that contain malformed lines", async () => { @@ -77,4 +88,14 @@ describe("repairSessionFileIfNeeded", () => { expect(result.reason).toContain("failed to read session file"); expect(warn).toHaveBeenCalledTimes(1); }); + + it("acquires a write lock while repairing", async () => { + const dir = await fs.mkdtemp(path.join(os.tmpdir(), "multica-session-repair-")); + const file = path.join(dir, "session.jsonl"); + await fs.writeFile(file, "{broken\n{also broken\n", "utf-8"); + + await repairSessionFileIfNeeded({ sessionFile: file }); + + expect(vi.mocked(acquireSessionWriteLock)).toHaveBeenCalledTimes(1); + }); }); diff --git a/src/agent/session/session-file-repair.ts b/src/agent/session/session-file-repair.ts index cb284f23..6e978f7e 100644 --- a/src/agent/session/session-file-repair.ts +++ b/src/agent/session/session-file-repair.ts @@ -1,5 +1,6 @@ import fs from "node:fs/promises"; import path from "node:path"; +import { acquireSessionWriteLock } from "./session-write-lock.js"; type RepairReport = { repaired: boolean; @@ -19,78 +20,83 @@ export async function repairSessionFileIfNeeded(params: { return { repaired: false, droppedLines: 0, reason: "missing session file" }; } - let content: string; + const lock = await acquireSessionWriteLock({ sessionFile }); try { - content = await fs.readFile(sessionFile, "utf-8"); - } catch (err) { - const code = (err as { code?: unknown } | undefined)?.code; - if (code === "ENOENT") { - return { repaired: false, droppedLines: 0, reason: "missing session file" }; - } - const reason = `failed to read session file: ${err instanceof Error ? err.message : "unknown error"}`; - params.warn?.(`session file repair skipped: ${reason} (${path.basename(sessionFile)})`); - return { repaired: false, droppedLines: 0, reason }; - } - - const lines = content.split(/\r?\n/); - const entries: unknown[] = []; - let droppedLines = 0; - - for (const line of lines) { - if (!line.trim()) { - continue; - } + let content: string; try { - const entry = JSON.parse(line); - entries.push(entry); - } catch { - droppedLines += 1; + content = await fs.readFile(sessionFile, "utf-8"); + } catch (err) { + const code = (err as { code?: unknown } | undefined)?.code; + if (code === "ENOENT") { + return { repaired: false, droppedLines: 0, reason: "missing session file" }; + } + const reason = `failed to read session file: ${err instanceof Error ? err.message : "unknown error"}`; + params.warn?.(`session file repair skipped: ${reason} (${path.basename(sessionFile)})`); + return { repaired: false, droppedLines: 0, reason }; } - } - if (entries.length === 0) { - return { repaired: false, droppedLines, reason: "empty session file" }; - } + const lines = content.split(/\r?\n/); + const entries: unknown[] = []; + let droppedLines = 0; - if (droppedLines === 0) { - return { repaired: false, droppedLines: 0 }; - } - - const cleaned = `${entries.map((entry) => JSON.stringify(entry)).join("\n")}\n`; - const backupPath = `${sessionFile}.bak-${process.pid}-${Date.now()}`; - const tmpPath = `${sessionFile}.repair-${process.pid}-${Date.now()}.tmp`; - try { - const stat = await fs.stat(sessionFile).catch(() => null); - await fs.writeFile(backupPath, content, "utf-8"); - if (stat) { - await fs.chmod(backupPath, stat.mode); + for (const line of lines) { + if (!line.trim()) { + continue; + } + try { + const entry = JSON.parse(line); + entries.push(entry); + } catch { + droppedLines += 1; + } } - await fs.writeFile(tmpPath, cleaned, "utf-8"); - if (stat) { - await fs.chmod(tmpPath, stat.mode); + + if (entries.length === 0) { + return { repaired: false, droppedLines, reason: "empty session file" }; } - await fs.rename(tmpPath, sessionFile); - } catch (err) { + + if (droppedLines === 0) { + return { repaired: false, droppedLines: 0 }; + } + + const cleaned = `${entries.map((entry) => JSON.stringify(entry)).join("\n")}\n`; + const backupPath = `${sessionFile}.bak-${process.pid}-${Date.now()}`; + const tmpPath = `${sessionFile}.repair-${process.pid}-${Date.now()}.tmp`; try { - await fs.unlink(tmpPath); - } catch (cleanupErr) { - params.warn?.( - `session file repair cleanup failed: ${cleanupErr instanceof Error ? cleanupErr.message : "unknown error"} (${path.basename( - tmpPath, - )})`, - ); + const stat = await fs.stat(sessionFile).catch(() => null); + await fs.writeFile(backupPath, content, "utf-8"); + if (stat) { + await fs.chmod(backupPath, stat.mode); + } + await fs.writeFile(tmpPath, cleaned, "utf-8"); + if (stat) { + await fs.chmod(tmpPath, stat.mode); + } + await fs.rename(tmpPath, sessionFile); + } catch (err) { + try { + await fs.unlink(tmpPath); + } catch (cleanupErr) { + params.warn?.( + `session file repair cleanup failed: ${cleanupErr instanceof Error ? cleanupErr.message : "unknown error"} (${path.basename( + tmpPath, + )})`, + ); + } + return { + repaired: false, + droppedLines, + reason: `repair failed: ${err instanceof Error ? err.message : "unknown error"}`, + }; } - return { - repaired: false, - droppedLines, - reason: `repair failed: ${err instanceof Error ? err.message : "unknown error"}`, - }; - } - params.warn?.( - `session file repaired: dropped ${droppedLines} malformed line(s) (${path.basename( - sessionFile, - )})`, - ); - return { repaired: true, droppedLines, backupPath }; + params.warn?.( + `session file repaired: dropped ${droppedLines} malformed line(s) (${path.basename( + sessionFile, + )})`, + ); + return { repaired: true, droppedLines, backupPath }; + } finally { + await lock.release(); + } } diff --git a/src/agent/session/session-write-lock.test.ts b/src/agent/session/session-write-lock.test.ts index 1eb3f024..06c4f587 100644 --- a/src/agent/session/session-write-lock.test.ts +++ b/src/agent/session/session-write-lock.test.ts @@ -72,6 +72,40 @@ describe("acquireSessionWriteLock", () => { } }); + it("does not delete recent lock files with invalid payloads", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "multica-lock-")); + try { + const sessionFile = path.join(root, "sessions.json"); + const lockPath = `${sessionFile}.lock`; + await fs.writeFile(lockPath, "{", "utf8"); + + await expect( + acquireSessionWriteLock({ sessionFile, timeoutMs: 200, staleMs: 60_000 }), + ).rejects.toThrow(/timeout/); + + await expect(fs.access(lockPath)).resolves.toBeUndefined(); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } + }); + + it("reclaims invalid lock files when mtime is stale", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "multica-lock-")); + try { + const sessionFile = path.join(root, "sessions.json"); + const lockPath = `${sessionFile}.lock`; + await fs.writeFile(lockPath, "{", "utf8"); + const old = new Date(Date.now() - 60_000); + await fs.utimes(lockPath, old, old); + + const lock = await acquireSessionWriteLock({ sessionFile, timeoutMs: 500, staleMs: 10 }); + + await lock.release(); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } + }); + it("removes held locks on termination signals", async () => { const signals = ["SIGINT", "SIGTERM", "SIGQUIT", "SIGABRT"] as const; for (const signal of signals) { diff --git a/src/agent/session/session-write-lock.ts b/src/agent/session/session-write-lock.ts index 7335abaf..c6364e32 100644 --- a/src/agent/session/session-write-lock.ts +++ b/src/agent/session/session-write-lock.ts @@ -109,6 +109,15 @@ async function readLockPayload(lockPath: string): Promise { + try { + const stat = await fs.stat(lockPath); + return Date.now() - stat.mtimeMs; + } catch { + return null; + } +} + export async function acquireSessionWriteLock(params: { sessionFile: string; timeoutMs?: number; @@ -183,12 +192,21 @@ export async function acquireSessionWriteLock(params: { throw err; } const payload = await readLockPayload(lockPath); - const createdAt = payload?.createdAt ? Date.parse(payload.createdAt) : NaN; - const stale = !Number.isFinite(createdAt) || Date.now() - createdAt > staleMs; - const alive = payload?.pid ? isAlive(payload.pid) : false; - if (stale || !alive) { - await fs.rm(lockPath, { force: true }); - continue; + if (payload) { + const createdAt = payload.createdAt ? Date.parse(payload.createdAt) : NaN; + const stale = !Number.isFinite(createdAt) || Date.now() - createdAt > staleMs; + const alive = payload.pid ? isAlive(payload.pid) : false; + if (stale || !alive) { + await fs.rm(lockPath, { force: true }); + continue; + } + } else { + const ageMs = await getLockAgeMs(lockPath); + const stale = ageMs !== null && ageMs > staleMs; + if (stale) { + await fs.rm(lockPath, { force: true }); + continue; + } } const delay = Math.min(1000, 50 * attempt); From 0fee16f7350251bdddde0ac7f437c69b3ce7c3fd Mon Sep 17 00:00:00 2001 From: yushen Date: Tue, 3 Feb 2026 17:49:26 +0800 Subject: [PATCH 19/25] test(session): reset lock mock --- src/agent/session/session-file-repair.test.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/agent/session/session-file-repair.test.ts b/src/agent/session/session-file-repair.test.ts index d190dd52..b6ef250e 100644 --- a/src/agent/session/session-file-repair.test.ts +++ b/src/agent/session/session-file-repair.test.ts @@ -1,7 +1,7 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; -import { describe, expect, it, vi } from "vitest"; +import { beforeEach, describe, expect, it, vi } from "vitest"; import { repairSessionFileIfNeeded } from "./session-file-repair.js"; import { acquireSessionWriteLock } from "./session-write-lock.js"; @@ -16,6 +16,10 @@ vi.mock("./session-write-lock.js", async () => { }); describe("repairSessionFileIfNeeded", () => { + beforeEach(() => { + vi.mocked(acquireSessionWriteLock).mockClear(); + }); + it("rewrites session files that contain malformed lines", async () => { const dir = await fs.mkdtemp(path.join(os.tmpdir(), "multica-session-repair-")); const file = path.join(dir, "session.jsonl"); From ef77c13fc8d6ad86987d92915353de6cadcca1f8 Mon Sep 17 00:00:00 2001 From: yushen Date: Tue, 3 Feb 2026 17:55:50 +0800 Subject: [PATCH 20/25] docs: refine subagent diagram --- docs/subagent-architecture.html | 884 ++++++++++++++++++++++++++++++++ 1 file changed, 884 insertions(+) create mode 100644 docs/subagent-architecture.html diff --git a/docs/subagent-architecture.html b/docs/subagent-architecture.html new file mode 100644 index 00000000..a7936589 --- /dev/null +++ b/docs/subagent-architecture.html @@ -0,0 +1,884 @@ + + + + + +Subagent Orchestration Architecture + + + +

    + +

    Subagent Orchestration Architecture

    +

    Super Multica — Parent-child agent spawning, lifecycle management, and result announcement

    + + +

    System Architecture

    + + +
    + + +
    +
    +
    + Agent + Parent Agent (Interactive Session) +
    +
    + User-facing agent with full tool access. Can spawn child agents via sessions_spawn tool. + Receives announcement messages when child agents complete. +
    +
    src/agent/runner.ts → tools: sessions_spawn, exec, glob, web_fetch, ...
    +
    +
    + + +
    + + + + + + + + + + + + spawn + + + announce + +
    + + +
    +
    +
    + Singleton + Hub +
    +
    + Central coordinator. Creates & manages all agents. Provides createSubagent(), + getAgent(), closeAgent(). Calls registry init on startup, shutdown on exit. +
    +
    src/hub/hub.ts + hub-singleton.ts
    +
    + +
    +
    + Module + Subagent Registry +
    +
    + In-memory Map + JSON persistence. Tracks run lifecycle (created → started → ended). + Archive sweeper cleans old runs every 60s. Handles crash recovery on restart. +
    +
    src/agent/subagent/registry.ts
    +
    +
    + + +
    + + + + + + + + + + + createSubagent() + + watchChildAgent() + +
    + + +
    +
    +
    + Agent + Child AsyncAgent +
    +
    + Isolated agent with isSubagent: true. Restricted tools (no sessions_spawn). + Custom system prompt: stay focused, no user messaging, no nested spawning. +
    +
    src/agent/async-agent.ts
    +
    + +
    +
    + Flow + Announce Module +
    +
    + Reads child's last assistant reply from session JSONL. Formats announcement message with findings, duration, status. + Delivers to parent via parentAgent.write(). +
    +
    src/agent/subagent/announce.ts
    +
    + +
    +
    + Store + Registry Store +
    +
    + JSON file persistence at ~/.super-multica/subagents/runs.json. + Schema: { version: 1, runs: {...} }. Survives process restarts. +
    +
    src/agent/subagent/registry-store.ts
    +
    +
    + +
    + + +

    Call Chain — Spawn & Lifecycle

    + + +
    + +
    +
    Parent Agent invokes sessions_spawn tool
    +
    + Agent calls tool with { task, label?, model?, cleanup?, timeoutSeconds? }. + Guard rejects if isSubagent === true. +
    +
    sessions-spawn.ts → execute()
    +
    + +
    +
    Generate IDs & build system prompt
    +
    + runId = UUIDv7, childSessionId = UUIDv7. + buildSubagentSystemPrompt() creates prompt with task context, rules (no nested spawn, stay focused). +
    +
    announce.ts → buildSubagentSystemPrompt()
    +
    + +
    +
    Hub creates child AsyncAgent
    +
    + hub.createSubagent(childSessionId, { systemPrompt, model }) + creates an AsyncAgent with isSubagent: true. Not persisted to agent store (ephemeral). +
    +
    hub.ts → createSubagent()
    +
    + +
    +
    Register run in registry
    +
    + registerSubagentRun() saves record to in-memory Map + JSON file. + Sets createdAt, starts archive sweeper. +
    +
    registry.ts → registerSubagentRun()
    +
    + +
    +
    Start lifecycle watcher
    +
    + watchChildAgent() sets startedAt. + Attaches childAgent.waitForIdle() (promise resolves when task queue drained) + and childAgent.onClose() callback. Optionally sets timeout timer. +
    +
    registry.ts → watchChildAgent() → AsyncAgent.waitForIdle() + onClose()
    +
    + +
    +
    Write task to child & return to parent
    +
    + childAgent.write(task) enqueues the task (non-blocking). + Tool returns { status: "accepted", childSessionId, runId } immediately. + Parent agent continues working. +
    +
    async-agent.ts → write() (enqueues to serial queue)
    +
    + +
    +
    Child agent processes task autonomously
    +
    + Child runs LLM inference with restricted tools. Uses its own session. + May call exec, glob, web_fetch etc. but NOT sessions_spawn. +
    +
    runner.ts → Agent.run() (within AsyncAgent queue)
    +
    + +
    +
    Child completes → waitForIdle() resolves
    +
    + Task queue drains. Watcher's cleanup callback fires: sets endedAt, outcome: { status: "ok" }. + Persists updated record to JSON. +
    +
    registry.ts → cleanup() → handleRunCompletion()
    +
    + +
    +
    Announce flow: read child reply & deliver to parent
    +
    + readLatestAssistantReply(childSessionId) reads session JSONL, extracts last assistant text. + formatAnnouncementMessage() builds summary with task, status, findings, runtime. + parentAgent.write(message) delivers to parent. +
    +
    announce.ts → runSubagentAnnounceFlow() → hub.getAgent(parentId).write()
    +
    + +
    +
    Session cleanup & archive
    +
    + If cleanup === "delete": removes child session directory + closes agent in Hub. + Schedules archive at now + 60min. Sweeper removes from registry after TTL. +
    +
    registry.ts → deleteChildSession() + sweep()
    +
    + +
    + + +

    Sequence Diagram

    + + +
    + + + + + + Parent Agent + + + sessions_spawn + + + Hub + + + Registry + + + Child Agent + + + + + + + + + + + execute({ task, label }) + + + + createSubagent(id, opts) + + + + new AsyncAgent({ isSubagent: true }) + + + + registerSubagentRun(params) + + + + waitForIdle() + onClose() + + + + childAgent.write(task) + + + + { status: "accepted", runId } + + + + + async (non-blocking) + + + + LLM + inference + + + + idle (resolved) + + + + announce + + + + parentAgent.write(announcement) + + + + deleteChildSession() + + + + archive 60m + + + + + + + + + + + + + + + + + + + + + + + +
    + + +

    Run State Machine

    + + +
    +
    + + created +
    +
    + + + + + + + + + startedAt +
    +
    + + started +
    +
    + + + + + + + + + endedAt +
    +
    + + ended +
    +
    + + + + + + + + + announce +
    +
    + + cleanup done +
    +
    + + + + + + + + + 60 min +
    +
    + + archived +
    +
    + +
    +
    Outcome Status Values
    +
    + ok — Task completed normally (waitForIdle resolved) + error — Child agent threw an error + timeout — Exceeded timeoutSeconds limit + unknown — Process crash or Hub shutdown +
    +
    + + +

    Module Map

    + + +
    +
    +
    src/agent/subagent/types.ts
    +
    Core type definitions
    +
    + export SubagentRunOutcome
    + export SubagentRunRecord
    + export RegisterSubagentRunParams
    + export SubagentAnnounceParams
    + export SubagentSystemPromptParams +
    +
    + +
    +
    src/agent/subagent/registry.ts
    +
    In-memory registry + lifecycle watcher
    +
    + export initSubagentRegistry()
    + export registerSubagentRun()
    + export listSubagentRuns()
    + export releaseSubagentRun()
    + export getSubagentRun()
    + export shutdownSubagentRegistry() +
    +
    + +
    +
    src/agent/subagent/registry-store.ts
    +
    JSON file persistence
    +
    + export loadSubagentRuns()
    + export saveSubagentRuns()
    + export getSubagentStorePath() +
    +
    + +
    +
    src/agent/subagent/announce.ts
    +
    Result propagation child → parent
    +
    + export buildSubagentSystemPrompt()
    + export readLatestAssistantReply()
    + export formatAnnouncementMessage()
    + export runSubagentAnnounceFlow() +
    +
    + +
    +
    src/agent/tools/sessions-spawn.ts
    +
    Tool definition for parent agents
    +
    + export createSessionsSpawnTool()
    + schema: { task, label?, model?,
    +   cleanup?, timeoutSeconds? } +
    +
    + +
    +
    src/hub/hub-singleton.ts
    +
    Global Hub access for tools & registry
    +
    + export setHub(hub)
    + export getHub()
    + export isHubInitialized() +
    +
    +
    + + +

    Key Design Decisions

    + + +
    +
    +
    waitForIdle() vs stream consumption
    +
    + Channel is single-reader. Hub.consumeAgent() already reads the stream for forwarding events. + Registry uses waitForIdle() (promise on internal task queue) to detect completion without competing for the stream. +
    +
    +
    +
    Singleton Hub access
    +
    + Tools and registry modules cannot receive Hub via constructor injection (tools are created before Hub exists). + A module-level singleton (setHub/getHub) bridges this gap, with isHubInitialized() guard for test safety. +
    +
    +
    +
    Crash recovery
    +
    + Runs are persisted to JSON after every state change. On restart, initSubagentRegistry() + loads persisted runs: completed-but-unannounced runs trigger announce flow; unfinished runs are marked as + status: "unknown". +
    +
    +
    +
    Subagent isolation
    +
    + Child agents have isSubagent: true which applies tool deny-list (blocks sessions_spawn). + System prompt explicitly forbids nested spawning, direct user communication, and off-topic work. + Sessions are ephemeral — deleted after announce unless cleanup: "keep". +
    +
    +
    + +
    + Super Multica — Subagent Orchestration System — Branch: subagent-orchestration +
    + +
    + + From 54ee2f3b0034f0b598ec0ec9ff1b846b9f590acd Mon Sep 17 00:00:00 2001 From: Naiyuan Qing <145280634+NevilleQingNY@users.noreply.github.com> Date: Tue, 3 Feb 2026 17:56:22 +0800 Subject: [PATCH 21/25] feat(ui): add streaming indicator to StreamingMarkdown Show a spinner with "Generating..." label while assistant messages are being streamed. The indicator appears immediately when content is empty and persists below the content until streaming completes. Also fix duplicate React key warning by including block index in the key to handle blocks with identical content. Co-Authored-By: Claude Opus 4.5 --- .../src/components/markdown/StreamingMarkdown.tsx | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/ui/src/components/markdown/StreamingMarkdown.tsx b/packages/ui/src/components/markdown/StreamingMarkdown.tsx index 6d68435f..65b585a8 100644 --- a/packages/ui/src/components/markdown/StreamingMarkdown.tsx +++ b/packages/ui/src/components/markdown/StreamingMarkdown.tsx @@ -1,5 +1,6 @@ import * as React from 'react' import { Markdown, type RenderMode } from './Markdown' +import { Spinner } from '@multica/ui/components/spinner' export interface StreamingMarkdownProps { content: string @@ -162,6 +163,17 @@ export function StreamingMarkdown({ ) } + const indicator = ( +
    + + Generating... +
    + ) + + if (blocks.length === 0) { + return indicator + } + return ( <> {blocks.map((block, i) => { @@ -169,7 +181,7 @@ export function StreamingMarkdown({ // Complete blocks use content hash as key -> stable identity -> memoized // Last block uses "active" prefix -> always re-renders on content change - const key = isLastBlock ? `active-${i}` : `block-${simpleHash(block.content)}` + const key = isLastBlock ? `active-${i}` : `block-${i}-${simpleHash(block.content)}` return ( ) })} + {indicator} ) } From c67d677f50a9e30f54dcb7618be3048133aec6bc Mon Sep 17 00:00:00 2001 From: yushen Date: Tue, 3 Feb 2026 18:04:40 +0800 Subject: [PATCH 22/25] docs: align subagent call order --- docs/subagent-architecture.html | 44 ++++++++++++++++----------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/docs/subagent-architecture.html b/docs/subagent-architecture.html index a7936589..6e12c449 100644 --- a/docs/subagent-architecture.html +++ b/docs/subagent-architecture.html @@ -498,7 +498,16 @@
    hub.ts → createSubagent()
    -
    +
    +
    Write task to child (non-blocking)
    +
    + childAgent.write(task) enqueues the task to the serial queue. + This happens before registration so waitForIdle() observes queued work. +
    +
    async-agent.ts → write() (enqueues to serial queue)
    +
    + +
    Register run in registry
    registerSubagentRun() saves record to in-memory Map + JSON file. @@ -507,26 +516,17 @@
    registry.ts → registerSubagentRun()
    -
    -
    Start lifecycle watcher
    +
    +
    Start lifecycle watcher & return to parent
    watchChildAgent() sets startedAt. Attaches childAgent.waitForIdle() (promise resolves when task queue drained) and childAgent.onClose() callback. Optionally sets timeout timer. + Tool returns { status: "accepted", childSessionId, runId } immediately.
    registry.ts → watchChildAgent() → AsyncAgent.waitForIdle() + onClose()
    -
    -
    Write task to child & return to parent
    -
    - childAgent.write(task) enqueues the task (non-blocking). - Tool returns { status: "accepted", childSessionId, runId } immediately. - Parent agent continues working. -
    -
    async-agent.ts → write() (enqueues to serial queue)
    -
    -
    Child agent processes task autonomously
    @@ -615,17 +615,17 @@ new AsyncAgent({ isSubagent: true }) - - - registerSubagentRun(params) + + + childAgent.write(task) - - - waitForIdle() + onClose() + + + registerSubagentRun(params) - - - childAgent.write(task) + + + waitForIdle() + onClose() From 617ddfbfeab36adebeea316a27e75899f287bf4a Mon Sep 17 00:00:00 2001 From: yushen Date: Tue, 3 Feb 2026 18:05:00 +0800 Subject: [PATCH 23/25] refactor(auth-profiles): replace proper-lockfile with custom file lock Unify locking strategy across the project by using a custom synchronous file lock (exclusive-create based, with PID stale detection) instead of the proper-lockfile dependency, matching the pattern in session-write-lock. Co-Authored-By: Claude Opus 4.5 --- package.json | 2 - pnpm-lock.yaml | 33 --------- src/agent/auth-profiles/store.ts | 114 ++++++++++++++++++++++++++----- 3 files changed, 98 insertions(+), 51 deletions(-) diff --git a/package.json b/package.json index d0952bbf..fe1d242a 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,6 @@ "packageManager": "pnpm@10.28.2", "devDependencies": { "@types/node": "catalog:", - "@types/proper-lockfile": "^4.1.4", "@types/turndown": "^5.0.6", "@types/uuid": "^11.0.0", "@vitest/coverage-v8": "^4.0.18", @@ -62,7 +61,6 @@ "pino": "^10.3.0", "pino-http": "^11.0.0", "pino-pretty": "^13.1.3", - "proper-lockfile": "^4.1.2", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.2", "socket.io": "^4.8.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 035c9790..7e74a4c2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,24 +9,9 @@ catalogs: '@types/node': specifier: ^25.0.10 version: 25.0.10 - '@types/react': - specifier: ^19 - version: 19.2.10 - '@types/react-dom': - specifier: ^19 - version: 19.2.3 - react: - specifier: 19.2.3 - version: 19.2.3 - react-dom: - specifier: 19.2.3 - version: 19.2.3 typescript: specifier: ^5.9.3 version: 5.9.3 - zustand: - specifier: ^5.0.0 - version: 5.0.10 importers: @@ -89,9 +74,6 @@ importers: pino-pretty: specifier: ^13.1.3 version: 13.1.3 - proper-lockfile: - specifier: ^4.1.2 - version: 4.1.2 reflect-metadata: specifier: ^0.2.2 version: 0.2.2 @@ -120,9 +102,6 @@ importers: '@types/node': specifier: 'catalog:' version: 25.0.10 - '@types/proper-lockfile': - specifier: ^4.1.4 - version: 4.1.4 '@types/turndown': specifier: ^5.0.6 version: 5.0.6 @@ -3341,9 +3320,6 @@ packages: '@types/plist@3.0.5': resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} - '@types/proper-lockfile@4.1.4': - resolution: {integrity: sha512-uo2ABllncSqg9F1D4nugVl9v93RmjxF6LJzQLMLDdPaXCUIDPeOJ21Gbqi43xNKzBi/WQ0Q0dICqufzQbMjipQ==} - '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: @@ -3358,9 +3334,6 @@ packages: '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - '@types/retry@0.12.5': - resolution: {integrity: sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==} - '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -12578,10 +12551,6 @@ snapshots: xmlbuilder: 15.1.1 optional: true - '@types/proper-lockfile@4.1.4': - dependencies: - '@types/retry': 0.12.5 - '@types/react-dom@19.2.3(@types/react@19.1.17)': dependencies: '@types/react': 19.1.17 @@ -12603,8 +12572,6 @@ snapshots: dependencies: '@types/node': 25.0.10 - '@types/retry@0.12.5': {} - '@types/stack-utils@2.0.3': {} '@types/statuses@2.0.6': {} diff --git a/src/agent/auth-profiles/store.ts b/src/agent/auth-profiles/store.ts index 1d0ab0ca..f50f2788 100644 --- a/src/agent/auth-profiles/store.ts +++ b/src/agent/auth-profiles/store.ts @@ -3,30 +3,113 @@ * * Persistence layer for auth profile runtime state. * Stores usage stats, cooldowns, and last-good info in ~/.super-multica/auth-profiles.json. - * Uses proper-lockfile for safe concurrent access across multiple agent processes. + * Uses a custom file lock (exclusive-create based) for safe concurrent access. */ -import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs"; +import { + existsSync, + readFileSync, + writeFileSync, + mkdirSync, + openSync, + closeSync, + rmSync, + statSync, + constants as fsConstants, +} from "node:fs"; import { join, dirname } from "node:path"; -import lockfile from "proper-lockfile"; import { DATA_DIR } from "../../shared/paths.js"; import { AUTH_STORE_VERSION, AUTH_PROFILE_STORE_FILENAME } from "./constants.js"; import type { AuthProfileStore } from "./types.js"; // ============================================================ -// Lock options (matches OpenClaw's AUTH_STORE_LOCK_OPTIONS) +// Custom file lock (synchronous, exclusive-create based) // ============================================================ -const LOCK_OPTIONS = { - retries: { - retries: 10, - factor: 2, - minTimeout: 100, - maxTimeout: 10_000, - randomize: true, - }, - stale: 30_000, -} as const; +const LOCK_STALE_MS = 30_000; +const LOCK_RETRY_COUNT = 10; +const LOCK_RETRY_BASE_MS = 50; +const LOCK_RETRY_MAX_MS = 1_000; + +type LockPayload = { pid: number; createdAt: string }; + +function isProcessAlive(pid: number): boolean { + if (!Number.isFinite(pid) || pid <= 0) return false; + try { + process.kill(pid, 0); + return true; + } catch { + return false; + } +} + +function readLockPayloadSync(lockPath: string): LockPayload | null { + try { + const raw = readFileSync(lockPath, "utf8"); + const parsed = JSON.parse(raw) as Partial; + if (typeof parsed.pid !== "number" || typeof parsed.createdAt !== "string") return null; + return { pid: parsed.pid, createdAt: parsed.createdAt }; + } catch { + return null; + } +} + +function isLockStale(lockPath: string): boolean { + const payload = readLockPayloadSync(lockPath); + if (payload) { + const age = Date.now() - Date.parse(payload.createdAt); + if (!Number.isFinite(age) || age > LOCK_STALE_MS) return true; + return !isProcessAlive(payload.pid); + } + // No payload readable — check file mtime + try { + const stat = statSync(lockPath); + return Date.now() - stat.mtimeMs > LOCK_STALE_MS; + } catch { + return true; // Can't stat — treat as stale + } +} + +/** + * Acquire a synchronous exclusive file lock. + * Returns a release function. Throws if lock cannot be acquired after retries. + */ +function acquireLockSync(filePath: string): () => void { + const lockPath = `${filePath}.lock`; + const payload = JSON.stringify( + { pid: process.pid, createdAt: new Date().toISOString() }, + null, + 2, + ); + + for (let attempt = 0; attempt < LOCK_RETRY_COUNT; attempt++) { + try { + // O_WRONLY | O_CREAT | O_EXCL — fails if file already exists + const fd = openSync(lockPath, fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL); + writeFileSync(fd, payload, "utf8"); + closeSync(fd); + return () => { + try { rmSync(lockPath, { force: true }); } catch { /* best effort */ } + }; + } catch (err) { + const code = (err as { code?: string }).code; + if (code !== "EEXIST") throw err; + + // Lock file exists — check if stale + if (isLockStale(lockPath)) { + try { rmSync(lockPath, { force: true }); } catch { /* ignore */ } + continue; + } + + // Wait and retry (synchronous busy-wait via Atomics for minimal overhead) + const delay = Math.min(LOCK_RETRY_MAX_MS, LOCK_RETRY_BASE_MS * (attempt + 1)); + const buf = new SharedArrayBuffer(4); + Atomics.wait(new Int32Array(buf), 0, 0, delay); + } + } + + throw new Error(`Failed to acquire lock after ${LOCK_RETRY_COUNT} retries: ${filePath}`); +} // ============================================================ // Paths @@ -112,8 +195,7 @@ export function updateAuthProfileStore( const storePath = ensureAuthStoreFile(); try { - // Acquire file lock - const release = lockfile.lockSync(storePath, LOCK_OPTIONS); + const release = acquireLockSync(storePath); try { const store = loadAuthProfileStore(); updater(store); From 9ed4cdf2b05391e000aeb2465eeb8ad95feebc36 Mon Sep 17 00:00:00 2001 From: yushen Date: Tue, 3 Feb 2026 18:23:18 +0800 Subject: [PATCH 24/25] fix(agent): handle auth profile failures and provider mismatch --- src/agent/runner.ts | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/agent/runner.ts b/src/agent/runner.ts index 0ac3268e..cc49c567 100644 --- a/src/agent/runner.ts +++ b/src/agent/runner.ts @@ -91,7 +91,21 @@ export class Agent { this.debug = options.debug ?? false; // Resolve provider and model from options > env vars > defaults - this.resolvedProvider = options.provider ?? credentialManager.getLlmProvider() ?? "kimi-coding"; + const defaultProvider = options.provider ?? credentialManager.getLlmProvider() ?? "kimi-coding"; + if (options.authProfileId) { + const profileProvider = options.authProfileId.includes(":") + ? options.authProfileId.split(":")[0]! + : options.authProfileId; + if (options.provider && options.provider !== profileProvider) { + throw new Error( + `authProfileId provider mismatch: authProfileId="${options.authProfileId}" ` + + `does not match provider="${options.provider}"`, + ); + } + this.resolvedProvider = profileProvider; + } else { + this.resolvedProvider = defaultProvider; + } const resolvedModel = resolveModelId(this.resolvedProvider, options.model); // === Auth profile resolution === @@ -327,12 +341,13 @@ export class Agent { } catch (error) { lastError = error; - if (!canRotate || !this.currentProfileId) throw error; - const reason = classifyError(error); - if (!isRotatableError(reason)) throw error; + if (this.currentProfileId && isRotatableError(reason)) { + markAuthProfileFailure(this.currentProfileId, reason); + } - markAuthProfileFailure(this.currentProfileId, reason); + if (!canRotate || !this.currentProfileId) throw error; + if (!isRotatableError(reason)) throw error; if (this.debug) { this.stderr.write( From a065d5f64cff8d7dbdb3ce12969600defb388da3 Mon Sep 17 00:00:00 2001 From: yushen Date: Tue, 3 Feb 2026 18:27:21 +0800 Subject: [PATCH 25/25] fix(auth-profiles): add jittered cooldowns --- src/agent/auth-profiles/usage.test.ts | 39 ++++++++++++++++----------- src/agent/auth-profiles/usage.ts | 22 ++++++++++----- 2 files changed, 39 insertions(+), 22 deletions(-) diff --git a/src/agent/auth-profiles/usage.test.ts b/src/agent/auth-profiles/usage.test.ts index daaeed8e..185f8adf 100644 --- a/src/agent/auth-profiles/usage.test.ts +++ b/src/agent/auth-profiles/usage.test.ts @@ -19,18 +19,24 @@ import type { ProfileUsageStats } from "./types.js"; describe("calculateCooldownMs", () => { it("applies exponential backoff with a 1h cap", () => { - expect(calculateCooldownMs(1)).toBe(60_000); // 1 min - expect(calculateCooldownMs(2)).toBe(5 * 60_000); // 5 min - expect(calculateCooldownMs(3)).toBe(25 * 60_000); // 25 min - expect(calculateCooldownMs(4)).toBe(60 * 60_000); // 1 hour (cap) - expect(calculateCooldownMs(5)).toBe(60 * 60_000); // 1 hour (cap) - expect(calculateCooldownMs(100)).toBe(60 * 60_000); // still capped + const max = () => 1; // equal-jitter max + expect(calculateCooldownMs(1, max)).toBe(60_000); // 1 min + expect(calculateCooldownMs(2, max)).toBe(5 * 60_000); // 5 min + expect(calculateCooldownMs(3, max)).toBe(25 * 60_000); // 25 min + expect(calculateCooldownMs(4, max)).toBe(60 * 60_000); // 1 hour (cap) + expect(calculateCooldownMs(5, max)).toBe(60 * 60_000); // 1 hour (cap) + expect(calculateCooldownMs(100, max)).toBe(60 * 60_000); // still capped }); it("returns 0 for errorCount <= 0", () => { expect(calculateCooldownMs(0)).toBe(0); expect(calculateCooldownMs(-1)).toBe(0); }); + + it("applies equal jitter with a 50% floor", () => { + const min = () => 0; + expect(calculateCooldownMs(1, min)).toBe(30_000); // 50% of 1 min + }); }); // ============================================================ @@ -40,11 +46,12 @@ describe("calculateCooldownMs", () => { describe("calculateBillingDisableMs", () => { it("applies exponential backoff with a 24h cap", () => { const h = 60 * 60 * 1000; - expect(calculateBillingDisableMs(1)).toBe(5 * h); // 5h - expect(calculateBillingDisableMs(2)).toBe(10 * h); // 10h - expect(calculateBillingDisableMs(3)).toBe(20 * h); // 20h - expect(calculateBillingDisableMs(4)).toBe(24 * h); // 24h (cap) - expect(calculateBillingDisableMs(5)).toBe(24 * h); // still capped + const max = () => 1; + expect(calculateBillingDisableMs(1, max)).toBe(5 * h); // 5h + expect(calculateBillingDisableMs(2, max)).toBe(10 * h); // 10h + expect(calculateBillingDisableMs(3, max)).toBe(20 * h); // 20h + expect(calculateBillingDisableMs(4, max)).toBe(24 * h); // 24h (cap) + expect(calculateBillingDisableMs(5, max)).toBe(24 * h); // still capped }); it("returns 0 for count <= 0", () => { @@ -94,7 +101,7 @@ describe("computeNextProfileUsageStats", () => { const now = 1_700_000_000_000; it("increments errorCount and sets cooldown for non-billing failure", () => { - const next = computeNextProfileUsageStats({}, "rate_limit", now); + const next = computeNextProfileUsageStats({}, "rate_limit", now, () => 1); expect(next.errorCount).toBe(1); expect(next.lastFailureAt).toBe(now); expect(next.cooldownUntil).toBe(now + COOLDOWN_BASE_MS); @@ -108,14 +115,14 @@ describe("computeNextProfileUsageStats", () => { lastFailureAt: now - 1000, failureCounts: { rate_limit: 2 }, }; - const next = computeNextProfileUsageStats(stats, "rate_limit", now); + const next = computeNextProfileUsageStats(stats, "rate_limit", now, () => 1); expect(next.errorCount).toBe(3); // Error 3 -> 25 min cooldown expect(next.cooldownUntil).toBe(now + 25 * 60_000); }); it("sets disabledUntil for billing failures (~5h by default)", () => { - const next = computeNextProfileUsageStats({}, "billing", now); + const next = computeNextProfileUsageStats({}, "billing", now, () => 1); expect(next.errorCount).toBe(1); expect(next.disabledUntil).toBe(now + 5 * 60 * 60 * 1000); expect(next.disabledReason).toBe("billing"); @@ -129,7 +136,7 @@ describe("computeNextProfileUsageStats", () => { lastFailureAt: oldFailure, failureCounts: { auth: 3, rate_limit: 2 }, }; - const next = computeNextProfileUsageStats(stats, "auth", now); + const next = computeNextProfileUsageStats(stats, "auth", now, () => 1); // Counters reset, so this is treated as error #1 expect(next.errorCount).toBe(1); expect(next.failureCounts?.auth).toBe(1); @@ -141,7 +148,7 @@ describe("computeNextProfileUsageStats", () => { errorCount: 10, lastFailureAt: now - 1000, }; - const next = computeNextProfileUsageStats(stats, "unknown", now); + const next = computeNextProfileUsageStats(stats, "unknown", now, () => 1); expect(next.cooldownUntil).toBe(now + COOLDOWN_MAX_MS); }); }); diff --git a/src/agent/auth-profiles/usage.ts b/src/agent/auth-profiles/usage.ts index 181c78de..5aad992b 100644 --- a/src/agent/auth-profiles/usage.ts +++ b/src/agent/auth-profiles/usage.ts @@ -44,10 +44,18 @@ export function isProfileInCooldown(stats: ProfileUsageStats, now?: number): boo * * Formula: min(COOLDOWN_MAX_MS, COOLDOWN_BASE_MS * COOLDOWN_FACTOR ^ min(errorCount - 1, 3)) */ -export function calculateCooldownMs(errorCount: number): number { +function applyEqualJitter(baseMs: number, rng?: () => number): number { + if (baseMs <= 0) return 0; + const rand = Math.min(1, Math.max(0, (rng ?? Math.random)())); + const half = Math.floor(baseMs / 2); + return half + Math.floor(rand * (baseMs - half)); +} + +export function calculateCooldownMs(errorCount: number, rng?: () => number): number { if (errorCount <= 0) return 0; const exponent = Math.min(errorCount - 1, 3); - return Math.min(COOLDOWN_MAX_MS, COOLDOWN_BASE_MS * COOLDOWN_FACTOR ** exponent); + const base = Math.min(COOLDOWN_MAX_MS, COOLDOWN_BASE_MS * COOLDOWN_FACTOR ** exponent); + return applyEqualJitter(base, rng); } /** @@ -56,13 +64,14 @@ export function calculateCooldownMs(errorCount: number): number { * * Formula: min(BILLING_MAX_HOURS, BILLING_BACKOFF_HOURS * 2 ^ (count - 1)) * hours_to_ms */ -export function calculateBillingDisableMs(billingFailCount: number): number { +export function calculateBillingDisableMs(billingFailCount: number, rng?: () => number): number { if (billingFailCount <= 0) return 0; const hours = Math.min( BILLING_MAX_HOURS, BILLING_BACKOFF_HOURS * 2 ** (billingFailCount - 1), ); - return hours * 60 * 60 * 1000; + const base = hours * 60 * 60 * 1000; + return applyEqualJitter(base, rng); } // ============================================================ @@ -83,6 +92,7 @@ export function computeNextProfileUsageStats( stats: ProfileUsageStats, reason: AuthProfileFailureReason, now?: number, + rng?: () => number, ): ProfileUsageStats { const ts = now ?? Date.now(); const next = { ...stats }; @@ -106,11 +116,11 @@ export function computeNextProfileUsageStats( // Apply cooldown based on failure reason if (reason === "billing") { const billingCount = next.failureCounts.billing ?? 1; - const disableMs = calculateBillingDisableMs(billingCount); + const disableMs = calculateBillingDisableMs(billingCount, rng); next.disabledUntil = ts + disableMs; next.disabledReason = "billing"; } else { - const cooldownMs = calculateCooldownMs(next.errorCount); + const cooldownMs = calculateCooldownMs(next.errorCount, rng); next.cooldownUntil = ts + cooldownMs; }