History

Merge branch 'main' into fix/pr-links-without-linked-project

shivam committed 2 months ago

Commit 806c2b72 parents 927b784 6ba15c044 files · +1632 −486Browse files

Unified · Split

44 files
  1. .macroscope/check-run-agents/effect-service-conventions.md +1 −0
  2. .macroscope/check-run-agents/ui-consistency.md +1 −0
  3. .vscode/settings.json +0 −1
  4. apps/desktop/package.json +1 −1
  5. apps/marketing/package.json +1 −1
  6. apps/mobile/src/features/usage/UsageLimitsSection.tsx +24 −3
  7. apps/server/package.json +1 −1
  8. apps/server/src/mcp/PreviewAutomationBroker.test.ts +43 −0
  9. apps/server/src/mcp/PreviewAutomationBroker.ts +24 −0
  10. apps/server/src/mcp/toolkits/preview/handlers.test.ts +125 −2
  11. apps/server/src/mcp/toolkits/preview/handlers.ts +106 −10
  12. apps/server/src/mcp/toolkits/preview/tools.ts +4 −2
  13. apps/web/package.json +1 −1
  14. apps/web/src/browser/browserRecording.test.ts +43 −0
  15. apps/web/src/browser/browserRecording.ts +16 −0
  16. apps/web/src/browser/browserRecordingUpload.ts +84 −0
  17. apps/web/src/components/ChatMarkdown.tsx +37 −27
  18. apps/web/src/components/ChatView.tsx +34 −18
  19. apps/web/src/components/ServerUpdateAction.test.tsx +158 −3
  20. apps/web/src/components/ServerUpdateAction.tsx +119 −53
  21. apps/web/src/components/chat/ComposerUsageLimits.tsx +28 −4
  22. apps/web/src/components/chat/ExpandedImageDialog.tsx +17 −12
  23. apps/web/src/components/chat/markdownImageGallery.ts +51 −0
  24. apps/web/src/components/chat/useAutoBalanceUpdateBanner.tsx +160 −0
  25. apps/web/src/components/preview/PreviewAutomationHosts.tsx +18 −2
  26. apps/web/src/components/preview/previewAutomationErrors.ts +9 −1
  27. apps/web/src/components/pullRequest/PullRequestMarkdown.tsx +1 −1
  28. apps/web/src/components/ui/button.tsx +1 −0
  29. infra/relay/package.json +1 −1
  30. oxlint-plugin-t3code/package.json +1 −1
  31. package.json +2 −2
  32. packages/client-runtime/package.json +1 −1
  33. packages/contracts/package.json +1 −1
  34. packages/contracts/src/previewAutomation.ts +45 −0
  35. packages/effect-acp/package.json +1 −1
  36. packages/effect-codex-app-server/package.json +1 −1
  37. packages/shared/package.json +1 −1
  38. packages/ssh/package.json +1 −1
  39. packages/tailscale/package.json +1 −1
  40. pnpm-lock.yaml +460 −303
  41. pnpm-workspace.yaml +4 −3
  42. scripts/clean-tsgo-backups.mjs +0 −24
  43. scripts/knip-schemas.ts +2 −1
  44. scripts/package.json +2 −1
.macroscope/check-run-agents/effect-service-conventions.md+1−0
@@ -14,6 +14,7 @@ exclude: · 13 unmodified lines
1414 - "**/*.test.ts"
1515 labels:
1616 - vouch:trusted
17+ - macroscope-review
1718 requires:
1819 - Check
1920 maxBudgetPerRun: 5
.macroscope/check-run-agents/ui-consistency.md+1−0
@@ -13,6 +13,7 @@ exclude: · 12 unmodified lines
1313 - "apps/web/src/**/*.test.tsx"
1414 labels:
1515 - vouch:trusted
16+ - macroscope-review
1617 requires:
1718 - Check
1819 maxBudgetPerRun: 2
.vscode/settings.json+0−1
@@ -6,7 +6,6 @@ · 5 unmodified lines
66 },
77 "oxc.unusedDisableDirectives": "warn",
88 "js/ts.tsdk.path": "node_modules/typescript/lib",
9− "typescript.native-preview.tsdk": "node_modules/@typescript/native-preview",
109 "typescript.preferences.autoImportFileExcludePatterns": [".repos/**"],
1110 "javascript.preferences.autoImportFileExcludePatterns": [".repos/**"],
1211 "files.watcherExclude": {
apps/desktop/package.json+1−1
@@ -7,7 +7,7 @@ · 6 unmodified lines
77 "scripts": {
88 "ensure:electron": "node scripts/ensure-electron-runtime.mjs",
99 "start": "node scripts/start-electron.mjs",
10− "typecheck": "tsgo --noEmit",
10+ "typecheck": "tsc --noEmit",
1111 "test": "vp test run --passWithNoTests",
1212 "smoke-test": "node scripts/smoke-test.mjs"
1313 },
apps/marketing/package.json+1−1
@@ -17,6 +17,6 @@ · 16 unmodified lines
1717 "devDependencies": {
1818 "@astrojs/check": "^0.9.7",
1919 "@vercel/config": "^0.3.0",
20− "typescript": "catalog:"
20+ "typescript": "~6.0.3"
2121 }
2222 }
apps/mobile/src/features/usage/UsageLimitsSection.tsx+24−3
@@ -97,6 +97,29 @@ function WindowRow(props: { · 96 unmodified lines
9797 );
9898 }
9999
100+function AccountInstanceLabel({ value }: { readonly value: string }) {
101+ const [revealed, setRevealed] = useState(false);
102+ if (!value.includes("@")) {
103+ return (
104+ <Text className="shrink text-xs text-foreground-tertiary" numberOfLines={1}>
105+ · {value}
106+ </Text>
107+ );
108+ }
109+ return (
110+ <Pressable
111+ className="shrink active:opacity-60"
112+ accessibilityRole="button"
113+ accessibilityLabel={revealed ? "Hide account label" : "Reveal account label"}
114+ onPress={() => setRevealed((current) => !current)}
115+ >
116+ <Text className="text-xs text-foreground-tertiary" numberOfLines={1}>
117+ · {revealed ? value : "••••••@••••••"}
118+ </Text>
119+ </Pressable>
120+ );
121+}
122+
100123 /** One account: icon, name and plan on a single line, then its windows. */
101124 export function AccountLimits(props: {
102125 readonly driver: Driver;
@@ -128,9 +151,7 @@ export function AccountLimits(props: { · 25 unmodified lines
128151 <View className="min-w-0 flex-1 flex-row items-baseline gap-2">
129152 <Text className="text-base font-t3-medium text-foreground">{props.label}</Text>
130153 {props.instanceLabel !== props.label ? (
131− <Text className="shrink text-xs text-foreground-tertiary" numberOfLines={1}>
132− · {props.instanceLabel}
133− </Text>
154+ <AccountInstanceLabel key={props.instanceLabel} value={props.instanceLabel} />
134155 ) : null}
135156 {props.detail ? (
136157 <Text className="shrink text-sm text-foreground-muted" numberOfLines={1}>
apps/server/package.json+1−1
@@ -18,7 +18,7 @@ · 17 unmodified lines
1818 "dev": "node --watch src/bin.ts",
1919 "build:bundle": "vp pack && vp pack src/service-launcher.ts --out-dir dist --no-clean",
2020 "start": "node dist/bin.mjs",
21− "typecheck": "tsgo --noEmit",
21+ "typecheck": "tsc --noEmit",
2222 "test": "vp test run"
2323 },
2424 "dependencies": {
apps/server/src/mcp/PreviewAutomationBroker.test.ts+43−0
@@ -404,6 +404,49 @@ it.effect("classifies a remote non-editable target without collapsing it to exec · 403 unmodified lines
404404 );
405405 });
406406
407+it.effect.each([
408+ "PreviewAutomationRecordingTransferError",
409+ "PreviewAutomationRecordingDesktopUpdateRequiredError",
410+ "PreviewAutomationRecordingTooLargeError",
411+ "PreviewAutomationRecordingDeadlineExpiredError",
412+] as const)("preserves recording failure %s", (tag) =>
413+ Effect.scoped(
414+ Effect.gen(function* () {
415+ const broker = yield* makeBroker;
416+ const remoteError = {
417+ _tag: tag,
418+ message: "remote recording details",
419+ detail: { reason: "untrusted-reason", threadId: "untrusted-thread" },
420+ };
421+ const requests = requestsFrom(yield* broker.connect(makeHost()));
422+ yield* Stream.runForEach(requests, (request) =>
423+ broker.respond({
424+ clientId: "client-1",
425+ connectionId: request.connectionId,
426+ requestId: request.requestId,
427+ ok: false,
428+ error: remoteError,
429+ }),
430+ ).pipe(Effect.forkScoped);
431+ yield* Effect.yieldNow;
432+ const error = yield* broker
433+ .invoke<void>({
434+ scope,
435+ operation: "recordingStop",
436+ input: {},
437+ })
438+ .pipe(Effect.flip);
439+ expect(error).toMatchObject({
440+ _tag: tag,
441+ threadId: scope.threadId,
442+ });
443+ expect(error.cause).toBe(remoteError);
444+ expect(error.message).toContain("remains on the desktop");
445+ expect(error.message).not.toContain("remote recording details");
446+ }),
447+ ),
448+);
449+
407450 it.effect("distinguishes malformed remote failures", () =>
408451 Effect.scoped(
409452 Effect.gen(function* () {
apps/server/src/mcp/PreviewAutomationBroker.ts+24−0
@@ -7,6 +7,10 @@ import { · 6 unmodified lines
77 PreviewAutomationMalformedResponseError,
88 PreviewAutomationNoAvailableHostError,
99 PreviewAutomationRemoteUnavailableError,
10+ PreviewAutomationRecordingTransferError,
11+ PreviewAutomationRecordingDesktopUpdateRequiredError,
12+ PreviewAutomationRecordingTooLargeError,
13+ PreviewAutomationRecordingDeadlineExpiredError,
1014 PreviewAutomationRequestQueueClosedError,
1115 PreviewAutomationResultTooLargeError,
1216 PreviewAutomationTabNotFoundError,
@@ -194,6 +198,26 @@ const classifyResponseError = ( · 181 unmodified lines
194198 cause: error,
195199 };
196200 switch (error._tag) {
201+ case "PreviewAutomationRecordingDesktopUpdateRequiredError":
202+ return new PreviewAutomationRecordingDesktopUpdateRequiredError({
203+ threadId: context.threadId,
204+ cause: error,
205+ });
206+ case "PreviewAutomationRecordingTooLargeError":
207+ return new PreviewAutomationRecordingTooLargeError({
208+ threadId: context.threadId,
209+ cause: error,
210+ });
211+ case "PreviewAutomationRecordingDeadlineExpiredError":
212+ return new PreviewAutomationRecordingDeadlineExpiredError({
213+ threadId: context.threadId,
214+ cause: error,
215+ });
216+ case "PreviewAutomationRecordingTransferError":
217+ return new PreviewAutomationRecordingTransferError({
218+ threadId: context.threadId,
219+ cause: error,
220+ });
197221 case "PreviewAutomationNoAvailableHostError":
198222 return new PreviewAutomationNoAvailableHostError({
199223 ...context,
apps/server/src/mcp/toolkits/preview/handlers.test.ts+125−2
@@ -1,6 +1,17 @@
1−import { describe, expect, it } from "vite-plus/test";
1+import { describe, expect, it } from "@effect/vitest";
2+import * as NodeServices from "@effect/platform-node/NodeServices";
3+import { ThreadId } from "@t3tools/contracts";
4+import * as Effect from "effect/Effect";
5+import * as FileSystem from "effect/FileSystem";
6+import * as Layer from "effect/Layer";
7+import * as Path from "effect/Path";
28
3−import { normalizePreviewOpenInput } from "./handlers.ts";
9+import {
10+ createPendingAttachmentId,
11+ parseThreadSegmentFromAttachmentId,
12+} from "../../../attachmentStore.ts";
13+import * as ServerConfig from "../../../config.ts";
14+import { claimPreviewRecording, normalizePreviewOpenInput } from "./handlers.ts";
415
516 describe("normalizePreviewOpenInput", () => {
617 it("leaves an unstated visibility for the client preference to decide", () => {
@@ -30,3 +41,115 @@ describe("normalizePreviewOpenInput", () => { · 23 unmodified lines
3041 });
3142 });
3243 });
44+
45+describe("claimPreviewRecording", () => {
46+ it.effect("overlapping and repeated claims return the same retained recording", () =>
47+ Effect.gen(function* () {
48+ const config = yield* ServerConfig.ServerConfig;
49+ const fileSystem = yield* FileSystem.FileSystem;
50+ const path = yield* Path.Path;
51+ const uploadedAttachmentId = createPendingAttachmentId(".webm");
52+ const pendingPath = path.join(config.attachmentsDir, `${uploadedAttachmentId}.webm`);
53+ yield* fileSystem.makeDirectory(config.attachmentsDir, { recursive: true });
54+ yield* fileSystem.writeFileString(pendingPath, "video!");
55+ const response = {
56+ id: "desktop-recording",
57+ tabId: "tab-1",
58+ path: "/desktop/recording.webm",
59+ mimeType: "video/webm",
60+ sizeBytes: 6,
61+ createdAt: "2026-09-07T00:00:00.000Z",
62+ uploadedAttachmentId,
63+ };
64+ const claim = claimPreviewRecording(ThreadId.make("thread-1"), response);
65+ const [first, second] = yield* Effect.all([claim, claim], { concurrency: "unbounded" });
66+ expect(first).toEqual(second);
67+ expect(yield* claim).toEqual(first);
68+ expect(yield* fileSystem.readFileString(first.path)).toBe("video!");
69+ expect(yield* fileSystem.exists(pendingPath)).toBe(false);
70+ const wrongThread = yield* claimPreviewRecording(ThreadId.make("thread-2"), response).pipe(
71+ Effect.result,
72+ );
73+ expect(wrongThread._tag).toBe("Failure");
74+ const wrongPath = yield* claimPreviewRecording(ThreadId.make("thread-1"), {
75+ ...response,
76+ uploadedAttachmentId: `../${uploadedAttachmentId}`,
77+ }).pipe(Effect.result);
78+ expect(wrongPath._tag).toBe("Failure");
79+ }).pipe(
80+ Effect.provide(
81+ ServerConfig.layerTest(process.cwd(), { prefix: "t3-preview-recording-" }).pipe(
82+ Layer.provideMerge(NodeServices.layer),
83+ ),
84+ ),
85+ ),
86+ );
87+
88+ it.effect.each([6, 5])(
89+ "claims only a complete uploaded recording (reported bytes: %s)",
90+ (sizeBytes) =>
91+ Effect.gen(function* () {
92+ const config = yield* ServerConfig.ServerConfig;
93+ const fileSystem = yield* FileSystem.FileSystem;
94+ const path = yield* Path.Path;
95+ const uploadedAttachmentId = createPendingAttachmentId(".webm");
96+ const pendingPath = path.join(config.attachmentsDir, `${uploadedAttachmentId}.webm`);
97+ yield* fileSystem.makeDirectory(config.attachmentsDir, { recursive: true });
98+ yield* fileSystem.writeFileString(pendingPath, "video!");
99+ const response = {
100+ id: "desktop-recording",
101+ tabId: "tab-1",
102+ path: "/desktop/recording.webm",
103+ mimeType: "video/webm",
104+ sizeBytes,
105+ createdAt: "2026-09-07T00:00:00.000Z",
106+ uploadedAttachmentId,
107+ };
108+ const result = yield* claimPreviewRecording(ThreadId.make("thread-1"), response).pipe(
109+ Effect.result,
110+ );
111+ if (sizeBytes === 6) {
112+ expect(result._tag).toBe("Success");
113+ if (result._tag !== "Success") return;
114+ expect(result.success.path).not.toBe(response.path);
115+ expect(parseThreadSegmentFromAttachmentId(result.success.id)).toBe("thread-1");
116+ expect(yield* fileSystem.readFileString(result.success.path)).toBe("video!");
117+ expect(yield* fileSystem.exists(pendingPath)).toBe(false);
118+ } else {
119+ expect(result._tag).toBe("Failure");
120+ if (result._tag !== "Failure") return;
121+ expect(result.failure._tag).toBe("PreviewAutomationRecordingTransferError");
122+ expect(yield* fileSystem.exists(pendingPath)).toBe(true);
123+ }
124+ }).pipe(
125+ Effect.provide(
126+ ServerConfig.layerTest(process.cwd(), { prefix: "t3-preview-recording-" }).pipe(
127+ Layer.provideMerge(NodeServices.layer),
128+ ),
129+ ),
130+ ),
131+ );
132+
133+ it.effect("reports an older desktop without returning its inaccessible path", () =>
134+ Effect.gen(function* () {
135+ const result = yield* claimPreviewRecording(ThreadId.make("thread-1"), {
136+ id: "desktop-recording",
137+ tabId: "tab-1",
138+ path: "/desktop/recording.webm",
139+ mimeType: "video/webm",
140+ sizeBytes: 6,
141+ createdAt: "2026-09-07T00:00:00.000Z",
142+ }).pipe(Effect.result);
143+ expect(result._tag).toBe("Failure");
144+ if (result._tag !== "Failure") return;
145+ expect(result.failure._tag).toBe("PreviewAutomationRecordingDesktopUpdateRequiredError");
146+ expect(result.failure.message).toContain("Update the desktop app");
147+ }).pipe(
148+ Effect.provide(
149+ ServerConfig.layerTest(process.cwd(), { prefix: "t3-preview-recording-" }).pipe(
150+ Layer.provideMerge(NodeServices.layer),
151+ ),
152+ ),
153+ ),
154+ );
155+});
apps/server/src/mcp/toolkits/preview/handlers.ts+106−10
@@ -1,16 +1,31 @@
11 import * as Effect from "effect/Effect";
2−import type {
3− PreviewAutomationOperation,
4− PreviewAutomationOpenInput,
2+import * as FileSystem from "effect/FileSystem";
3+import * as Schema from "effect/Schema";
4+import {
5+ PROVIDER_SEND_TURN_MAX_FILE_BYTES,
6+ PREVIEW_RECORDING_STOP_TIMEOUT_MS,
7+ PreviewAutomationRecordingTransferError,
8+ PreviewAutomationRecordingDesktopUpdateRequiredError,
59 PreviewAutomationRecordingArtifact,
6− PreviewAutomationRecordingStatus,
7− PreviewAutomationResizeResult,
8− PreviewAutomationSetColorSchemeResult,
9− PreviewAutomationSnapshot,
10− PreviewAutomationStatus,
11− PreviewTabId,
10+ type ThreadId,
11+ type PreviewAutomationOperation,
12+ type PreviewAutomationOpenInput,
13+ type PreviewAutomationRecordingStatus,
14+ type PreviewAutomationResizeResult,
15+ type PreviewAutomationSetColorSchemeResult,
16+ type PreviewAutomationSnapshot,
17+ type PreviewAutomationStatus,
18+ type PreviewTabId,
1219 } from "@t3tools/contracts";
1320
21+import {
22+ parseAttachmentUuid,
23+ parseAttachmentFileExtension,
24+ PENDING_ATTACHMENT_THREAD_SEGMENT,
25+ toSafeThreadAttachmentSegment,
26+} from "../../../attachmentStore.ts";
27+import { resolveAttachmentRelativePath } from "../../../attachmentPaths.ts";
28+import * as ServerConfig from "../../../config.ts";
1429 import * as McpInvocationContext from "../../McpInvocationContext.ts";
1530 import * as PreviewAutomationBroker from "../../PreviewAutomationBroker.ts";
1631 import { PreviewSnapshotToolkit, PreviewStandardToolkit, PreviewToolkit } from "./tools.ts";
@@ -67,6 +82,79 @@ const invokeTargeted = <A>( · 50 unmodified lines
6782 return invoke<A>(operation, operationInput, timeoutMs, tabId);
6883 };
6984
85+const UploadedRecordingArtifact = Schema.Struct({
86+ ...PreviewAutomationRecordingArtifact.fields,
87+ uploadedAttachmentId: Schema.optional(Schema.String),
88+});
89+const decodeUploadedRecordingArtifact = Schema.decodeUnknownEffect(UploadedRecordingArtifact);
90+
91+export const claimPreviewRecording = Effect.fn("PreviewToolkit.claimRecording")(function* (
92+ threadId: ThreadId,
93+ response: unknown,
94+) {
95+ const artifact = yield* decodeUploadedRecordingArtifact(response).pipe(
96+ Effect.mapError(
97+ (cause) =>
98+ new PreviewAutomationRecordingTransferError({
99+ threadId,
100+ cause,
101+ }),
102+ ),
103+ );
104+ if (!artifact.uploadedAttachmentId) {
105+ return yield* new PreviewAutomationRecordingDesktopUpdateRequiredError({ threadId });
106+ }
107+ const config = yield* ServerConfig.ServerConfig;
108+ const uuid = parseAttachmentUuid(artifact.uploadedAttachmentId);
109+ const extension = parseAttachmentFileExtension(artifact.uploadedAttachmentId);
110+ const threadSegment = toSafeThreadAttachmentSegment(threadId);
111+ const pendingId = `${PENDING_ATTACHMENT_THREAD_SEGMENT}-${uuid}-${extension}`;
112+ if (!uuid || !extension || !threadSegment || artifact.uploadedAttachmentId !== pendingId) {
113+ return yield* new PreviewAutomationRecordingTransferError({
114+ threadId,
115+ });
116+ }
117+ // The same completed upload can be returned to overlapping stop requests.
118+ const finalId = `${threadSegment}-${uuid}-${extension}`;
119+ const currentPath = resolveAttachmentRelativePath({
120+ attachmentsDir: config.attachmentsDir,
121+ relativePath: `${pendingId}.${extension}`,
122+ });
123+ const finalPath = resolveAttachmentRelativePath({
124+ attachmentsDir: config.attachmentsDir,
125+ relativePath: `${finalId}.${extension}`,
126+ });
127+ if (!currentPath || !finalPath) {
128+ return yield* new PreviewAutomationRecordingTransferError({ threadId });
129+ }
130+ const fileSystem = yield* FileSystem.FileSystem;
131+ const validateFile = (filePath: string) =>
132+ fileSystem.stat(filePath).pipe(
133+ Effect.filterOrFail(
134+ (stat) =>
135+ stat.type === "File" &&
136+ Number(stat.size) === artifact.sizeBytes &&
137+ artifact.sizeBytes > 0 &&
138+ artifact.sizeBytes <= PROVIDER_SEND_TURN_MAX_FILE_BYTES,
139+ () => new PreviewAutomationRecordingTransferError({ threadId }),
140+ ),
141+ );
142+ yield* Effect.gen(function* () {
143+ yield* validateFile(currentPath);
144+ yield* fileSystem.rename(currentPath, finalPath);
145+ }).pipe(
146+ // Another stop may already have claimed this exact upload for this thread.
147+ Effect.catch((cause) =>
148+ cause._tag !== "PreviewAutomationRecordingTransferError" && cause.reason._tag === "NotFound"
149+ ? validateFile(finalPath)
150+ : Effect.fail(cause),
151+ ),
152+ Effect.mapError((cause) => new PreviewAutomationRecordingTransferError({ threadId, cause })),
153+ );
154+ const { uploadedAttachmentId: _uploadedAttachmentId, ...recording } = artifact;
155+ return { ...recording, id: finalId, path: finalPath };
156+});
157+
70158 const handlers = {
71159 preview_status: (input) => invokeTargeted<PreviewAutomationStatus>("status", input ?? {}),
72160 preview_open: (input) =>
@@ -94,7 +182,15 @@ const handlers = { · 21 unmodified lines
94182 preview_recording_start: (input) =>
95183 invokeTargeted<PreviewAutomationRecordingStatus>("recordingStart", input ?? {}),
96184 preview_recording_stop: (input) =>
97− invokeTargeted<PreviewAutomationRecordingArtifact>("recordingStop", input ?? {}),
185+ Effect.gen(function* () {
186+ const scope = yield* McpInvocationContext.requireMcpCapability("preview");
187+ const response = yield* invokeTargeted<unknown>(
188+ "recordingStop",
189+ { ...input, transferToEnvironment: true },
190+ PREVIEW_RECORDING_STOP_TIMEOUT_MS,
191+ );
192+ return yield* claimPreviewRecording(scope.threadId, response);
193+ }),
98194 } satisfies Parameters<typeof PreviewToolkit.toLayer>[0];
99195
100196 const { preview_snapshot, ...standardHandlers } = handlers;
apps/server/src/mcp/toolkits/preview/tools.ts+4−2
@@ -19,10 +19,12 @@ import { · 18 unmodified lines
1919 PreviewAutomationWaitForInput,
2020 } from "@t3tools/contracts";
2121 import * as Schema from "effect/Schema";
22+import * as FileSystem from "effect/FileSystem";
2223 import { Tool, Toolkit } from "effect/unstable/ai";
2324
2425 import * as McpInvocationContext from "../../McpInvocationContext.ts";
2526 import * as PreviewAutomationBroker from "../../PreviewAutomationBroker.ts";
27+import * as ServerConfig from "../../../config.ts";
2628
2729 const dependencies = [
2830 McpInvocationContext.McpInvocationContext,
@@ -207,11 +209,11 @@ export const PreviewRecordingStartTool = safeBrowserTool( · 178 unmodified lines
207209 export const PreviewRecordingStopTool = safeBrowserTool(
208210 Tool.make("preview_recording_stop", {
209211 description:
210− "Stop recording the collaborative browser tab selected by tabId, or this agent session's current tab when omitted, and save it as a local evidence artifact.",
212+ "Stop recording the collaborative browser tab selected by tabId, or this agent session's current tab when omitted, and transfer the compressed recording once (up to 50 MiB) to an evidence file readable in this agent's environment. Returns its environment-local path after transfer succeeds.",
211213 parameters: PreviewAutomationTabTargetInput,
212214 success: PreviewAutomationRecordingArtifact,
213215 failure: PreviewAutomationError,
214− dependencies,
216+ dependencies: [...dependencies, FileSystem.FileSystem, ServerConfig.ServerConfig],
215217 }).annotate(Tool.Title, "Stop browser recording"),
216218 );
217219
apps/web/package.json+1−1
@@ -8,7 +8,7 @@ · 7 unmodified lines
88 "dev": "vp dev",
99 "build": "vp build",
1010 "preview": "vp preview",
11− "typecheck": "tsgo --noEmit",
11+ "typecheck": "tsc --noEmit",
1212 "test": "vp test run --passWithNoTests --project unit"
1313 },
1414 "dependencies": {
apps/web/src/browser/browserRecording.test.ts+43−0
@@ -78,6 +78,7 @@ import { · 77 unmodified lines
7878 readActiveBrowserRecordingTargets,
7979 startBrowserRecording,
8080 stopBrowserRecording,
81+ stopBrowserRecordingForUpload,
8182 } from "./browserRecording";
8283 import { useBrowserSurfaceStore } from "./browserSurfaceStore";
8384 import { previewRuntimeTabId } from "./previewRuntimeTabId";
@@ -180,6 +181,48 @@ describe("browser recording", () => { · 96 unmodified lines
180181 await stopBrowserRecording("automation-recording-tab");
181182 });
182183
184+ it("saves locally and releases capture before transferring the encoded recording once", async () => {
185+ const stopTrack = vi.fn();
186+ getDisplayMedia.mockResolvedValue({
187+ getVideoTracks: () => [],
188+ getTracks: () => [{ stop: stopTrack }],
189+ });
190+ await startBrowserRecording("transfer-tab");
191+ let finishUpload!: () => void;
192+ const uploaded = new Promise<void>((resolve) => {
193+ finishUpload = resolve;
194+ });
195+ const transfer = vi.fn(async (artifact, blob: Blob) => {
196+ expect(save).toHaveBeenCalledOnce();
197+ expect(stopTrack).toHaveBeenCalled();
198+ expect(artifact.path).toBe("/tmp/recording-test.webm");
199+ expect(blob.type).toBe("video/webm;codecs=vp9");
200+ await uploaded;
201+ return "uploaded-recording";
202+ });
203+ const localStop = stopBrowserRecording("transfer-tab");
204+ const firstStop = stopBrowserRecordingForUpload("transfer-tab", transfer);
205+ const secondStop = stopBrowserRecordingForUpload("transfer-tab", transfer);
206+ finishUpload();
207+ expect(await firstStop).toEqual(await secondStop);
208+ expect((await firstStop)?.uploadedAttachmentId).toBe("uploaded-recording");
209+ expect((await localStop)?.path).toBe("/tmp/recording-test.webm");
210+ expect(transfer).toHaveBeenCalledOnce();
211+ });
212+
213+ it("keeps the saved desktop file and releases the recording when transfer fails", async () => {
214+ await startBrowserRecording("failed-transfer-tab");
215+ await expect(
216+ stopBrowserRecordingForUpload("failed-transfer-tab", async () => {
217+ throw new Error("Connection interrupted");
218+ }),
219+ ).rejects.toThrow("Connection interrupted");
220+ expect(save).toHaveBeenCalledOnce();
221+ expect(readActiveBrowserRecordingTabIds().has("failed-transfer-tab")).toBe(false);
222+ await startBrowserRecording("failed-transfer-tab");
223+ await stopBrowserRecording("failed-transfer-tab");
224+ });
225+
183226 it("paints and holds a hidden browser surface for the recording lifetime", async () => {
184227 startScreencast.mockImplementationOnce(async (tabId: string) => {
185228 expect(animationFrameCount).toBe(2);
apps/web/src/browser/browserRecording.ts+16−0
@@ -123,6 +123,8 @@ interface ActiveRecording { · 122 unmodified lines
123123 releaseSurfaceActivity: (() => void) | null;
124124 stream: MediaStream | null;
125125 recorder: MediaRecorder | null;
126+ savedBlob?: Blob;
127+ uploadPromise?: Promise<string>;
126128 lifecycle: BrowserRecordingLifecycle;
127129 }
128130
@@ -708,6 +710,7 @@ const finalizeBrowserRecording = async ( · 579 unmodified lines
708710 mimeType,
709711 new Uint8Array(await blob.arrayBuffer()),
710712 );
713+ recording.savedBlob = blob;
711714 result = { _tag: "Success", artifact };
712715 } catch (cause) {
713716 throw new BrowserRecordingOperationError({
@@ -814,3 +817,16 @@ export function stopBrowserRecording( · 100 unmodified lines
814817 recording.lifecycle = { phase: "stopping", stopPromise };
815818 return stopPromise;
816819 }
820+
821+/** Joins local stops and shares one upload among concurrent automation requests. */
822+export async function stopBrowserRecordingForUpload(
823+ tabId: string,
824+ upload: (artifact: DesktopPreviewRecordingArtifact, blob: Blob) => Promise<string>,
825+): Promise<(DesktopPreviewRecordingArtifact & { uploadedAttachmentId: string }) | null> {
826+ const recording = activeRecordings.get(tabId);
827+ if (!recording) return null;
828+ const artifact = await stopBrowserRecording(tabId);
829+ if (!artifact || !recording.savedBlob) return null;
830+ recording.uploadPromise ??= upload(artifact, recording.savedBlob);
831+ return { ...artifact, uploadedAttachmentId: await recording.uploadPromise };
832+}
apps/web/src/browser/browserRecordingUpload.ts+84−0
@@ -0,0 +1,84 @@
1+import {
2+ PROVIDER_SEND_TURN_MAX_FILE_BYTES,
3+ PreviewAutomationRecordingTransferError,
4+ PreviewAutomationRecordingTooLargeError,
5+ PreviewAutomationRecordingDeadlineExpiredError,
6+ type DesktopPreviewRecordingArtifact,
7+ type ScopedThreadRef,
8+} from "@t3tools/contracts";
9+import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets";
10+import {
11+ deletePendingAttachmentUpload,
12+ runAttachmentUploadCycle,
13+} from "@t3tools/client-runtime/state/attachments";
14+
15+import { appAtomRegistry } from "~/rpc/atomRegistry";
16+import { attachmentEnvironment } from "~/state/attachments";
17+import { readPreparedConnection } from "~/state/session";
18+
19+/** Sends the finished encoded file once; capture frames never cross the environment connection. */
20+export async function uploadBrowserRecording(
21+ { environmentId, threadId }: ScopedThreadRef,
22+ artifact: DesktopPreviewRecordingArtifact,
23+ blob: Blob,
24+ deadlineMs: number,
25+): Promise<string> {
26+ if (blob.size > PROVIDER_SEND_TURN_MAX_FILE_BYTES) {
27+ throw new PreviewAutomationRecordingTooLargeError({ threadId });
28+ }
29+ const result = await runAttachmentUploadCycle({
30+ registry: appAtomRegistry,
31+ createUploadUrl: attachmentEnvironment.createUploadUrl,
32+ remove: attachmentEnvironment.remove,
33+ environmentId,
34+ upload: {
35+ type: "file",
36+ name: artifact.path.split(/[\\/]/).at(-1) ?? artifact.id,
37+ mimeType: artifact.mimeType,
38+ sizeBytes: blob.size,
39+ },
40+ resolveUploadUrl: (relativeUrl) => {
41+ const connection = readPreparedConnection(environmentId);
42+ return connection ? resolveAssetUrl(connection.httpBaseUrl, relativeUrl) : null;
43+ },
44+ transport: (url) => {
45+ const controller = new AbortController();
46+ // Encoding, saving and minting consume the same request budget. Leave time to reply.
47+ const remainingMs = deadlineMs - Date.now() - 1_000;
48+ return {
49+ abort: () => controller.abort(),
50+ done:
51+ remainingMs <= 0
52+ ? Promise.reject(new Error("Recording transfer deadline expired."))
53+ : fetch(url, {
54+ method: "POST",
55+ headers: { "Content-Type": artifact.mimeType },
56+ body: blob,
57+ signal: AbortSignal.any([controller.signal, AbortSignal.timeout(remainingMs)]),
58+ }).then((response) => {
59+ if (!response.ok)
60+ throw new Error(`Recording upload rejected (${response.status}).`);
61+ }),
62+ };
63+ },
64+ });
65+ if (result.status !== "uploaded") {
66+ if (result.attachmentId) {
67+ deletePendingAttachmentUpload({
68+ registry: appAtomRegistry,
69+ remove: attachmentEnvironment.remove,
70+ environmentId,
71+ attachmentId: result.attachmentId,
72+ });
73+ }
74+ const cause = result.status === "failed" ? result.error : undefined;
75+ if (Date.now() >= deadlineMs - 1_000) {
76+ throw new PreviewAutomationRecordingDeadlineExpiredError({ threadId, cause });
77+ }
78+ throw new PreviewAutomationRecordingTransferError({
79+ threadId,
80+ cause,
81+ });
82+ }
83+ return result.attachmentId;
84+}
apps/web/src/components/ChatMarkdown.tsx+37−27
@@ -89,6 +89,7 @@ import { · 88 unmodified lines
8989 type ExpandedImagePreview,
9090 } from "./chat/ExpandedImagePreview";
9191 import { ExpandedImageDialog } from "./chat/ExpandedImageDialog";
92+import { markdownImageGallery, markdownImageItems } from "./chat/markdownImageGallery";
9293 import { MediaVideoPlayer } from "./media/MediaVideoPlayer";
9394 import { MediaActions, type MediaActionSource } from "./media/MediaActions";
9495 import { resolveProtocolRelativeMediaUrl } from "./media/mediaContent";
@@ -1284,10 +1285,7 @@ const MarkdownLinkContext = React.createContext(false); · 1189 unmodified lines
12841285
12851286 function expandableMarkdownImageProps(
12861287 onImageExpand: ((preview: ExpandedImagePreview) => void) | undefined,
1287− src: string,
12881288 alt: string,
1289− originalUrl?: string,
1290− actionsSource?: MediaActionSource,
12911289 ) {
12921290 if (!onImageExpand) return {};
12931291 const previewName = alt.trim() || "image";
@@ -1295,17 +1293,8 @@ function expandableMarkdownImageProps( · 1 unmodified line
12951293 if (event.currentTarget.closest("a")) return;
12961294 event.preventDefault();
12971295 event.stopPropagation();
1298− onImageExpand({
1299− images: [
1300− {
1301− src,
1302− name: previewName,
1303− ...(originalUrl ? { originalUrl } : {}),
1304− ...(actionsSource ? { actionsSource } : {}),
1305− },
1306− ],
1307− index: 0,
1308− });
1296+ const item = markdownImageItems.get(event.currentTarget);
1297+ if (item) onImageExpand(markdownImageGallery(event.currentTarget, item));
13091298 };
13101299 return {
13111300 role: "button" as const,
@@ -1399,9 +1388,19 @@ function ChatMarkdownImage(props: { · 87 unmodified lines
13991388 // A failure forgets the decoded image so the next URL loads behind the slot.
14001389 const settled = src !== null && !failed && (!props.standalone || loadedSrc !== null);
14011390 // Cached images are complete before `onLoad` can fire.
1402− const markLoadedIfComplete = useCallback((image: HTMLImageElement | null) => {
1403− if (image?.complete && image.naturalWidth > 0) setLoadedSrc(image.currentSrc || image.src);
1404− }, []);
1391+ const markLoadedIfComplete = useCallback(
1392+ (image: HTMLImageElement | null) => {
1393+ if (!image) return;
1394+ if (image.complete && image.naturalWidth > 0) setLoadedSrc(image.currentSrc || image.src);
1395+ markdownImageItems.set(image, {
1396+ src,
1397+ name: props.alt.trim() || "image",
1398+ actionsSource: props.actionsSource,
1399+ ...(props.originalUrl ? { originalUrl: props.originalUrl } : {}),
1400+ });
1401+ },
1402+ [props.actionsSource, props.alt, props.originalUrl, src],
1403+ );
14051404 const imageEvents = (loadingSrc: string) => ({
14061405 onLoad: () => {
14071406 setLoadedSrc(loadingSrc);
@@ -1430,13 +1429,7 @@ function ChatMarkdownImage(props: { · 22 unmodified lines
14301429 props.onImageExpand && "cursor-zoom-in",
14311430 )}
14321431 style={props.style}
1433− {...expandableMarkdownImageProps(
1434− props.onImageExpand,
1435− src,
1436− props.alt,
1437− props.originalUrl,
1438− props.actionsSource,
1439− )}
1432+ {...expandableMarkdownImageProps(props.onImageExpand, props.alt)}
14401433 {...imageEvents(src)}
14411434 />
14421435 </MediaActions>
@@ -2174,6 +2167,7 @@ function useChatMarkdownState({ · 731 unmodified lines
21742167 }: ChatMarkdownProps) {
21752168 const { resolvedTheme } = useTheme();
21762169 const [localMediaPreview, setLocalMediaPreview] = useState<ExpandedImagePreview | null>(null);
2170+ const markdownRef = useRef<HTMLDivElement>(null);
21772171 const expandMedia = onImageExpand ?? setLocalMediaPreview;
21782172 const mediaRequestId = useRef(0);
21792173 useEffect(() => {
@@ -2204,7 +2198,7 @@ function useChatMarkdownState({ · 24 unmodified lines
22042198 );
22052199 const preparedConnection = usePreparedConnection(environmentId);
22062200 const openMarkdownMedia = useCallback(
2207− (source: string, resolvedFilePath?: string) => {
2201+ (source: string, resolvedFilePath?: string, clickedImage?: HTMLImageElement | null) => {
22082202 const requestId = ++mediaRequestId.current;
22092203 void resolveMarkdownMediaPreview({
22102204 source,
@@ -2219,7 +2213,14 @@ function useChatMarkdownState({ · 8 unmodified lines
22192213 : undefined,
22202214 }).then(
22212215 (preview) => {
2222− if (preview && mediaRequestId.current === requestId) expandMedia(preview);
2216+ if (preview && mediaRequestId.current === requestId) {
2217+ const selected = preview.images[preview.index];
2218+ expandMedia(
2219+ selected && selected.type !== "video" && markdownRef.current
2220+ ? markdownImageGallery(clickedImage ?? markdownRef.current, selected)
2221+ : preview,
2222+ );
2223+ }
22232224 },
22242225 (error: unknown) => {
22252226 if (mediaRequestId.current !== requestId) return;
@@ -2626,6 +2627,7 @@ function useChatMarkdownState({ · 400 unmodified lines
26262627 return {
26272628 componentState,
26282629 handleCopy,
2630+ markdownRef,
26292631 markdownUrlTransform,
26302632 localMediaPreview,
26312633 setLocalMediaPreview,
@@ -2812,7 +2814,13 @@ const CHAT_MARKDOWN_COMPONENTS = { · 180 unmodified lines
28122814 ) {
28132815 event.preventDefault();
28142816 event.stopPropagation();
2815− openMarkdownMedia(href);
2817+ openMarkdownMedia(
2818+ href,
2819+ undefined,
2820+ event.target instanceof HTMLImageElement
2821+ ? event.target
2822+ : event.currentTarget.querySelector("img"),
2823+ );
28162824 return;
28172825 }
28182826 // A link to a change request in a workspace project opens beside the
@@ -3133,6 +3141,7 @@ function ChatMarkdown({ · 314 unmodified lines
31333141 const {
31343142 componentState,
31353143 handleCopy,
3144+ markdownRef,
31363145 markdownUrlTransform,
31373146 localMediaPreview,
31383147 setLocalMediaPreview,
@@ -3150,6 +3159,7 @@ function ChatMarkdown({ · 11 unmodified lines
31503159 // complete source token instead of dropping it from the rendered message.
31513160 return (
31523161 <div
3162+ ref={markdownRef}
31533163 className={cn(
31543164 "chat-markdown w-full min-w-0 text-sm leading-relaxed text-foreground/80 [overflow-wrap:anywhere] [word-break:break-word]",
31553165 className,
apps/web/src/components/ChatView.tsx+34−18
@@ -440,6 +440,7 @@ import { · 439 unmodified lines
440440 } from "./ui/alert-dialog";
441441 import { Tooltip, TooltipPopup, TooltipTrigger } from "./ui/tooltip";
442442 import { ServerUpdateAction } from "./ServerUpdateAction";
443+import { useAutoBalanceUpdateBanner } from "./chat/useAutoBalanceUpdateBanner";
443444 import {
444445 ComposerServerUpdateIcon,
445446 ComposerServerUpdateStatus,
@@ -2317,6 +2318,35 @@ export default function ChatView(props: ChatViewProps) { · 1871 unmodified lines
23172318 advertisedFileAttachmentBytes === null
23182319 ? null
23192320 : clampFileAttachmentUploadBytes(advertisedFileAttachmentBytes);
2321+ const envLocked = Boolean(
2322+ activeThread &&
2323+ (activeThread.messages.length > 0 ||
2324+ (activeThread.session !== null && activeThread.session.status !== "stopped")),
2325+ );
2326+
2327+ const loadBalancingSettings = useClientSettings();
2328+ const automaticEnvironment = Boolean(
2329+ clientSettingsHydrated &&
2330+ draftId &&
2331+ !envLocked &&
2332+ hasMultipleEnvironments &&
2333+ loadBalancingSettings.loadBalancingEnabled &&
2334+ draftThread?.environmentSelection !== "manual" &&
2335+ (!composerHasAttachments || Boolean(draftThread?.loadBalancedEnvironmentId)) &&
2336+ (!draftThread?.branch || draftThread.environmentSelection === "auto") &&
2337+ !draftThread?.worktreePath,
2338+ );
2339+ const autoUpdateEnvironments = useMemo(
2340+ () =>
2341+ automaticEnvironment
2342+ ? logicalProjectEnvironments.flatMap(({ environmentId }) => {
2343+ const environment = environmentById.get(environmentId);
2344+ return environment ? [environment] : [];
2345+ })
2346+ : [],
2347+ [automaticEnvironment, logicalProjectEnvironments, environmentById],
2348+ );
2349+ const autoBalanceUpdateBanner = useAutoBalanceUpdateBanner(autoUpdateEnvironments);
23202350 const versionMismatch = resolveServerConfigVersionMismatch(serverConfig);
23212351 const versionMismatchDismissKey =
23222352 versionMismatch && activeThread
@@ -2420,6 +2450,7 @@ export default function ChatView(props: ChatViewProps) { · 97 unmodified lines
24202450 }
24212451 }
24222452 if (
2453+ !automaticEnvironment &&
24232454 serverUpdateEnvironmentId &&
24242455 !reconnectingThroughVersionSkew &&
24252456 (serverUpdateState.status === "idle"
@@ -2498,8 +2529,11 @@ export default function ChatView(props: ChatViewProps) { · 72 unmodified lines
24982529 }),
24992530 });
25002531 }
2532+ if (autoBalanceUpdateBanner) items.push(autoBalanceUpdateBanner);
25012533 return items;
25022534 }, [
2535+ automaticEnvironment,
2536+ autoBalanceUpdateBanner,
25032537 activeEnvironmentUnavailableState,
25042538 reconnectWarningGraceElapsed,
25052539 handleReconnectActiveEnvironment,
@@ -3233,24 +3267,6 @@ export default function ChatView(props: ChatViewProps) { · 727 unmodified lines
32333267 }
32343268 }, [activeThreadRef, diffOpen, isServerThread, onDiffPanelOpen]);
32353269
3236− const envLocked = Boolean(
3237− activeThread &&
3238− (activeThread.messages.length > 0 ||
3239− (activeThread.session !== null && activeThread.session.status !== "stopped")),
3240− );
3241−
3242− const loadBalancingSettings = useClientSettings();
3243− const automaticEnvironment = Boolean(
3244− clientSettingsHydrated &&
3245− draftId &&
3246− !envLocked &&
3247− hasMultipleEnvironments &&
3248− loadBalancingSettings.loadBalancingEnabled &&
3249− draftThread?.environmentSelection !== "manual" &&
3250− (!composerHasAttachments || Boolean(draftThread?.loadBalancedEnvironmentId)) &&
3251− (!draftThread?.branch || draftThread.environmentSelection === "auto") &&
3252− !draftThread?.worktreePath,
3253− );
32543270 const needsLoadBalancing = automaticEnvironment && !draftThread?.loadBalancedEnvironmentId;
32553271 const loadBalancingCandidates = useMemo(
32563272 () =>
apps/web/src/components/ServerUpdateAction.test.tsx+158−3
@@ -1,9 +1,10 @@
1−import type { ReactElement } from "react";
1+import { act, type ReactElement } from "react";
2+import { create, type ReactTestRenderer } from "react-test-renderer";
23 import { renderToStaticMarkup } from "react-dom/server";
34 import type { EnvironmentId } from "@t3tools/contracts";
45 import * as Cause from "effect/Cause";
56 import { AsyncResult } from "effect/unstable/reactivity";
6−import { beforeEach, describe, expect, it, vi } from "vite-plus/test";
7+import { afterEach, beforeEach, describe, expect, it, vi } from "vite-plus/test";
78
89 const testState = vi.hoisted(() => ({
910 updateServer: vi.fn(),
@@ -30,7 +31,18 @@ vi.mock("./ui/toast", () => ({ · 20 unmodified lines
3031 toastManager: { add: testState.toast },
3132 }));
3233
33−import { ServerUpdateAction, ServerUpdateProgress } from "./ServerUpdateAction";
34+import {
35+ readConfirmDialogState,
36+ registerConfirmDialogHost,
37+ resetConfirmDialogForTests,
38+ respondToConfirmDialog,
39+} from "~/confirmDialog";
40+import {
41+ ServerUpdateAction,
42+ ServerUpdateProgress,
43+ ServerUpdatesAction,
44+ type ServerUpdateTarget,
45+} from "./ServerUpdateAction";
3446
3547 type ActionElement = ReactElement<{
3648 readonly onClick?: () => void;
@@ -194,6 +206,149 @@ describe("ServerUpdateAction", () => { · 157 unmodified lines
194206 });
195207 });
196208
209+describe("ServerUpdatesAction", () => {
210+ let renderer: ReactTestRenderer | undefined;
211+ const targets: ReadonlyArray<ServerUpdateTarget> = [
212+ {
213+ environmentId: "batch-a" as EnvironmentId,
214+ serverLabel: "Laptop",
215+ selfUpdate: "boot-service",
216+ targetVersion: "0.0.31",
217+ threadContinuation: true,
218+ continueThreadsAfterServerUpdate: true,
219+ },
220+ {
221+ environmentId: "batch-b" as EnvironmentId,
222+ serverLabel: "Office",
223+ selfUpdate: "respawn",
224+ targetVersion: "0.0.31",
225+ threadContinuation: true,
226+ continueThreadsAfterServerUpdate: false,
227+ },
228+ {
229+ environmentId: "batch-c" as EnvironmentId,
230+ serverLabel: "Manual",
231+ selfUpdate: null,
232+ targetVersion: "0.0.31",
233+ },
234+ ];
235+ const success = AsyncResult.success({ targetVersion: "0.0.31", method: "boot-service" as const });
236+
237+ async function mount(batch = targets) {
238+ await act(async () => {
239+ renderer = create(<ServerUpdatesAction targets={batch} />);
240+ });
241+ return renderer!.root.findByType("button");
242+ }
243+
244+ beforeEach(() => {
245+ vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
246+ testState.updateServer.mockReset();
247+ testState.toast.mockReset();
248+ resetConfirmDialogForTests();
249+ });
250+ afterEach(async () => {
251+ await act(async () => {
252+ renderer?.unmount();
253+ });
254+ renderer = undefined;
255+ resetConfirmDialogForTests();
256+ vi.unstubAllGlobals();
257+ });
258+
259+ it("updates both supported machines with their own continuation preference and skips the manual machine", async () => {
260+ testState.updateServer.mockResolvedValue(success);
261+ const button = await mount();
262+ await act(async () => {
263+ button.props.onClick();
264+ });
265+
266+ expect(testState.updateServer.mock.calls.map(([target]) => target)).toEqual([
267+ {
268+ environmentId: "batch-a",
269+ input: { targetVersion: "0.0.31", continueRunningThreads: true },
270+ },
271+ { environmentId: "batch-b", input: { targetVersion: "0.0.31" } },
272+ ]);
273+ expect(testState.toast.mock.calls.map(([toast]) => toast.title)).toEqual([
274+ "Laptop updated",
275+ "Office updated",
276+ ]);
277+ });
278+
279+ it("names a failed machine while letting the other machine complete", async () => {
280+ testState.updateServer
281+ .mockResolvedValueOnce(AsyncResult.failure(Cause.fail(new Error("Download failed"))))
282+ .mockResolvedValueOnce(success);
283+ const button = await mount();
284+ await act(async () => {
285+ button.props.onClick();
286+ });
287+
288+ expect(testState.updateServer).toHaveBeenCalledTimes(2);
289+ expect(testState.toast).toHaveBeenCalledWith({
290+ type: "error",
291+ title: "Laptop update failed",
292+ description: "Download failed",
293+ });
294+ expect(testState.toast).toHaveBeenCalledWith(
295+ expect.objectContaining({ type: "success", title: "Office updated" }),
296+ );
297+ expect(button.props.disabled).toBe(false);
298+ });
299+
300+ it("starts each machine once when double-clicked and disables the action until both finish", async () => {
301+ const completions: Array<() => void> = [];
302+ testState.updateServer.mockImplementation(
303+ () =>
304+ new Promise((resolve) => {
305+ completions.push(() => resolve(success));
306+ }),
307+ );
308+ const button = await mount();
309+ await act(async () => {
310+ button.props.onClick();
311+ button.props.onClick();
312+ });
313+ expect(testState.updateServer).toHaveBeenCalledTimes(2);
314+ expect(button.props.disabled).toBe(true);
315+ await act(async () => {
316+ completions[0]!();
317+ });
318+ expect(button.props.disabled).toBe(true);
319+ await act(async () => {
320+ completions[1]!();
321+ });
322+ expect(button.props.disabled).toBe(false);
323+ expect(testState.toast).toHaveBeenCalledTimes(2);
324+ });
325+
326+ it("asks once for desktop machines and cancels the entire batch", async () => {
327+ registerConfirmDialogHost();
328+ const button = await mount(
329+ targets.map((target, index) =>
330+ index < 2 ? { ...target, selfUpdate: "desktop-managed", desktopAppUpdate: true } : target,
331+ ),
332+ );
333+ await act(async () => {
334+ button.props.onClick();
335+ });
336+ const confirmation = readConfirmDialogState();
337+ expect(confirmation).toEqual(
338+ expect.objectContaining({
339+ status: "confirming",
340+ message: expect.stringContaining("Laptop, Office"),
341+ }),
342+ );
343+ expect(testState.updateServer).not.toHaveBeenCalled();
344+ await act(async () => {
345+ respondToConfirmDialog(false);
346+ });
347+ expect(testState.updateServer).not.toHaveBeenCalled();
348+ expect(button.props.disabled).toBe(false);
349+ });
350+});
351+
197352 describe("ServerUpdateProgress", () => {
198353 it("shows one calm status row for the restart wait", () => {
199354 const markup = renderToStaticMarkup(
apps/web/src/components/ServerUpdateAction.tsx+119−53
@@ -4,7 +4,7 @@ import { · 3 unmodified lines
44 isAtomCommandInterrupted,
55 squashAtomCommandFailure,
66 } from "@t3tools/client-runtime/state/runtime";
7−import type { ComponentProps } from "react";
7+import { type ComponentProps, useRef, useState } from "react";
88
99 import { requestConfirmDialog } from "~/confirmDialog";
1010 import { useCopyToClipboard } from "~/hooks/useCopyToClipboard";
@@ -34,6 +34,113 @@ function updateFailureMessage(error: unknown): string { · 23 unmodified lines
3434 return error instanceof Error ? error.message : "Server update failed.";
3535 }
3636
37+export interface ServerUpdateTarget {
38+ readonly environmentId: EnvironmentId;
39+ readonly serverLabel: string;
40+ readonly selfUpdate: ServerSelfUpdateCapability | null;
41+ readonly desktopAppUpdate?: boolean;
42+ readonly threadContinuation?: boolean;
43+ readonly targetVersion: string;
44+ readonly continueThreadsAfterServerUpdate?: boolean;
45+}
46+
47+type UpdateButtonProps = Pick<ComponentProps<typeof Button>, "variant" | "size"> & {
48+ readonly label?: string;
49+};
50+
51+function useServerUpdate() {
52+ const updateServer = useAtomCommand(serverEnvironment.updateServer, { reportFailure: false });
53+ return async (target: ServerUpdateTarget, failureTitle = "Server update failed") => {
54+ const { environmentId, serverLabel, selfUpdate, targetVersion } = target;
55+ if (pendingUpdateEnvironmentIds.has(environmentId)) return;
56+ pendingUpdateEnvironmentIds.add(environmentId);
57+ try {
58+ const result = await updateServer({
59+ environmentId,
60+ input: {
61+ targetVersion,
62+ ...(target.threadContinuation && target.continueThreadsAfterServerUpdate
63+ ? { continueRunningThreads: true }
64+ : {}),
65+ },
66+ });
67+ if (result._tag === "Failure") {
68+ if (isAtomCommandInterrupted(result)) return;
69+ throw squashAtomCommandFailure(result);
70+ }
71+ toastManager.add({
72+ type: "success",
73+ title: `${serverLabel} updated`,
74+ description:
75+ selfUpdate === "desktop-managed"
76+ ? `Desktop app relaunched on ${result.value.targetVersion}.`
77+ : `Reconnected on t3@${result.value.targetVersion}.`,
78+ });
79+ } catch (error) {
80+ toastManager.add({
81+ type: "error",
82+ title: failureTitle,
83+ description: updateFailureMessage(error),
84+ });
85+ } finally {
86+ pendingUpdateEnvironmentIds.delete(environmentId);
87+ }
88+ };
89+}
90+
91+/** Updates eligible machines independently; manual paths remain in the machine list. */
92+export function ServerUpdatesAction({
93+ targets,
94+ label = "Update all",
95+ variant = "outline",
96+ size = "xs",
97+}: UpdateButtonProps & {
98+ readonly targets: ReadonlyArray<ServerUpdateTarget>;
99+}) {
100+ const update = useServerUpdate();
101+ const pending = useRef(false);
102+ const [isPending, setIsPending] = useState(false);
103+ const eligible = targets.filter(
104+ (target) =>
105+ target.selfUpdate !== null &&
106+ (target.selfUpdate !== "desktop-managed" || target.desktopAppUpdate),
107+ );
108+ const handleUpdate = async () => {
109+ if (pending.current) return;
110+ pending.current = true;
111+ setIsPending(true);
112+ try {
113+ const available = eligible.filter(
114+ (target) => !pendingUpdateEnvironmentIds.has(target.environmentId),
115+ );
116+ const desktopTargets = available.filter((target) => target.selfUpdate === "desktop-managed");
117+ if (desktopTargets.length > 0) {
118+ const confirmed =
119+ (await requestConfirmDialog(
120+ `Update the T3 Code desktop apps on ${desktopTargets.map((target) => target.serverLabel).join(", ")}? They will close and relaunch on those machines.`,
121+ )) ?? true;
122+ if (!confirmed) return;
123+ }
124+ await Promise.all(
125+ available.map((target) => update(target, `${target.serverLabel} update failed`)),
126+ );
127+ } finally {
128+ pending.current = false;
129+ setIsPending(false);
130+ }
131+ };
132+ return (
133+ <Button
134+ size={size}
135+ variant={variant}
136+ disabled={isPending || eligible.length === 0}
137+ onClick={() => void handleUpdate()}
138+ >
139+ {label}
140+ </Button>
141+ );
142+}
143+
37144 /**
38145 * One-row status for an in-flight server update: "Downloading…" then
39146 * "Restarting…". The update is a wait, not a warning: a single pulsing dot
@@ -84,28 +191,13 @@ export function ServerUpdateAction({ · 44 unmodified lines
84191 label = "Update",
85192 variant = "outline",
86193 size = "xs",
87−}: {
88− readonly environmentId: EnvironmentId;
89− readonly serverLabel: string;
90− readonly selfUpdate: ServerSelfUpdateCapability | null;
91− /** The desktop app supervising this server accepts remote update
92− requests (capabilities.desktopAppUpdate). */
93− readonly desktopAppUpdate?: boolean;
94− /** The server can durably continue running provider turns after updating. */
95− readonly threadContinuation?: boolean;
96− readonly targetVersion: string;
97− readonly label?: string;
98− readonly variant?: ComponentProps<typeof Button>["variant"];
99− readonly size?: ComponentProps<typeof Button>["size"];
100−}) {
194+}: Omit<ServerUpdateTarget, "continueThreadsAfterServerUpdate"> & UpdateButtonProps) {
101195 const isDesktopAppUpdate = selfUpdate === "desktop-managed";
102196 const continueThreadsAfterServerUpdate = useEnvironmentSettings(
103197 environmentId,
104198 (settings) => settings.continueThreadsAfterServerUpdate,
105199 );
106− const updateServer = useAtomCommand(serverEnvironment.updateServer, {
107− reportFailure: false,
108− });
200+ const update = useServerUpdate();
109201 const { copyToClipboard } = useCopyToClipboard<{ command: string }>({
110202 target: "update command",
111203 onCopy: ({ command }) => {
@@ -140,41 +232,15 @@ export function ServerUpdateAction({ · 28 unmodified lines
140232 return;
141233 }
142234 }
143− if (pendingUpdateEnvironmentIds.has(environmentId)) {
144− return;
145− }
146− pendingUpdateEnvironmentIds.add(environmentId);
147− try {
148− const result = await updateServer({
149− environmentId,
150− input: {
151− targetVersion,
152− ...(threadContinuation && continueThreadsAfterServerUpdate
153− ? { continueRunningThreads: true }
154− : {}),
155− },
156− });
157− if (result._tag === "Failure") {
158− if (isAtomCommandInterrupted(result)) {
159− return;
160− }
161− toastManager.add({
162− type: "error",
163− title: "Server update failed",
164− description: updateFailureMessage(squashAtomCommandFailure(result)),
165− });
166− return;
167− }
168− toastManager.add({
169− type: "success",
170− title: `${serverLabel} updated`,
171− description: isDesktopAppUpdate
172− ? `Desktop app relaunched on ${result.value.targetVersion}.`
173− : `Reconnected on t3@${result.value.targetVersion}.`,
174− });
175− } finally {
176− pendingUpdateEnvironmentIds.delete(environmentId);
177− }
235+ await update({
236+ environmentId,
237+ serverLabel,
238+ selfUpdate,
239+ desktopAppUpdate,
240+ threadContinuation,
241+ targetVersion,
242+ continueThreadsAfterServerUpdate,
243+ });
178244 };
179245
180246 if (selfUpdate === "desktop-managed" && !desktopAppUpdate) {
apps/web/src/components/chat/ComposerUsageLimits.tsx+28−4
@@ -3,6 +3,7 @@ import { limitsNotice } from "@t3tools/shared/usageLimits"; · 2 unmodified lines
33 import { GaugeIcon } from "lucide-react";
44
55 import { getDriverOption } from "../settings/providerDriverMeta";
6+import { RedactedSensitiveText } from "../settings/RedactedSensitiveText";
67 import { LimitWindows, ResetCredits } from "../usage/UsageLimits";
78 import { ComposerBanner } from "./ComposerBanner";
89 import type { ComposerBannerStackItem } from "./ComposerBannerStack";
@@ -20,6 +21,27 @@ function accountLabel(account: UsageLimitsReport["accounts"][number]): string { · 11 unmodified lines
2021 : driver;
2122 }
2223
24+function AccountSummary({ account }: { readonly account: UsageLimitsReport["accounts"][number] }) {
25+ const label = accountLabel(account);
26+ return (
27+ <>
28+ {label.includes("@") ? (
29+ <RedactedSensitiveText
30+ key={label}
31+ value={label}
32+ ariaLabel="Toggle account label visibility"
33+ revealTooltip="Click to reveal account"
34+ hideTooltip="Click to hide account"
35+ className="max-w-full truncate align-bottom font-sans text-xs leading-normal"
36+ />
37+ ) : (
38+ label
39+ )}
40+ {account.plan ? ` · ${account.plan}` : null}
41+ </>
42+ );
43+}
44+
2345 /** The /usage-limits result as a composer notice: it stacks under warnings and dismisses like one. */
2446 export function usageLimitsBannerItem(
2547 id: string,
@@ -29,9 +51,11 @@ export function usageLimitsBannerItem( · 3 unmodified lines
2951 ): ComposerBannerStackItem {
3052 const [first] = report.accounts;
3153 const single = report.accounts.length === 1 && first ? first : null;
32− const summary = single
33− ? [accountLabel(single), single.plan].filter(Boolean).join(" · ")
34− : `${report.accounts.length} accounts`;
54+ const summary = single ? (
55+ <AccountSummary account={single} />
56+ ) : (
57+ `${report.accounts.length} accounts`
58+ );
3559 return {
3660 id,
3761 variant: "info",
@@ -65,7 +89,7 @@ function UsageLimitsBannerBody({ · 27 unmodified lines
6589 <div key={account.id} className="flex min-w-0 flex-col gap-1">
6690 {report.accounts.length > 1 ? (
6791 <span className="truncate text-xs text-muted-foreground">
68− {[accountLabel(account), account.plan].filter(Boolean).join(" · ")}
92+ <AccountSummary account={account} />
6993 </span>
7094 ) : null}
7195 {notice ? (
apps/web/src/components/chat/ExpandedImageDialog.tsx+17−12
@@ -83,9 +83,14 @@ export const ExpandedImageDialog = memo(function ExpandedImageDialog({ · 82 unmodified lines
8383 }
8484 : source;
8585
86− const navigateImage = useCallback((direction: -1 | 1) => {
87− setImageOffset((current) => current + direction);
88− }, []);
86+ const navigateImage = useCallback(
87+ (direction: -1 | 1) => {
88+ setImageOffset(
89+ (current) => (current + direction + preview.images.length) % preview.images.length,
90+ );
91+ },
92+ [preview.images.length],
93+ );
8994
9095 // The element that opened the preview gets focus back on close. Without
9196 // this a close button click leaves focus on the unmounted dialog, and the
@@ -161,13 +166,13 @@ export const ExpandedImageDialog = memo(function ExpandedImageDialog({ · 69 unmodified lines
161166 {preview.images.length > 1 && (
162167 <Button
163168 type="button"
164− size="icon"
165− variant="ghost"
166− className="absolute left-2 top-1/2 z-20 -translate-y-1/2 text-white/90 hover:bg-white/10 hover:text-white sm:left-6"
169+ size="icon-xl"
170+ variant="overlay"
171+ className="absolute left-2 top-1/2 z-20 -translate-y-1/2 sm:left-6"
167172 aria-label="Previous image"
168173 onClick={() => navigateImage(-1)}
169174 >
170− <ChevronLeftIcon className="size-5" />
175+ <ChevronLeftIcon className="size-7" />
171176 </Button>
172177 )}
173178 <MediaActions source={actionsSource}>
@@ -209,7 +214,7 @@ export const ExpandedImageDialog = memo(function ExpandedImageDialog({ · 35 unmodified lines
209214 onError={() => setFailedImageSrc(item.src)}
210215 />
211216 )}
212− <div className="mt-2 flex max-w-[92vw] items-center justify-center gap-1.5 text-xs text-muted-foreground/80">
217+ <div className="mt-2 flex max-w-[92vw] items-center justify-center gap-1.5 text-xs text-white/80">
213218 <span className="truncate">
214219 {item.name}
215220 {preview.images.length > 1 ? ` (${index + 1}/${preview.images.length})` : ""}
@@ -247,13 +252,13 @@ export const ExpandedImageDialog = memo(function ExpandedImageDialog({ · 31 unmodified lines
247252 {preview.images.length > 1 && (
248253 <Button
249254 type="button"
250− size="icon"
251− variant="ghost"
252− className="absolute right-2 top-1/2 z-20 -translate-y-1/2 text-white/90 hover:bg-white/10 hover:text-white sm:right-6"
255+ size="icon-xl"
256+ variant="overlay"
257+ className="absolute right-2 top-1/2 z-20 -translate-y-1/2 sm:right-6"
253258 aria-label="Next image"
254259 onClick={() => navigateImage(1)}
255260 >
256− <ChevronRightIcon className="size-5" />
261+ <ChevronRightIcon className="size-7" />
257262 </Button>
258263 )}
259264 </div>,
apps/web/src/components/chat/markdownImageGallery.ts+51−0
@@ -0,0 +1,51 @@
1+import { mediaKindFromPath } from "@t3tools/shared/filePreview";
2+import { mediaUrlReference } from "@t3tools/client-runtime/media-reference";
3+import type { ExpandedImageItem, ExpandedImagePreview } from "./ExpandedImagePreview";
4+import { resolveExternalWebLinkHost } from "./externalLinkContextMenu";
5+import { resolveProtocolRelativeMediaUrl } from "../media/mediaContent";
6+
7+// Weak keys retain resolved media actions only while the rendered image is reachable.
8+export const markdownImageItems = new WeakMap<Element, ExpandedImageItem>();
9+
10+/** Collect in document order only when opened, including PR sections separated by videos. */
11+export function markdownImageGallery(
12+ element: Element,
13+ selected: ExpandedImageItem,
14+): ExpandedImagePreview {
15+ const scope = element.closest("[data-image-gallery]") ?? element.closest(".chat-markdown");
16+ const images: ExpandedImageItem[] = [];
17+ let index = -1;
18+ for (const image of scope?.querySelectorAll("img") ?? []) {
19+ const registered = markdownImageItems.get(image);
20+ if (!registered) continue;
21+ const link = image.closest("a");
22+ const href = link?.getAttribute("href") ?? "";
23+ if (link && mediaKindFromPath(href) !== "image") continue;
24+ const linkedSource =
25+ resolveExternalWebLinkHost(href) !== null ? resolveProtocolRelativeMediaUrl(href) : null;
26+ const reference = mediaUrlReference(href);
27+ const item = linkedSource
28+ ? {
29+ ...registered,
30+ src: linkedSource,
31+ originalUrl: href,
32+ actionsSource: {
33+ kind: "image" as const,
34+ name: registered.name,
35+ src: linkedSource,
36+ ...(reference ? { reference } : {}),
37+ },
38+ }
39+ : registered;
40+ if (
41+ image === element ||
42+ (!markdownImageItems.has(element) && index < 0 && item.src === selected.src)
43+ ) {
44+ index = images.length;
45+ images.push(selected);
46+ } else {
47+ images.push(item);
48+ }
49+ }
50+ return index < 0 ? { images: [selected], index: 0 } : { images, index };
51+}
apps/web/src/components/chat/useAutoBalanceUpdateBanner.tsx+160−0
@@ -0,0 +1,160 @@
1+import { useAtomValue } from "@effect/atom-react";
2+import type { ServerUpdateState } from "@t3tools/client-runtime/state/server";
3+import { Atom } from "effect/unstable/reactivity";
4+import { useMemo, useState } from "react";
5+
6+import type { EnvironmentPresentation } from "~/state/environments";
7+import { serverEnvironment } from "~/state/server";
8+import {
9+ buildVersionMismatchDismissalKey,
10+ dismissServerUpdateFailure,
11+ dismissVersionMismatch,
12+ isServerUpdateFailureDismissed,
13+ isVersionMismatchDismissed,
14+ resolveServerConfigVersionMismatch,
15+ resolveServerSelfUpdateCapability,
16+ supportsDesktopAppUpdate,
17+ supportsServerUpdateThreadContinuation,
18+} from "~/versionSkew";
19+import {
20+ ServerUpdateAction,
21+ ServerUpdateProgress,
22+ ServerUpdatesAction,
23+} from "../ServerUpdateAction";
24+import { Popover, PopoverPopup, PopoverTrigger } from "../ui/popover";
25+import type { ComposerBannerStackItem } from "./ComposerBannerStack";
26+import { ComposerServerUpdateIcon } from "./ComposerServerUpdateStatus";
27+
28+/** Keep every machine's update visible while auto balance has no single update target. */
29+export function useAutoBalanceUpdateBanner(
30+ environments: readonly EnvironmentPresentation[],
31+): ComposerBannerStackItem | null {
32+ const statesAtom = useMemo(
33+ () =>
34+ Atom.make((get) =>
35+ environments.map((environment) => ({
36+ environment,
37+ state: get(serverEnvironment.updateStateAtom(environment.environmentId)),
38+ })),
39+ ),
40+ [environments],
41+ );
42+ const states = useAtomValue(statesAtom);
43+ const [dismissedNotices, setDismissedNotices] = useState<ReadonlySet<string | ServerUpdateState>>(
44+ () => new Set(),
45+ );
46+ const machines = states.flatMap(({ environment, state }) => {
47+ const mismatch = resolveServerConfigVersionMismatch(environment.serverConfig);
48+ const dismissKey = mismatch
49+ ? buildVersionMismatchDismissalKey(environment.environmentId, mismatch)
50+ : null;
51+ if (
52+ state.status === "idle"
53+ ? !mismatch ||
54+ (dismissKey !== null && dismissedNotices.has(dismissKey)) ||
55+ isVersionMismatchDismissed(dismissKey)
56+ : dismissedNotices.has(state) || isServerUpdateFailureDismissed(state)
57+ )
58+ return [];
59+ const selfUpdate = resolveServerSelfUpdateCapability(environment.serverConfig);
60+ const desktopAppUpdate = supportsDesktopAppUpdate(environment.serverConfig);
61+ return [
62+ {
63+ environmentId: environment.environmentId,
64+ serverLabel: environment.label,
65+ selfUpdate,
66+ desktopAppUpdate,
67+ threadContinuation: supportsServerUpdateThreadContinuation(environment.serverConfig),
68+ continueThreadsAfterServerUpdate:
69+ environment.serverConfig?.settings.continueThreadsAfterServerUpdate ?? false,
70+ targetVersion: state.status === "idle" ? mismatch!.clientVersion : state.targetVersion,
71+ connected: environment.connection.phase === "connected",
72+ remoteUpdate: selfUpdate !== null && (selfUpdate !== "desktop-managed" || desktopAppUpdate),
73+ state,
74+ dismissKey,
75+ },
76+ ];
77+ });
78+ if (machines.length === 0) return null;
79+
80+ const running = machines.filter((machine) => machine.state.status === "running").length;
81+ const failed = machines.filter((machine) => machine.state.status === "failed").length;
82+ const manual = machines.filter((machine) => !machine.remoteUpdate).length;
83+ const targets = machines.filter(
84+ (machine) => machine.connected && machine.remoteUpdate && machine.state.status !== "running",
85+ );
86+ const count = running || failed || machines.length;
87+ const status = running ? "running" : failed ? "failed" : "idle";
88+ const prefix = running ? "Updating" : failed ? "Could not update" : "Update available for";
89+ const title = `${prefix} ${count} ${count === 1 ? "machine" : "machines"}`;
90+ return {
91+ id: `auto-balance-server-updates-${dismissedNotices.size}`,
92+ variant: failed ? "error" : "default",
93+ priority: running ? "urgent" : "notice",
94+ icon: <ComposerServerUpdateIcon status={status} />,
95+ title: (
96+ <Popover>
97+ <PopoverTrigger
98+ className="block max-w-full truncate rounded-sm text-left outline-none focus-visible:ring-2 focus-visible:ring-ring"
99+ aria-label={`${title}. View machines`}
100+ >
101+ {title}
102+ </PopoverTrigger>
103+ <PopoverPopup side="top" align="start" className="w-80 max-w-[calc(100vw-2rem)]">
104+ <div className="space-y-3 text-xs">
105+ {machines.map((machine) => (
106+ <div key={machine.environmentId} className="space-y-1">
107+ <div className="font-medium">{machine.serverLabel}</div>
108+ {machine.state.status !== "idle" ? (
109+ <ServerUpdateProgress state={machine.state} />
110+ ) : !machine.remoteUpdate ? (
111+ <>
112+ <div className="text-muted-foreground">Manual update required</div>
113+ <ServerUpdateAction {...machine} />
114+ </>
115+ ) : (
116+ <div className="text-muted-foreground">
117+ {machine.connected
118+ ? `Ready to update to ${machine.targetVersion}`
119+ : "Reconnect this machine to update"}
120+ </div>
121+ )}
122+ </div>
123+ ))}
124+ </div>
125+ </PopoverPopup>
126+ </Popover>
127+ ),
128+ description:
129+ manual > 0 ? `${manual} ${manual === 1 ? "needs" : "need"} a manual update` : undefined,
130+ actions:
131+ running === 0 && targets.length > 0 ? (
132+ <ServerUpdatesAction
133+ targets={targets}
134+ variant="ghost"
135+ label={
136+ failed > 0
137+ ? "Retry"
138+ : targets.length === machines.length
139+ ? "Update all"
140+ : `Update ${targets.length} ${targets.length === 1 ? "machine" : "machines"}`
141+ }
142+ />
143+ ) : undefined,
144+ dismissLabel: "Dismiss update notice",
145+ ...(running
146+ ? {}
147+ : {
148+ onDismiss: () => {
149+ const next = new Set(dismissedNotices);
150+ for (const { state, dismissKey } of machines) {
151+ dismissServerUpdateFailure(state);
152+ dismissVersionMismatch(dismissKey);
153+ if (dismissKey) next.add(dismissKey);
154+ if (state.status === "failed") next.add(state);
155+ }
156+ setDismissedNotices(next);
157+ },
158+ }),
159+ };
160+}
apps/web/src/components/preview/PreviewAutomationHosts.tsx+18−2
@@ -35,8 +35,10 @@ import { · 34 unmodified lines
3535 readActiveBrowserRecordingTargets,
3636 startBrowserRecording,
3737 stopBrowserRecording,
38+ stopBrowserRecordingForUpload,
3839 } from "~/browser/browserRecording";
3940 import { resolveBrowserRecordingStopTarget } from "~/browser/browserRecordingScope";
41+import { uploadBrowserRecording } from "~/browser/browserRecordingUpload";
4042 import {
4143 acquireBrowserSurfaceActivity,
4244 useBrowserSurfaceStore,
@@ -716,7 +718,18 @@ function PreviewAutomationHost(props: { readonly environmentId: EnvironmentId }) · 673 unmodified lines
716718 const stopRuntimeTabId =
717719 activeRecordings.find((recording) => recording.serverTabId === stopTabId)
718720 ?.runtimeTabId ?? null;
719− const artifact = stopRuntimeTabId ? await stopBrowserRecording(stopRuntimeTabId) : null;
721+ const transferToEnvironment =
722+ typeof request.input === "object" &&
723+ request.input !== null &&
724+ "transferToEnvironment" in request.input &&
725+ request.input.transferToEnvironment === true;
726+ const artifact = stopRuntimeTabId
727+ ? transferToEnvironment
728+ ? await stopBrowserRecordingForUpload(stopRuntimeTabId, (saved, blob) =>
729+ uploadBrowserRecording(threadRef, saved, blob, hostDeadlineMs),
730+ )
731+ : await stopBrowserRecording(stopRuntimeTabId)
732+ : null;
720733 if (!artifact || !stopTabId) {
721734 return raisePreviewAutomationHostError(
722735 new PreviewAutomationRecordingNotActiveError({
@@ -727,7 +740,10 @@ function PreviewAutomationHost(props: { readonly environmentId: EnvironmentId }) · 4 unmodified lines
727740 }),
728741 );
729742 }
730− return { ...artifact, tabId: stopTabId };
743+ return {
744+ ...artifact,
745+ tabId: stopTabId,
746+ };
731747 }
732748 }
733749 } catch (cause) {
apps/web/src/components/preview/previewAutomationErrors.ts+9−1
@@ -2,6 +2,10 @@ import { · 1 unmodified line
22 EnvironmentId,
33 type PreviewAutomationHost,
44 PreviewAutomationOperation,
5+ PreviewAutomationRecordingTransferError,
6+ PreviewAutomationRecordingDesktopUpdateRequiredError,
7+ PreviewAutomationRecordingTooLargeError,
8+ PreviewAutomationRecordingDeadlineExpiredError,
59 type PreviewAutomationRequest,
610 type PreviewAutomationResponse,
711 PreviewTabId,
@@ -206,6 +210,10 @@ export class PreviewAutomationOperationError extends Schema.TaggedErrorClass<Pre · 198 unmodified lines
206210 }
207211
208212 export const PreviewAutomationHostError = Schema.Union([
213+ PreviewAutomationRecordingTransferError,
214+ PreviewAutomationRecordingDesktopUpdateRequiredError,
215+ PreviewAutomationRecordingTooLargeError,
216+ PreviewAutomationRecordingDeadlineExpiredError,
209217 PreviewAutomationOverlayTimeoutError,
210218 PreviewAutomationNavigationTimeoutError,
211219 PreviewAutomationViewportTimeoutError,
@@ -228,7 +236,7 @@ export function serializePreviewAutomationHostError( · 16 unmodified lines
228236 ),
229237 );
230238 return {
231− _tag: error.responseTag,
239+ _tag: "responseTag" in error ? error.responseTag : error._tag,
232240 message: error.message,
233241 ...(Object.keys(detail).length === 0 ? {} : { detail }),
234242 };
apps/web/src/components/pullRequest/PullRequestMarkdown.tsx+1−1
@@ -39,7 +39,7 @@ export function PullRequestMarkdown({ · 38 unmodified lines
3939 [repositoryUrl],
4040 );
4141 return (
42− <div className={cn("space-y-3", className)}>
42+ <div className={cn("space-y-3", className)} data-image-gallery>
4343 {segments.map((segment) => {
4444 if (segment.kind === "markdown") {
4545 return (
apps/web/src/components/ui/button.tsx+1−0
@@ -51,6 +51,7 @@ const buttonVariants = cva( · 50 unmodified lines
5151 link: "border-transparent underline-offset-4 [:hover,[data-pressed]]:underline",
5252 outline:
5353 "[--control-icon-color:var(--contrast-muted-foreground)] border-input bg-popover not-dark:bg-clip-padding text-foreground shadow-xs/5 not-disabled:not-active:not-data-pressed:before:shadow-[0_1px_--theme(--color-black/4%)] dark:bg-input/32 dark:not-disabled:before:shadow-[0_-1px_--theme(--color-white/2%)] dark:not-disabled:not-active:not-data-pressed:before:shadow-[0_-1px_--theme(--color-white/6%)] [:disabled,:active,[data-pressed]]:shadow-none [:hover,[data-pressed]]:bg-accent/50 dark:[:hover,[data-pressed]]:bg-input/64",
54+ overlay: "border-transparent bg-black/70 text-white/65 [:hover,[data-pressed]]:bg-black/90",
5455 secondary:
5556 "border-transparent bg-secondary text-secondary-foreground [:active,[data-pressed]]:bg-secondary/80 [:hover,[data-pressed]]:bg-secondary/90",
5657 "warning-outline":
infra/relay/package.json+1−1
@@ -6,7 +6,7 @@ · 5 unmodified lines
66 "deploy": "node -- scripts/deploy.ts",
77 "destroy": "alchemy destroy",
88 "test": "vp test run",
9− "typecheck": "tsgo --noEmit"
9+ "typecheck": "tsc --noEmit"
1010 },
1111 "dependencies": {
1212 "@clerk/backend": "catalog:",
oxlint-plugin-t3code/package.json+1−1
@@ -3,7 +3,7 @@ · 2 unmodified lines
33 "private": true,
44 "type": "module",
55 "scripts": {
6− "typecheck": "tsgo --noEmit",
6+ "typecheck": "tsc --noEmit",
77 "test": "vp test run"
88 },
99 "dependencies": {
package.json+2−2
@@ -3,7 +3,7 @@ · 2 unmodified lines
33 "private": true,
44 "type": "module",
55 "scripts": {
6− "prepare": "node scripts/clean-tsgo-backups.mjs && effect-tsgo patch && vp config --no-agent",
6+ "prepare": "effect-tsgo patch && vp config --no-agent",
77 "dev": "node scripts/dev-runner.ts dev",
88 "dev:share": "node scripts/dev-runner.ts dev --share",
99 "dev:server": "node scripts/dev-runner.ts dev:server",
@@ -51,8 +51,8 @@ · 41 unmodified lines
5151 "devDependencies": {
5252 "@effect/tsgo": "catalog:",
5353 "@types/node": "catalog:",
54− "@typescript/native-preview": "catalog:",
5554 "knip": "6.34.0",
55+ "typescript": "catalog:",
5656 "vite-plus": "catalog:"
5757 },
5858 "engines": {
packages/client-runtime/package.json+1−1
@@ -233,7 +233,7 @@ · 232 unmodified lines
233233 }
234234 },
235235 "scripts": {
236− "typecheck": "tsgo --noEmit",
236+ "typecheck": "tsc --noEmit",
237237 "test": "vp test run"
238238 },
239239 "dependencies": {
packages/contracts/package.json+1−1
@@ -21,7 +21,7 @@ · 20 unmodified lines
2121 }
2222 },
2323 "scripts": {
24− "typecheck": "tsgo --noEmit",
24+ "typecheck": "tsc --noEmit",
2525 "test": "vp test run"
2626 },
2727 "dependencies": {
packages/contracts/src/previewAutomation.ts+45−0
@@ -553,6 +553,8 @@ export const PreviewAutomationRecordingStatus = Schema.Struct({ · 552 unmodified lines
553553 });
554554 export type PreviewAutomationRecordingStatus = typeof PreviewAutomationRecordingStatus.Type;
555555
556+export const PREVIEW_RECORDING_STOP_TIMEOUT_MS = 120_000;
557+
556558 export const PreviewAutomationRecordingArtifact = Schema.Struct({
557559 id: Schema.String,
558560 tabId: PreviewTabId,
@@ -856,7 +858,50 @@ export class PreviewAutomationMalformedResponseError extends Schema.TaggedErrorC · 297 unmodified lines
856858 }
857859 }
858860
861+export class PreviewAutomationRecordingTransferError extends Schema.TaggedErrorClass<PreviewAutomationRecordingTransferError>()(
862+ "PreviewAutomationRecordingTransferError",
863+ {
864+ threadId: ThreadId,
865+ cause: Schema.optional(Schema.Defect()),
866+ },
867+) {
868+ override get message(): string {
869+ return "Preview recording could not be saved to the agent environment. The saved copy remains on the desktop.";
870+ }
871+}
872+
873+export class PreviewAutomationRecordingDesktopUpdateRequiredError extends Schema.TaggedErrorClass<PreviewAutomationRecordingDesktopUpdateRequiredError>()(
874+ "PreviewAutomationRecordingDesktopUpdateRequiredError",
875+ { threadId: ThreadId, cause: Schema.optional(Schema.Defect()) },
876+) {
877+ override get message(): string {
878+ return "Update the desktop app to transfer recordings. The recording remains on the desktop.";
879+ }
880+}
881+
882+export class PreviewAutomationRecordingTooLargeError extends Schema.TaggedErrorClass<PreviewAutomationRecordingTooLargeError>()(
883+ "PreviewAutomationRecordingTooLargeError",
884+ { threadId: ThreadId, cause: Schema.optional(Schema.Defect()) },
885+) {
886+ override get message(): string {
887+ return "The recording exceeds 50 MiB. The saved copy remains on the desktop.";
888+ }
889+}
890+
891+export class PreviewAutomationRecordingDeadlineExpiredError extends Schema.TaggedErrorClass<PreviewAutomationRecordingDeadlineExpiredError>()(
892+ "PreviewAutomationRecordingDeadlineExpiredError",
893+ { threadId: ThreadId, cause: Schema.optional(Schema.Defect()) },
894+) {
895+ override get message(): string {
896+ return "The recording transfer deadline expired. The saved copy remains on the desktop.";
897+ }
898+}
899+
859900 export const PreviewAutomationError = Schema.Union([
901+ PreviewAutomationRecordingTransferError,
902+ PreviewAutomationRecordingDesktopUpdateRequiredError,
903+ PreviewAutomationRecordingTooLargeError,
904+ PreviewAutomationRecordingDeadlineExpiredError,
860905 PreviewAutomationUnavailableError,
861906 PreviewAutomationNoAvailableHostError,
862907 PreviewAutomationUnsupportedClientError,
packages/effect-acp/package.json+1−1
@@ -25,7 +25,7 @@ · 24 unmodified lines
2525 }
2626 },
2727 "scripts": {
28− "typecheck": "tsgo --noEmit",
28+ "typecheck": "tsc --noEmit",
2929 "test": "vp test run",
3030 "generate": "node scripts/generate.ts"
3131 },
packages/effect-codex-app-server/package.json+1−1
@@ -21,7 +21,7 @@ · 20 unmodified lines
2121 }
2222 },
2323 "scripts": {
24− "typecheck": "tsgo --noEmit",
24+ "typecheck": "tsc --noEmit",
2525 "test": "vp test run",
2626 "generate": "node scripts/generate.ts",
2727 "probe": "node test/examples/codex-app-server-probe.ts"
packages/shared/package.json+1−1
@@ -281,7 +281,7 @@ · 280 unmodified lines
281281 }
282282 },
283283 "scripts": {
284− "typecheck": "tsgo --noEmit",
284+ "typecheck": "tsc --noEmit",
285285 "test": "vp test run"
286286 },
287287 "dependencies": {
packages/ssh/package.json+1−1
@@ -25,7 +25,7 @@ · 24 unmodified lines
2525 }
2626 },
2727 "scripts": {
28− "typecheck": "tsgo --noEmit",
28+ "typecheck": "tsc --noEmit",
2929 "test": "vp test run"
3030 },
3131 "dependencies": {
packages/tailscale/package.json+1−1
@@ -9,7 +9,7 @@ · 8 unmodified lines
99 }
1010 },
1111 "scripts": {
12− "typecheck": "tsgo --noEmit",
12+ "typecheck": "tsc --noEmit",
1313 "test": "vp test run"
1414 },
1515 "dependencies": {
pnpm-lock.yaml+460−303
@@ -10,8 +10,8 @@ catalogs: · 9 unmodified lines
1010 specifier: 4.0.0-beta.103
1111 version: 4.0.0-beta.103
1212 '@effect/tsgo':
13− specifier: 0.13.2
14− version: 0.13.2
13+ specifier: 0.41.0
14+ version: 0.41.0
1515 '@legendapp/list':
1616 specifier: 3.3.5
1717 version: 3.3.5
@@ -24,20 +24,18 @@ catalogs: · 6 unmodified lines
2424 '@pierre/diffs':
2525 specifier: 1.3.0-beta.10
2626 version: 1.3.0-beta.10
27− '@typescript/native-preview':
28− specifier: 7.0.0-dev.20260604.1
29− version: 7.0.0-dev.20260604.1
3027 jose:
3128 specifier: 6.2.2
3229 version: 6.2.2
3330 typescript:
34− specifier: ~6.0.3
35− version: 6.0.3
31+ specifier: 7.0.2
32+ version: 7.0.2
3633 vite-plus:
3734 specifier: 0.3.0
3835 version: 0.3.0
3936
4037 overrides:
38+ '@react-navigation/core': 7.21.13
4139 dbus-next>usocket: '-'
4240 '@anthropic-ai/claude-agent-sdk>@anthropic-ai/claude-agent-sdk-darwin-arm64': '-'
4341 '@anthropic-ai/claude-agent-sdk>@anthropic-ai/claude-agent-sdk-darwin-x64': '-'
@@ -114,19 +112,19 @@ importers: · 70 unmodified lines
114112 devDependencies:
115113 '@effect/tsgo':
116114 specifier: 'catalog:'
117− version: 0.13.2
115+ version: 0.41.0
118116 '@types/node':
119117 specifier: 24.12.4
120118 version: 24.12.4
121− '@typescript/native-preview':
122− specifier: 'catalog:'
123− version: 7.0.0-dev.20260604.1
124119 knip:
125120 specifier: 6.34.0
126121 version: 6.34.0
122+ typescript:
123+ specifier: 'catalog:'
124+ version: 7.0.2
127125 vite-plus:
128126 specifier: 'catalog:'
129− version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
127+ version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
130128
131129 apps/desktop:
132130 dependencies:
@@ -205,7 +203,7 @@ importers: · 72 unmodified lines
205203 version: 4.3.3
206204 vite-plus:
207205 specifier: 'catalog:'
208− version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
206+ version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
209207
210208 apps/marketing:
211209 dependencies:
@@ -226,14 +224,14 @@ importers: · 14 unmodified lines
226224 specifier: ^0.3.0
227225 version: 0.3.0
228226 typescript:
229− specifier: 'catalog:'
227+ specifier: ~6.0.3
230228 version: 6.0.3
231229
232230 apps/mobile:
233231 dependencies:
234232 '@clerk/expo':
235233 specifier: 4.2.0
236− version: 4.2.0(patch_hash=72e426f44fc1cde16fc2cbba3d1e96cdca7c6d957faa73d0fe6b43948608a6c1)(1fcd0592788ddcf326eeeb90d875ed47)
234+ version: 4.2.0(patch_hash=72e426f44fc1cde16fc2cbba3d1e96cdca7c6d957faa73d0fe6b43948608a6c1)(dbc31631339ce74330e188d5d7a88158)
237235 '@effect/atom-react':
238236 specifier: 4.0.0-beta.103
239237 version: 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(react@19.2.3)(scheduler@0.27.0)
@@ -290,7 +288,7 @@ importers: · 50 unmodified lines
290288 version: link:../../packages/contracts
291289 '@t3tools/mobile-markdown-text':
292290 specifier: file:./modules/t3-markdown-text
293− version: file:apps/mobile/modules/t3-markdown-text(eb96cd030e772ab91fe21f812240338a)
291+ version: file:apps/mobile/modules/t3-markdown-text(6f0a94b6f541bbd4be3f343e27991996)
294292 '@t3tools/mobile-review-diff-native':
295293 specifier: file:./modules/t3-review-diff
296294 version: file:apps/mobile/modules/t3-review-diff
@@ -314,13 +312,13 @@ importers: · 17 unmodified lines
314312 version: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)
315313 expo:
316314 specifier: ~57.0.18
317− version: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
315+ version: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
318316 expo-asset:
319317 specifier: ~57.0.15
320− version: 57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)
318+ version: 57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2)
321319 expo-audio:
322320 specifier: ~57.0.4
323− version: 57.0.4(patch_hash=fa9a3e0442ed395d4071bb406e08c3a471c9a84700bdfa0b9ad7ff144c96041a)(expo-asset@57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3))(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
321+ version: 57.0.4(patch_hash=fa9a3e0442ed395d4071bb406e08c3a471c9a84700bdfa0b9ad7ff144c96041a)(expo-asset@57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2))(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
324322 expo-auth-session:
325323 specifier: ~57.0.10
326324 version: 57.0.10(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
@@ -377,22 +375,22 @@ importers: · 50 unmodified lines
377375 version: 57.0.1(expo@57.0.18)(react@19.2.3)
378376 expo-notifications:
379377 specifier: ~57.0.15
380− version: 57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)
378+ version: 57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2)
381379 expo-paste-input:
382380 specifier: ^0.1.15
383381 version: 0.1.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
384382 expo-quick-actions:
385383 specifier: ^6.0.2
386− version: 6.0.2(expo@57.0.18)(typescript@6.0.3)
384+ version: 6.0.2(expo@57.0.18)(typescript@7.0.2)
387385 expo-secure-store:
388386 specifier: ~57.0.2
389387 version: 57.0.2(expo@57.0.18)
390388 expo-sharing:
391389 specifier: 57.0.17
392− version: 57.0.17(patch_hash=8d2e3b10eb3f52036a9a086800180ec6cebf3b75bccc5b1775117a7244d4ac45)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)
390+ version: 57.0.17(patch_hash=8d2e3b10eb3f52036a9a086800180ec6cebf3b75bccc5b1775117a7244d4ac45)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2)
393391 expo-splash-screen:
394392 specifier: ~57.0.8
395− version: 57.0.8(expo@57.0.18)(typescript@6.0.3)
393+ version: 57.0.8(expo@57.0.18)(typescript@7.0.2)
396394 expo-sqlite:
397395 specifier: ~57.0.2
398396 version: 57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
@@ -464,7 +462,7 @@ importers: · 65 unmodified lines
464462 version: 3.6.0
465463 uniwind:
466464 specifier: 1.11.0
467− version: 1.11.0(patch_hash=17d92be2eec71bb6396b402e8d034968e54b28746876d7977cb3139655f42b90)(@expo/metro-config@57.0.12(patch_hash=96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2)(bufferutil@4.1.0)(expo@57.0.18)(typescript@6.0.3)(utf-8-validate@6.0.6))(metro-cache@0.84.5)(metro-transform-worker@0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))(metro@0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(tailwindcss@4.3.3)
465+ version: 1.11.0(patch_hash=17d92be2eec71bb6396b402e8d034968e54b28746876d7977cb3139655f42b90)(@expo/metro-config@57.0.12(patch_hash=96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2)(bufferutil@4.1.0)(expo@57.0.18)(typescript@7.0.2)(utf-8-validate@6.0.6))(metro-cache@0.84.5)(metro-transform-worker@0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))(metro@0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(tailwindcss@4.3.3)
468466 devDependencies:
469467 '@effect/vitest':
470468 specifier: 4.0.0-beta.103
@@ -483,7 +481,7 @@ importers: · 12 unmodified lines
483481 version: 4.3.3
484482 typescript:
485483 specifier: 'catalog:'
486− version: 6.0.3
484+ version: 7.0.2
487485
488486 apps/server:
489487 dependencies:
@@ -559,7 +557,7 @@ importers: · 69 unmodified lines
559557 version: link:../../packages/effect-codex-app-server
560558 vite-plus:
561559 specifier: 'catalog:'
562− version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
560+ version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
563561
564562 apps/web:
565563 dependencies:
@@ -683,13 +681,13 @@ importers: · 117 unmodified lines
683681 version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))
684682 '@rolldown/plugin-babel':
685683 specifier: ^0.2.0
686− version: 0.2.3(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.29.7)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.1.5)
684+ version: 0.2.3(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.29.7)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.1.5)
687685 '@tailwindcss/vite':
688686 specifier: 4.3.3
689− version: 4.3.3(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))
687+ version: 4.3.3(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))
690688 '@tanstack/router-plugin':
691689 specifier: ^1.161.0
692− version: 1.168.13(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))
690+ version: 1.168.13(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))
693691 '@types/babel__core':
694692 specifier: ^7.20.5
695693 version: 7.20.5
@@ -713,7 +711,7 @@ importers: · 17 unmodified lines
713711 version: 0.3.0
714712 '@vitejs/plugin-react':
715713 specifier: ^6.0.0
716− version: 6.0.2(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.29.7)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.1.5))(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(babel-plugin-react-compiler@1.0.0)
714+ version: 6.0.2(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.29.7)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.1.5))(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(babel-plugin-react-compiler@1.0.0)
717715 babel-plugin-react-compiler:
718716 specifier: 1.0.0
719717 version: 1.0.0
@@ -728,10 +726,10 @@ importers: · 8 unmodified lines
728726 version: 4.3.3
729727 vite:
730728 specifier: npm:@voidzero-dev/vite-plus-core@0.3.0
731− version: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)'
729+ version: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)'
732730 vite-plus:
733731 specifier: 'catalog:'
734− version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
732+ version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
735733
736734 infra/relay:
737735 dependencies:
@@ -758,7 +756,7 @@ importers: · 20 unmodified lines
758756 version: link:../../packages/shared
759757 alchemy:
760758 specifier: 2.0.0-beta.65
761− version: 2.0.0-beta.65(db83c2a4e1e233e8661745115951ce85)
759+ version: 2.0.0-beta.65(5a5e74348f57625dac72981db7114e79)
762760 drizzle-orm:
763761 specifier: 1.0.0-rc.4
764762 version: 1.0.0-rc.4(@cloudflare/workers-types@4.20260604.1)(@effect/sql-d1@4.0.0-beta.101(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)))(@effect/sql-pg@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)))(@effect/sql-sqlite-bun@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)))(@libsql/client@0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))(bun-types@1.3.14)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(expo-sqlite@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(zod@4.4.3)
@@ -783,10 +781,10 @@ importers: · 18 unmodified lines
783781 version: 1.0.0-rc.4
784782 vite:
785783 specifier: npm:@voidzero-dev/vite-plus-core@0.3.0
786− version: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)'
784+ version: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)'
787785 vite-plus:
788786 specifier: 'catalog:'
789− version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
787+ version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
790788
791789 oxlint-plugin-t3code:
792790 dependencies:
@@ -805,7 +803,7 @@ importers: · 12 unmodified lines
805803 version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))
806804 vite-plus:
807805 specifier: 'catalog:'
808− version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
806+ version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
809807
810808 packages/client-runtime:
811809 dependencies:
@@ -842,7 +840,7 @@ importers: · 30 unmodified lines
842840 version: 2.0.2
843841 vite-plus:
844842 specifier: 'catalog:'
845− version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
843+ version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
846844
847845 packages/contracts:
848846 dependencies:
@@ -855,7 +853,7 @@ importers: · 6 unmodified lines
855853 version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))
856854 vite-plus:
857855 specifier: 'catalog:'
858− version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
856+ version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
859857
860858 packages/effect-acp:
861859 dependencies:
@@ -877,7 +875,7 @@ importers: · 15 unmodified lines
877875 version: 24.12.4
878876 vite-plus:
879877 specifier: 'catalog:'
880− version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
878+ version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
881879
882880 packages/effect-codex-app-server:
883881 dependencies:
@@ -899,7 +897,7 @@ importers: · 15 unmodified lines
899897 version: 24.12.4
900898 vite-plus:
901899 specifier: 'catalog:'
902− version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
900+ version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
903901
904902 packages/shared:
905903 dependencies:
@@ -933,7 +931,7 @@ importers: · 27 unmodified lines
933931 version: 24.12.4
934932 vite-plus:
935933 specifier: 'catalog:'
936− version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
934+ version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
937935
938936 packages/ssh:
939937 dependencies:
@@ -958,7 +956,7 @@ importers: · 18 unmodified lines
958956 version: 24.12.4
959957 vite-plus:
960958 specifier: 'catalog:'
961− version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
959+ version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
962960
963961 packages/tailscale:
964962 dependencies:
@@ -977,7 +975,7 @@ importers: · 12 unmodified lines
977975 version: 24.12.4
978976 vite-plus:
979977 specifier: 'catalog:'
980− version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
978+ version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
981979
982980 scripts:
983981 dependencies:
@@ -1014,10 +1012,13 @@ importers: · 30 unmodified lines
10141012 version: 6.0.5
10151013 typescript:
10161014 specifier: 'catalog:'
1017− version: 6.0.3
1015+ version: 7.0.2
1016+ typescript-legacy:
1017+ specifier: npm:typescript@~6.0.3
1018+ version: typescript@6.0.3
10181019 vite-plus:
10191020 specifier: 'catalog:'
1020− version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
1021+ version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
10211022
10221023 packages:
10231024
@@ -2082,43 +2083,43 @@ packages: · 1058 unmodified lines
20822083 peerDependencies:
20832084 effect: 4.0.0-beta.103
20842085
2085− '@effect/tsgo-darwin-arm64@0.13.2':
2086− resolution: {integrity: sha512-AlYlxU2sD3urNCmNCQWtatPJS/+m2r3CvgZdDTs9KEz2YcyQc2GV1g2RWFkoMwmgzYBx69DBLu1oscqJO2qAog==}
2086+ '@effect/tsgo-darwin-arm64@0.41.0':
2087+ resolution: {integrity: sha512-3iEPtcHF72yDjv7T5YpnX+Io1LDLywJb1oGG3Fp/Fth4xmqiT1Vacyz5wnPCfEWGQ6CyrlyCZSSjUxPyJ70+DQ==}
20872088 cpu: [arm64]
20882089 os: [darwin]
20892090
2090− '@effect/tsgo-darwin-x64@0.13.2':
2091− resolution: {integrity: sha512-oGWIUsWuzCGBRaxB3R4ZjzmqaWb20OtLpBc8HKf3mGstyiCpGUtb7arqncpSq04nN9yb+mM5yBpGKZ9EJAYuEA==}
2091+ '@effect/tsgo-darwin-x64@0.41.0':
2092+ resolution: {integrity: sha512-rrVVNacJ/Qh8DfdfgNJDuzcVmR3xPnqes3z+F1kio99umJwPIRB8iPWRAY0SrO+Y84A/y2SSb0AjMGqA5V3Aiw==}
20922093 cpu: [x64]
20932094 os: [darwin]
20942095
2095− '@effect/tsgo-linux-arm64@0.13.2':
2096− resolution: {integrity: sha512-v9PIgdLR6jREQk42EIm/mtFBwmB4Xzuq70l1Uf/7MnV/eivrZP+Wjfex/UuzMRbjM5eLRP3FFMj2HZvjkFQv6Q==}
2096+ '@effect/tsgo-linux-arm64@0.41.0':
2097+ resolution: {integrity: sha512-RVI+7pG3tP56LfH06a2aq4KLp2RQ0HohW8mmoGmrBPyNEL9DnzFEGB98ZoMJ+ERYUJoIp74Jy3nKRVbnzVhxFw==}
20972098 cpu: [arm64]
20982099 os: [linux]
20992100
2100− '@effect/tsgo-linux-arm@0.13.2':
2101− resolution: {integrity: sha512-y5aTN7MrwnsStcSJ4Z8J93Nszeh9yf8kbaHk+03bRm9n0TrhVea/bJZoi9cprLJSy01Umt+xC3jFyvOSMrWB8g==}
2101+ '@effect/tsgo-linux-arm@0.41.0':
2102+ resolution: {integrity: sha512-JddS91IaupLa22oc4YQiYppe7iAZAEyx/2iR9sAAAhpVanWACsIAcyUy4RJrs8sPLLoLsZQaKQa+9rbQO1FLsg==}
21022103 cpu: [arm]
21032104 os: [linux]
21042105
2105− '@effect/tsgo-linux-x64@0.13.2':
2106− resolution: {integrity: sha512-MzrApKfCL0DnFGvoyJUKtW39PGDykJZkkB/tOZSuTSurcYAzkmUIOUwuTASeNqDjj4/DixT7Ha4CMVeCQgg6hg==}
2106+ '@effect/tsgo-linux-x64@0.41.0':
2107+ resolution: {integrity: sha512-U3+kMDVe2Opa5mxbN4B6PgOizWx5B4LXLN98CZDUl2vYtRGfwrRRhKQiB+de3ELaZ0MuDjPlCvU7S2mXQ8UiuQ==}
21072108 cpu: [x64]
21082109 os: [linux]
21092110
2110− '@effect/tsgo-win32-arm64@0.13.2':
2111− resolution: {integrity: sha512-WwYLSrgCa4iiSIZe5KkG2P1q+JmIloDI6tbqHqpvumrz3uU8fg33e5A7wQ68sRgr4ofqrTYPQhJ6b+Eyeadazg==}
2111+ '@effect/tsgo-win32-arm64@0.41.0':
2112+ resolution: {integrity: sha512-H6/xkn+B4B63OPKc0UAzQQFvLs0MXKigiD9dtvQeCU7czWGztOQILuLkyHnM1Dlc+uy4cJ5eXHiMXd+lwl+E8g==}
21122113 cpu: [arm64]
21132114 os: [win32]
21142115
2115− '@effect/tsgo-win32-x64@0.13.2':
2116− resolution: {integrity: sha512-M4Cf98tlCzCWig61QNoPxhE0LyMJtlVIQY2hed0Y1uYpwv0W1BMyOACLcj6ll+vuLWmXvVlOfXC+BuDOqPo9fg==}
2116+ '@effect/tsgo-win32-x64@0.41.0':
2117+ resolution: {integrity: sha512-vRN/Mhi381xEGrvV68IN/VO4Lc0pnlVQzHSVmNCJXLwGLmJUvuvPoyZ7Lv4wwHRX9iZe8Rch21xUGu5jSQtUSw==}
21172118 cpu: [x64]
21182119 os: [win32]
21192120
2120− '@effect/tsgo@0.13.2':
2121− resolution: {integrity: sha512-zPQMHBdCN1k7Jbxjxq0HVAbzsZd+LAoRPzBEZ3F4y/uxNK0K/XGvFXUUw/CUAsD6rhUtC2VahZY1tp0owb5lgg==}
2121+ '@effect/tsgo@0.41.0':
2122+ resolution: {integrity: sha512-C/U7lFM0AXsfpqRilDOgwu+llBhAo8bcdIlzgbRWf1LWlU4KZKB2UsUvBPL3qPnm+wmbCvQLeTQc4BjV9oJrcg==}
21222123 hasBin: true
21232124
21242125 '@effect/vitest@4.0.0-beta.103':
@@ -4305,8 +4306,8 @@ packages: · 2180 unmodified lines
43054306 '@types/react':
43064307 optional: true
43074308
4308− '@react-navigation/core@7.21.2':
4309− resolution: {integrity: sha512-EsJhQnsL5NuIhXsWF7URijS5hd2AaJUREdq1fOIowlyNNQBA3jCnkGU0DkW7+eI40cQ+GXH8DQw+ci7TefLIxQ==}
4309+ '@react-navigation/core@7.21.13':
4310+ resolution: {integrity: sha512-d1syMXra7RlJjGsjsIxEA14F6U+awFtQJeOfDc+V7x3y1mPqYQVTYnqnt3PR+fBBouUKaKsgKZsSR3MP5919Xg==}
43104311 peerDependencies:
43114312 react: '>= 18.2.0'
43124313
@@ -4337,8 +4338,8 @@ packages: · 24 unmodified lines
43374338 react: '>= 18.2.0'
43384339 react-native: '*'
43394340
4340− '@react-navigation/routers@7.6.0':
4341− resolution: {integrity: sha512-lblhDXfS75jLc7G2K7BZGM+7cjqQXk13X/MA4fq/12r62zM+fBhhreLzYflSitrDDXFRJpSvJXy0ziiGU04Xow==}
4341+ '@react-navigation/routers@7.6.4':
4342+ resolution: {integrity: sha512-GI7eJm8/KsZUQaYcXvEExikKurRZRgEsSzyZ7faENfi65yqJBCXjDMwyN1pF6pNW1MoLH1ErDwDivFxY6BzD3w==}
43424343
43434344 '@rolldown/binding-android-arm64@1.0.0-rc.17':
43444345 resolution: {integrity: sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==}
@@ -5194,52 +5195,125 @@ packages: · 849 unmodified lines
51945195 '@types/yauzl@3.4.0':
51955196 resolution: {integrity: sha512-NRPn5w6h8dhcnmx3YIRQcqMywY/+nND/uOkJessedcrowO3C0AssHp3tMJpxKAwOhFOo0OV1y9VtsC5hbKKBAw==}
51965197
5197− '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260604.1':
5198− resolution: {integrity: sha512-zs616um9UuaODLsNlCu5Aw95rFcTV4u3hVt090r6k0lVvTxfaJOv8HKA6BpIotcEYlZlMQowrMSYCCdedo7iyA==}
5198+ '@typescript/typescript-aix-ppc64@7.0.2':
5199+ resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==}
5200+ engines: {node: '>=16.20.0'}
5201+ cpu: [ppc64]
5202+ os: [aix]
5203+
5204+ '@typescript/typescript-darwin-arm64@7.0.2':
5205+ resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==}
51995206 engines: {node: '>=16.20.0'}
52005207 cpu: [arm64]
52015208 os: [darwin]
52025209
5203− '@typescript/native-preview-darwin-x64@7.0.0-dev.20260604.1':
5204− resolution: {integrity: sha512-pOdNAf2pwc9JBjo8gUsvLs5uqg7d0AhYXfE8/3zvPKBlIZG+mTcvEWW1hPawlWxXzf/vxnP4dgYwUHAMDghhKA==}
5210+ '@typescript/typescript-darwin-x64@7.0.2':
5211+ resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==}
52055212 engines: {node: '>=16.20.0'}
52065213 cpu: [x64]
52075214 os: [darwin]
52085215
5209− '@typescript/native-preview-linux-arm64@7.0.0-dev.20260604.1':
5210− resolution: {integrity: sha512-GjIrt6YHP3bbOWBCCE08SlBSDf84Lnjn3Td822/lOX9nm6ODlA/HI7rtGh7KzS/fxehep2Vy4dXU4Il12X1s5A==}
5216+ '@typescript/typescript-freebsd-arm64@7.0.2':
5217+ resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==}
5218+ engines: {node: '>=16.20.0'}
5219+ cpu: [arm64]
5220+ os: [freebsd]
5221+
5222+ '@typescript/typescript-freebsd-x64@7.0.2':
5223+ resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==}
5224+ engines: {node: '>=16.20.0'}
5225+ cpu: [x64]
5226+ os: [freebsd]
5227+
5228+ '@typescript/typescript-linux-arm64@7.0.2':
5229+ resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==}
52115230 engines: {node: '>=16.20.0'}
52125231 cpu: [arm64]
52135232 os: [linux]
52145233
5215− '@typescript/native-preview-linux-arm@7.0.0-dev.20260604.1':
5216− resolution: {integrity: sha512-IKaZL3i5HKmKqwb2IZEXW1j68fVg1HsvAaXkbrkOIG/J5Eyksu5tEnTzucrIY1oPdzgHT+y2HpDIYp2sGeHFvw==}
5234+ '@typescript/typescript-linux-arm@7.0.2':
5235+ resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==}
52175236 engines: {node: '>=16.20.0'}
52185237 cpu: [arm]
52195238 os: [linux]
52205239
5221− '@typescript/native-preview-linux-x64@7.0.0-dev.20260604.1':
5222− resolution: {integrity: sha512-twQ7XDjsmaHIevN1MjeRYIVLUPL0fBm8A0jg1FhGYPckhTxEBiHIpJf9E//eFidAdrEHjeTSBP1jJw3GNAensg==}
5240+ '@typescript/typescript-linux-loong64@7.0.2':
5241+ resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==}
5242+ engines: {node: '>=16.20.0'}
5243+ cpu: [loong64]
5244+ os: [linux]
5245+
5246+ '@typescript/typescript-linux-mips64el@7.0.2':
5247+ resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==}
5248+ engines: {node: '>=16.20.0'}
5249+ cpu: [mips64el]
5250+ os: [linux]
5251+
5252+ '@typescript/typescript-linux-ppc64@7.0.2':
5253+ resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==}
5254+ engines: {node: '>=16.20.0'}
5255+ cpu: [ppc64]
5256+ os: [linux]
5257+
5258+ '@typescript/typescript-linux-riscv64@7.0.2':
5259+ resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==}
5260+ engines: {node: '>=16.20.0'}
5261+ cpu: [riscv64]
5262+ os: [linux]
5263+
5264+ '@typescript/typescript-linux-s390x@7.0.2':
5265+ resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==}
5266+ engines: {node: '>=16.20.0'}
5267+ cpu: [s390x]
5268+ os: [linux]
5269+
5270+ '@typescript/typescript-linux-x64@7.0.2':
5271+ resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==}
52235272 engines: {node: '>=16.20.0'}
52245273 cpu: [x64]
52255274 os: [linux]
52265275
5227− '@typescript/native-preview-win32-arm64@7.0.0-dev.20260604.1':
5228− resolution: {integrity: sha512-QBRxaVT3SFiNfOhwYb/56ddpHWPMFdfiJ4zkFJIjaAXeZ/ssWNHM9lH7yR++GrE9VTsUZ4eVSZfOmQbzRERhgw==}
5276+ '@typescript/typescript-netbsd-arm64@7.0.2':
5277+ resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==}
52295278 engines: {node: '>=16.20.0'}
52305279 cpu: [arm64]
5231− os: [win32]
5280+ os: [netbsd]
5281+
5282+ '@typescript/typescript-netbsd-x64@7.0.2':
5283+ resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==}
5284+ engines: {node: '>=16.20.0'}
5285+ cpu: [x64]
5286+ os: [netbsd]
5287+
5288+ '@typescript/typescript-openbsd-arm64@7.0.2':
5289+ resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==}
5290+ engines: {node: '>=16.20.0'}
5291+ cpu: [arm64]
5292+ os: [openbsd]
5293+
5294+ '@typescript/typescript-openbsd-x64@7.0.2':
5295+ resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==}
5296+ engines: {node: '>=16.20.0'}
5297+ cpu: [x64]
5298+ os: [openbsd]
52325299
5233− '@typescript/native-preview-win32-x64@7.0.0-dev.20260604.1':
5234− resolution: {integrity: sha512-hR7YHoRpm88Q86gK6/IMayWUA+ROdHGzOPKK8EBp1xD/Cg2Bh5AXbut8HcyUDx/bcGQvnuht/XsW47bT3to9mg==}
5300+ '@typescript/typescript-sunos-x64@7.0.2':
5301+ resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==}
52355302 engines: {node: '>=16.20.0'}
52365303 cpu: [x64]
5304+ os: [sunos]
5305+
5306+ '@typescript/typescript-win32-arm64@7.0.2':
5307+ resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==}
5308+ engines: {node: '>=16.20.0'}
5309+ cpu: [arm64]
52375310 os: [win32]
52385311
5239− '@typescript/native-preview@7.0.0-dev.20260604.1':
5240− resolution: {integrity: sha512-A3/9yZTt2V5NlDURcVJ4mN2YjfeQTXCRyLuENKrNdGhO+y59mC/2UDr7UvpB3Li+83TRAuhDN8SBoM+7gkHdzQ==}
5312+ '@typescript/typescript-win32-x64@7.0.2':
5313+ resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==}
52415314 engines: {node: '>=16.20.0'}
5242− hasBin: true
5315+ cpu: [x64]
5316+ os: [win32]
52435317
52445318 '@ungap/structured-clone@1.3.1':
52455319 resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==}
@@ -10237,6 +10311,11 @@ packages: · 4991 unmodified lines
1023710311 engines: {node: '>=14.17'}
1023810312 hasBin: true
1023910313
10314+ typescript@7.0.2:
10315+ resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==}
10316+ engines: {node: '>=16.20.0'}
10317+ hasBin: true
10318+
1024010319 ua-parser-js@0.7.41:
1024110320 resolution: {integrity: sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==}
1024210321 hasBin: true
@@ -11976,14 +12055,14 @@ snapshots: · 1733 unmodified lines
1197612055 electron-store: 8.2.0
1197712056 react-dom: 19.2.6(react@19.2.6)
1197812057
11979− '@clerk/expo@4.2.0(patch_hash=72e426f44fc1cde16fc2cbba3d1e96cdca7c6d957faa73d0fe6b43948608a6c1)(1fcd0592788ddcf326eeeb90d875ed47)':
12058+ '@clerk/expo@4.2.0(patch_hash=72e426f44fc1cde16fc2cbba3d1e96cdca7c6d957faa73d0fe6b43948608a6c1)(dbc31631339ce74330e188d5d7a88158)':
1198012059 dependencies:
1198112060 '@clerk/clerk-js': 6.30.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
1198212061 '@clerk/react': 6.14.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
1198312062 '@clerk/shared': 4.30.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
11984− '@expo/config-plugins': 57.0.9(typescript@6.0.3)
12063+ '@expo/config-plugins': 57.0.9(typescript@7.0.2)
1198512064 base-64: 1.0.0
11986− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
12065+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1198712066 react: 19.2.3
1198812067 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1198912068 react-native-url-polyfill: 4.0.0(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
@@ -12104,14 +12183,14 @@ snapshots: · 114 unmodified lines
1210412183 '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))
1210512184 effect: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)
1210612185
12107− '@distilled.cloud/cloudflare-rolldown-plugin@0.13.10(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.1.5)(workerd@1.20260704.1)':
12186+ '@distilled.cloud/cloudflare-rolldown-plugin@0.13.10(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.1.5)(workerd@1.20260704.1)':
1210812187 dependencies:
1210912188 '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260704.1)
1211012189 magic-string: 0.30.21
1211112190 unenv: 2.0.0-rc.24
1211212191 optionalDependencies:
1211312192 rolldown: 1.1.5
12114− vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)'
12193+ vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)'
1211512194 transitivePeerDependencies:
1211612195 - workerd
1211712196
@@ -12125,13 +12204,13 @@ snapshots: · 7 unmodified lines
1212512204 '@effect/platform-bun': 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(utf-8-validate@6.0.6)
1212612205 '@effect/platform-node': 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6)
1212712206
12128− '@distilled.cloud/cloudflare-vite-plugin@0.13.10(86e3ed6000e5955518fd9c0dea8322a9)':
12207+ '@distilled.cloud/cloudflare-vite-plugin@0.13.10(414e2eac4e6e313aabea4c365b0972ba)':
1212912208 dependencies:
1213012209 '@distilled.cloud/cloudflare': 0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))
12131− '@distilled.cloud/cloudflare-rolldown-plugin': 0.13.10(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.1.5)(workerd@1.20260704.1)
12210+ '@distilled.cloud/cloudflare-rolldown-plugin': 0.13.10(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.1.5)(workerd@1.20260704.1)
1213212211 '@distilled.cloud/cloudflare-runtime': 0.13.10(@distilled.cloud/cloudflare@0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)))(@effect/platform-bun@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(utf-8-validate@6.0.6))(@effect/platform-node@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))
1213312212 effect: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)
12134− vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)'
12213+ vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)'
1213512214 optionalDependencies:
1213612215 '@effect/platform-bun': 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(utf-8-validate@6.0.6)
1213712216 '@effect/platform-node': 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6)
@@ -12260,36 +12339,36 @@ snapshots: · 122 unmodified lines
1226012339 dependencies:
1226112340 effect: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)
1226212341
12263− '@effect/tsgo-darwin-arm64@0.13.2':
12342+ '@effect/tsgo-darwin-arm64@0.41.0':
1226412343 optional: true
1226512344
12266− '@effect/tsgo-darwin-x64@0.13.2':
12345+ '@effect/tsgo-darwin-x64@0.41.0':
1226712346 optional: true
1226812347
12269− '@effect/tsgo-linux-arm64@0.13.2':
12348+ '@effect/tsgo-linux-arm64@0.41.0':
1227012349 optional: true
1227112350
12272− '@effect/tsgo-linux-arm@0.13.2':
12351+ '@effect/tsgo-linux-arm@0.41.0':
1227312352 optional: true
1227412353
12275− '@effect/tsgo-linux-x64@0.13.2':
12354+ '@effect/tsgo-linux-x64@0.41.0':
1227612355 optional: true
1227712356
12278− '@effect/tsgo-win32-arm64@0.13.2':
12357+ '@effect/tsgo-win32-arm64@0.41.0':
1227912358 optional: true
1228012359
12281− '@effect/tsgo-win32-x64@0.13.2':
12360+ '@effect/tsgo-win32-x64@0.41.0':
1228212361 optional: true
1228312362
12284− '@effect/tsgo@0.13.2':
12363+ '@effect/tsgo@0.41.0':
1228512364 optionalDependencies:
12286− '@effect/tsgo-darwin-arm64': 0.13.2
12287− '@effect/tsgo-darwin-x64': 0.13.2
12288− '@effect/tsgo-linux-arm': 0.13.2
12289− '@effect/tsgo-linux-arm64': 0.13.2
12290− '@effect/tsgo-linux-x64': 0.13.2
12291− '@effect/tsgo-win32-arm64': 0.13.2
12292− '@effect/tsgo-win32-x64': 0.13.2
12365+ '@effect/tsgo-darwin-arm64': 0.41.0
12366+ '@effect/tsgo-darwin-x64': 0.41.0
12367+ '@effect/tsgo-linux-arm': 0.41.0
12368+ '@effect/tsgo-linux-arm64': 0.41.0
12369+ '@effect/tsgo-linux-x64': 0.41.0
12370+ '@effect/tsgo-win32-arm64': 0.41.0
12371+ '@effect/tsgo-win32-x64': 0.41.0
1229312372
1229412373 '@effect/vitest@4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))':
1229512374 dependencies:
@@ -12632,25 +12711,25 @@ snapshots: · 336 unmodified lines
1263212711
1263312712 '@expo-google-fonts/material-symbols@0.4.38': {}
1263412713
12635− '@expo/cli@57.0.20(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.14)(bufferutil@4.1.0)(expo-constants@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(expo@57.0.18)(react-dom@19.2.3(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)':
12714+ '@expo/cli@57.0.20(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.14)(bufferutil@4.1.0)(expo-constants@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(expo@57.0.18)(react-dom@19.2.3(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2)(utf-8-validate@6.0.6)':
1263612715 dependencies:
1263712716 '@expo/code-signing-certificates': 0.0.6
12638− '@expo/config': 57.0.9(typescript@6.0.3)
12639− '@expo/config-plugins': 57.0.9(typescript@6.0.3)
12717+ '@expo/config': 57.0.9(typescript@7.0.2)
12718+ '@expo/config-plugins': 57.0.9(typescript@7.0.2)
1264012719 '@expo/devcert': 1.2.1
1264112720 '@expo/env': 2.4.3
12642− '@expo/image-utils': 0.11.5(typescript@6.0.3)
12643− '@expo/inline-modules': 0.1.7(typescript@6.0.3)
12721+ '@expo/image-utils': 0.11.5(typescript@7.0.2)
12722+ '@expo/inline-modules': 0.1.7(typescript@7.0.2)
1264412723 '@expo/json-file': 11.0.1
1264512724 '@expo/log-box': 57.0.4(@expo/dom-webview@57.0.1)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
1264612725 '@expo/metro': 56.0.2(bufferutil@4.1.0)(utf-8-validate@6.0.6)
12647− '@expo/metro-config': 57.0.12(patch_hash=96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2)(bufferutil@4.1.0)(expo@57.0.18)(typescript@6.0.3)(utf-8-validate@6.0.6)
12726+ '@expo/metro-config': 57.0.12(patch_hash=96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2)(bufferutil@4.1.0)(expo@57.0.18)(typescript@7.0.2)(utf-8-validate@6.0.6)
1264812727 '@expo/metro-file-map': 57.0.2
1264912728 '@expo/osascript': 2.7.1
1265012729 '@expo/package-manager': 1.13.1
1265112730 '@expo/plist': 0.8.1
12652− '@expo/prebuild-config': 57.0.15(typescript@6.0.3)
12653− '@expo/require-utils': 57.0.5(typescript@6.0.3)
12731+ '@expo/prebuild-config': 57.0.15(typescript@7.0.2)
12732+ '@expo/require-utils': 57.0.5(typescript@7.0.2)
1265412733 '@expo/router-server': 57.0.8(@expo/metro-runtime@57.0.14)(expo-constants@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(expo-server@57.0.3)(expo@57.0.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
1265512734 '@expo/schema-utils': 57.0.2
1265612735 '@expo/spawn-async': 1.8.0
@@ -12668,7 +12747,7 @@ snapshots: · 11 unmodified lines
1266812747 connect: 3.7.0
1266912748 debug: 4.4.3
1267012749 dnssd-advertise: 1.1.4
12671− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
12750+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1267212751 expo-server: 57.0.3
1267312752 fetch-nodeshim: 0.4.10
1267412753 getenv: 2.0.0
@@ -12709,25 +12788,25 @@ snapshots: · 34 unmodified lines
1270912788 - typescript
1271012789 - utf-8-validate
1271112790
12712− '@expo/cli@57.0.20(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.14)(bufferutil@4.1.0)(expo-constants@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)))(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(expo@57.0.18)(react-dom@19.2.6(react@19.2.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)(typescript@6.0.3)(utf-8-validate@6.0.6)':
12791+ '@expo/cli@57.0.20(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.14)(bufferutil@4.1.0)(expo-constants@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)))(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(expo@57.0.18)(react-dom@19.2.6(react@19.2.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)(typescript@7.0.2)(utf-8-validate@6.0.6)':
1271312792 dependencies:
1271412793 '@expo/code-signing-certificates': 0.0.6
12715− '@expo/config': 57.0.9(typescript@6.0.3)
12716− '@expo/config-plugins': 57.0.9(typescript@6.0.3)
12794+ '@expo/config': 57.0.9(typescript@7.0.2)
12795+ '@expo/config-plugins': 57.0.9(typescript@7.0.2)
1271712796 '@expo/devcert': 1.2.1
1271812797 '@expo/env': 2.4.3
12719− '@expo/image-utils': 0.11.5(typescript@6.0.3)
12720− '@expo/inline-modules': 0.1.7(typescript@6.0.3)
12798+ '@expo/image-utils': 0.11.5(typescript@7.0.2)
12799+ '@expo/inline-modules': 0.1.7(typescript@7.0.2)
1272112800 '@expo/json-file': 11.0.1
1272212801 '@expo/log-box': 57.0.4(@expo/dom-webview@57.0.1)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
1272312802 '@expo/metro': 56.0.2(bufferutil@4.1.0)(utf-8-validate@6.0.6)
12724− '@expo/metro-config': 57.0.12(patch_hash=96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2)(bufferutil@4.1.0)(expo@57.0.18)(typescript@6.0.3)(utf-8-validate@6.0.6)
12803+ '@expo/metro-config': 57.0.12(patch_hash=96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2)(bufferutil@4.1.0)(expo@57.0.18)(typescript@7.0.2)(utf-8-validate@6.0.6)
1272512804 '@expo/metro-file-map': 57.0.2
1272612805 '@expo/osascript': 2.7.1
1272712806 '@expo/package-manager': 1.13.1
1272812807 '@expo/plist': 0.8.1
12729− '@expo/prebuild-config': 57.0.15(typescript@6.0.3)
12730− '@expo/require-utils': 57.0.5(typescript@6.0.3)
12808+ '@expo/prebuild-config': 57.0.15(typescript@7.0.2)
12809+ '@expo/require-utils': 57.0.5(typescript@7.0.2)
1273112810 '@expo/router-server': 57.0.8(@expo/metro-runtime@57.0.14)(expo-constants@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)))(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(expo-server@57.0.3)(expo@57.0.18)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
1273212811 '@expo/schema-utils': 57.0.2
1273312812 '@expo/spawn-async': 1.8.0
@@ -12745,7 +12824,7 @@ snapshots: · 11 unmodified lines
1274512824 connect: 3.7.0
1274612825 debug: 4.4.3
1274712826 dnssd-advertise: 1.1.4
12748− expo: 57.0.18(ecb3896f1dbe5154a21ddc585503f306)
12827+ expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb)
1274912828 expo-server: 57.0.3
1275012829 fetch-nodeshim: 0.4.10
1275112830 getenv: 2.0.0
@@ -12791,12 +12870,12 @@ snapshots: · 39 unmodified lines
1279112870 dependencies:
1279212871 node-forge: 1.4.0
1279312872
12794− '@expo/config-plugins@57.0.9(typescript@6.0.3)':
12873+ '@expo/config-plugins@57.0.9(typescript@7.0.2)':
1279512874 dependencies:
1279612875 '@expo/config-types': 57.0.2
1279712876 '@expo/json-file': 11.0.1
1279812877 '@expo/plist': 0.8.1
12799− '@expo/require-utils': 57.0.5(typescript@6.0.3)
12878+ '@expo/require-utils': 57.0.5(typescript@7.0.2)
1280012879 '@expo/sdk-runtime-versions': 1.0.0
1280112880 chalk: 4.1.2
1280212881 debug: 4.4.3
@@ -12812,12 +12891,12 @@ snapshots: · 9 unmodified lines
1281212891
1281312892 '@expo/config-types@57.0.2': {}
1281412893
12815− '@expo/config@57.0.9(typescript@6.0.3)':
12894+ '@expo/config@57.0.9(typescript@7.0.2)':
1281612895 dependencies:
12817− '@expo/config-plugins': 57.0.9(typescript@6.0.3)
12896+ '@expo/config-plugins': 57.0.9(typescript@7.0.2)
1281812897 '@expo/config-types': 57.0.2
1281912898 '@expo/json-file': 11.0.1
12820− '@expo/require-utils': 57.0.5(typescript@6.0.3)
12899+ '@expo/require-utils': 57.0.5(typescript@7.0.2)
1282112900 deepmerge: 4.3.1
1282212901 getenv: 2.0.0
1282312902 glob: 13.0.6
@@ -12852,13 +12931,13 @@ snapshots: · 28 unmodified lines
1285212931
1285312932 '@expo/dom-webview@57.0.1(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':
1285412933 dependencies:
12855− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
12934+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1285612935 react: 19.2.3
1285712936 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1285812937
1285912938 '@expo/dom-webview@57.0.1(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)':
1286012939 dependencies:
12861− expo: 57.0.18(ecb3896f1dbe5154a21ddc585503f306)
12940+ expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb)
1286212941 react: 19.2.6
1286312942 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
1286412943 optional: true
@@ -12889,9 +12968,9 @@ snapshots: · 24 unmodified lines
1288912968 transitivePeerDependencies:
1289012969 - supports-color
1289112970
12892− '@expo/image-utils@0.11.5(typescript@6.0.3)':
12971+ '@expo/image-utils@0.11.5(typescript@7.0.2)':
1289312972 dependencies:
12894− '@expo/require-utils': 57.0.5(typescript@6.0.3)
12973+ '@expo/require-utils': 57.0.5(typescript@7.0.2)
1289512974 '@expo/spawn-async': 1.8.0
1289612975 chalk: 4.1.2
1289712976 getenv: 2.0.0
@@ -12902,9 +12981,9 @@ snapshots: · 4 unmodified lines
1290212981 - supports-color
1290312982 - typescript
1290412983
12905− '@expo/image-utils@0.8.14(typescript@6.0.3)':
12984+ '@expo/image-utils@0.8.14(typescript@7.0.2)':
1290612985 dependencies:
12907− '@expo/require-utils': 55.0.5(typescript@6.0.3)
12986+ '@expo/require-utils': 55.0.5(typescript@7.0.2)
1290812987 '@expo/spawn-async': 1.8.0
1290912988 chalk: 4.1.2
1291012989 getenv: 2.0.0
@@ -12915,9 +12994,9 @@ snapshots: · 4 unmodified lines
1291512994 - supports-color
1291612995 - typescript
1291712996
12918− '@expo/inline-modules@0.1.7(typescript@6.0.3)':
12997+ '@expo/inline-modules@0.1.7(typescript@7.0.2)':
1291912998 dependencies:
12920− '@expo/config-plugins': 57.0.9(typescript@6.0.3)
12999+ '@expo/config-plugins': 57.0.9(typescript@7.0.2)
1292113000 transitivePeerDependencies:
1292213001 - supports-color
1292313002 - typescript
@@ -12927,9 +13006,9 @@ snapshots: · 3 unmodified lines
1292713006 '@babel/code-frame': 7.29.7
1292813007 json5: 2.2.3
1292913008
12930− '@expo/local-build-cache-provider@57.0.8(typescript@6.0.3)':
13009+ '@expo/local-build-cache-provider@57.0.8(typescript@7.0.2)':
1293113010 dependencies:
12932− '@expo/config': 57.0.9(typescript@6.0.3)
13011+ '@expo/config': 57.0.9(typescript@7.0.2)
1293313012 chalk: 4.1.2
1293413013 transitivePeerDependencies:
1293513014 - supports-color
@@ -12939,7 +13018,7 @@ snapshots: · 3 unmodified lines
1293913018 dependencies:
1294013019 '@expo/dom-webview': 57.0.1(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
1294113020 anser: 1.4.10
12942− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
13021+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1294313022 react: 19.2.3
1294413023 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1294513024 stacktrace-parser: 0.1.11
@@ -12948,22 +13027,22 @@ snapshots: · 2 unmodified lines
1294813027 dependencies:
1294913028 '@expo/dom-webview': 57.0.1(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
1295013029 anser: 1.4.10
12951− expo: 57.0.18(ecb3896f1dbe5154a21ddc585503f306)
13030+ expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb)
1295213031 react: 19.2.6
1295313032 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
1295413033 stacktrace-parser: 0.1.11
1295513034 optional: true
1295613035
12957− '@expo/metro-config@57.0.12(patch_hash=96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2)(bufferutil@4.1.0)(expo@57.0.18)(typescript@6.0.3)(utf-8-validate@6.0.6)':
13036+ '@expo/metro-config@57.0.12(patch_hash=96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2)(bufferutil@4.1.0)(expo@57.0.18)(typescript@7.0.2)(utf-8-validate@6.0.6)':
1295813037 dependencies:
1295913038 '@babel/code-frame': 7.29.7
1296013039 '@babel/core': 7.29.7
1296113040 '@babel/generator': 7.29.7
12962− '@expo/config': 57.0.9(typescript@6.0.3)
13041+ '@expo/config': 57.0.9(typescript@7.0.2)
1296313042 '@expo/env': 2.4.3
1296413043 '@expo/json-file': 11.0.1
1296513044 '@expo/metro': 56.0.2(bufferutil@4.1.0)(utf-8-validate@6.0.6)
12966− '@expo/require-utils': 57.0.5(typescript@6.0.3)
13045+ '@expo/require-utils': 57.0.5(typescript@7.0.2)
1296713046 '@expo/spawn-async': 1.8.0
1296813047 '@jridgewell/gen-mapping': 0.3.13
1296913048 '@jridgewell/remapping': 2.3.5
@@ -12980,7 +13059,7 @@ snapshots: · 10 unmodified lines
1298013059 postcss: 8.5.15
1298113060 resolve-from: 5.0.0
1298213061 optionalDependencies:
12983− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
13062+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1298413063 transitivePeerDependencies:
1298513064 - bufferutil
1298613065 - supports-color
@@ -13002,7 +13081,7 @@ snapshots: · 15 unmodified lines
1300213081 dependencies:
1300313082 '@expo/log-box': 57.0.4(@expo/dom-webview@57.0.1)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
1300413083 anser: 1.4.10
13005− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
13084+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1300613085 pretty-format: 29.7.0
1300713086 react: 19.2.3
1300813087 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
@@ -13015,7 +13094,7 @@ snapshots: · 6 unmodified lines
1301513094 dependencies:
1301613095 '@expo/log-box': 57.0.4(@expo/dom-webview@57.0.1)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
1301713096 anser: 1.4.10
13018− expo: 57.0.18(ecb3896f1dbe5154a21ddc585503f306)
13097+ expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb)
1301913098 pretty-format: 29.7.0
1302013099 react: 19.2.6
1302113100 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
@@ -13065,46 +13144,46 @@ snapshots: · 43 unmodified lines
1306513144 base64-js: 1.5.1
1306613145 xmlbuilder: 15.1.1
1306713146
13068− '@expo/prebuild-config@57.0.15(typescript@6.0.3)':
13147+ '@expo/prebuild-config@57.0.15(typescript@7.0.2)':
1306913148 dependencies:
13070− '@expo/config': 57.0.9(typescript@6.0.3)
13071− '@expo/config-plugins': 57.0.9(typescript@6.0.3)
13149+ '@expo/config': 57.0.9(typescript@7.0.2)
13150+ '@expo/config-plugins': 57.0.9(typescript@7.0.2)
1307213151 '@expo/config-types': 57.0.2
13073− '@expo/image-utils': 0.11.5(typescript@6.0.3)
13152+ '@expo/image-utils': 0.11.5(typescript@7.0.2)
1307413153 '@expo/json-file': 11.0.1
1307513154 '@react-native/normalize-colors': 0.86.3
1307613155 debug: 4.4.3
13077− expo-modules-autolinking: 57.0.12(typescript@6.0.3)
13156+ expo-modules-autolinking: 57.0.12(typescript@7.0.2)
1307813157 resolve-from: 5.0.0
1307913158 semver: 7.8.5
1308013159 transitivePeerDependencies:
1308113160 - supports-color
1308213161 - typescript
1308313162
13084− '@expo/require-utils@55.0.5(typescript@6.0.3)':
13163+ '@expo/require-utils@55.0.5(typescript@7.0.2)':
1308513164 dependencies:
1308613165 '@babel/code-frame': 7.29.7
1308713166 '@babel/core': 7.29.7
1308813167 '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7)
1308913168 optionalDependencies:
13090− typescript: 6.0.3
13169+ typescript: 7.0.2
1309113170 transitivePeerDependencies:
1309213171 - supports-color
1309313172
13094− '@expo/require-utils@57.0.5(typescript@6.0.3)':
13173+ '@expo/require-utils@57.0.5(typescript@7.0.2)':
1309513174 dependencies:
1309613175 '@babel/code-frame': 7.29.7
1309713176 '@babel/core': 7.29.7
1309813177 '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7)
1309913178 optionalDependencies:
13100− typescript: 6.0.3
13179+ typescript: 7.0.2
1310113180 transitivePeerDependencies:
1310213181 - supports-color
1310313182
1310413183 '@expo/router-server@57.0.8(@expo/metro-runtime@57.0.14)(expo-constants@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(expo-server@57.0.3)(expo@57.0.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
1310513184 dependencies:
1310613185 debug: 4.4.3
13107− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
13186+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1310813187 expo-constants: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
1310913188 expo-font: 57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
1311013189 expo-server: 57.0.3
@@ -13118,7 +13197,7 @@ snapshots: · 7 unmodified lines
1311813197 '@expo/router-server@57.0.8(@expo/metro-runtime@57.0.14)(expo-constants@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)))(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(expo-server@57.0.3)(expo@57.0.18)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
1311913198 dependencies:
1312013199 debug: 4.4.3
13121− expo: 57.0.18(ecb3896f1dbe5154a21ddc585503f306)
13200+ expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb)
1312213201 expo-constants: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))
1312313202 expo-font: 57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
1312413203 expo-server: 57.0.3
@@ -13142,7 +13221,7 @@ snapshots: · 17 unmodified lines
1314213221
1314313222 '@expo/ui@57.0.14(@babel/core@7.29.7)(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(expo@57.0.18)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':
1314413223 dependencies:
13145− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
13224+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1314613225 react: 19.2.3
1314713226 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1314813227 sf-symbols-typescript: 2.2.0
@@ -14575,9 +14654,9 @@ snapshots: · 1426 unmodified lines
1457514654 '@types/react': 19.2.16
1457614655 optional: true
1457714656
14578− '@react-navigation/core@7.21.2(react@19.2.3)':
14657+ '@react-navigation/core@7.21.13(react@19.2.3)':
1457914658 dependencies:
14580− '@react-navigation/routers': 7.6.0
14659+ '@react-navigation/routers': 7.6.4
1458114660 escape-string-regexp: 4.0.0
1458214661 fast-deep-equal: 3.1.3
1458314662 nanoid: 3.3.12
@@ -14615,7 +14694,7 @@ snapshots: · 31 unmodified lines
1461514694
1461614695 '@react-navigation/native@7.3.4(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':
1461714696 dependencies:
14618− '@react-navigation/core': 7.21.2(react@19.2.3)
14697+ '@react-navigation/core': 7.21.13(react@19.2.3)
1461914698 escape-string-regexp: 4.0.0
1462014699 fast-deep-equal: 3.1.3
1462114700 nanoid: 3.3.12
@@ -14624,7 +14703,7 @@ snapshots: · 2 unmodified lines
1462414703 standard-navigation: 0.0.7
1462514704 use-latest-callback: 0.2.6(react@19.2.3)
1462614705
14627− '@react-navigation/routers@7.6.0':
14706+ '@react-navigation/routers@7.6.4':
1462814707 dependencies:
1462914708 nanoid: 3.3.12
1463014709
@@ -14726,7 +14805,7 @@ snapshots: · 95 unmodified lines
1472614805 '@rolldown/binding-win32-x64-msvc@1.1.5':
1472714806 optional: true
1472814807
14729− '@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.29.7)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.1.5)':
14808+ '@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.29.7)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.1.5)':
1473014809 dependencies:
1473114810 '@babel/core': 7.29.7
1473214811 picomatch: 4.0.4
@@ -14734,7 +14813,7 @@ snapshots: · 1 unmodified line
1473414813 optionalDependencies:
1473514814 '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7)
1473614815 '@babel/runtime': 7.29.7
14737− vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)'
14816+ vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)'
1473814817
1473914818 '@rolldown/pluginutils@1.0.0-rc.17':
1474014819 optional: true
@@ -14960,12 +15039,12 @@ snapshots: · 219 unmodified lines
1496015039 dependencies:
1496115040 defer-to-connect: 2.0.1
1496215041
14963− '@t3tools/mobile-markdown-text@file:apps/mobile/modules/t3-markdown-text(eb96cd030e772ab91fe21f812240338a)':
15042+ '@t3tools/mobile-markdown-text@file:apps/mobile/modules/t3-markdown-text(6f0a94b6f541bbd4be3f343e27991996)':
1496415043 dependencies:
1496515044 '@t3tools/client-runtime': link:packages/client-runtime
1496615045 '@t3tools/shared': link:packages/shared
14967− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
14968− expo-asset: 57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)
15046+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
15047+ expo-asset: 57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2)
1496915048 expo-clipboard: 57.0.1(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
1497015049 expo-haptics: 57.0.2(expo@57.0.18)
1497115050 expo-symbols: 57.0.2(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
@@ -15046,12 +15125,12 @@ snapshots: · 74 unmodified lines
1504615125 '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3
1504715126 '@tailwindcss/oxide-win32-x64-msvc': 4.3.3
1504815127
15049− '@tailwindcss/vite@4.3.3(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))':
15128+ '@tailwindcss/vite@4.3.3(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))':
1505015129 dependencies:
1505115130 '@tailwindcss/node': 4.3.3
1505215131 '@tailwindcss/oxide': 4.3.3
1505315132 tailwindcss: 4.3.3
15054− vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)'
15133+ vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)'
1505515134
1505615135 '@tanstack/devtools-event-client@0.4.3': {}
1505715136
@@ -15114,7 +15193,7 @@ snapshots: · 56 unmodified lines
1511415193 transitivePeerDependencies:
1511515194 - supports-color
1511615195
15117− '@tanstack/router-plugin@1.168.13(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))':
15196+ '@tanstack/router-plugin@1.168.13(@tanstack/react-router@1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))':
1511815197 dependencies:
1511915198 '@babel/core': 7.29.7
1512015199 '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7)
@@ -15131,7 +15210,7 @@ snapshots: · 10 unmodified lines
1513115210 zod: 4.4.3
1513215211 optionalDependencies:
1513315212 '@tanstack/react-router': 1.170.10(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
15134− vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)'
15213+ vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)'
1513515214 transitivePeerDependencies:
1513615215 - supports-color
1513715216
@@ -15363,36 +15442,65 @@ snapshots: · 225 unmodified lines
1536315442 dependencies:
1536415443 '@types/node': 24.12.4
1536515444
15366− '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260604.1':
15445+ '@typescript/typescript-aix-ppc64@7.0.2':
1536715446 optional: true
1536815447
15369− '@typescript/native-preview-darwin-x64@7.0.0-dev.20260604.1':
15448+ '@typescript/typescript-darwin-arm64@7.0.2':
1537015449 optional: true
1537115450
15372− '@typescript/native-preview-linux-arm64@7.0.0-dev.20260604.1':
15451+ '@typescript/typescript-darwin-x64@7.0.2':
1537315452 optional: true
1537415453
15375− '@typescript/native-preview-linux-arm@7.0.0-dev.20260604.1':
15454+ '@typescript/typescript-freebsd-arm64@7.0.2':
1537615455 optional: true
1537715456
15378− '@typescript/native-preview-linux-x64@7.0.0-dev.20260604.1':
15457+ '@typescript/typescript-freebsd-x64@7.0.2':
1537915458 optional: true
1538015459
15381− '@typescript/native-preview-win32-arm64@7.0.0-dev.20260604.1':
15460+ '@typescript/typescript-linux-arm64@7.0.2':
1538215461 optional: true
1538315462
15384− '@typescript/native-preview-win32-x64@7.0.0-dev.20260604.1':
15463+ '@typescript/typescript-linux-arm@7.0.2':
1538515464 optional: true
1538615465
15387− '@typescript/native-preview@7.0.0-dev.20260604.1':
15388− optionalDependencies:
15389− '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260604.1
15390− '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260604.1
15391− '@typescript/native-preview-linux-arm': 7.0.0-dev.20260604.1
15392− '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260604.1
15393− '@typescript/native-preview-linux-x64': 7.0.0-dev.20260604.1
15394− '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260604.1
15395− '@typescript/native-preview-win32-x64': 7.0.0-dev.20260604.1
15466+ '@typescript/typescript-linux-loong64@7.0.2':
15467+ optional: true
15468+
15469+ '@typescript/typescript-linux-mips64el@7.0.2':
15470+ optional: true
15471+
15472+ '@typescript/typescript-linux-ppc64@7.0.2':
15473+ optional: true
15474+
15475+ '@typescript/typescript-linux-riscv64@7.0.2':
15476+ optional: true
15477+
15478+ '@typescript/typescript-linux-s390x@7.0.2':
15479+ optional: true
15480+
15481+ '@typescript/typescript-linux-x64@7.0.2':
15482+ optional: true
15483+
15484+ '@typescript/typescript-netbsd-arm64@7.0.2':
15485+ optional: true
15486+
15487+ '@typescript/typescript-netbsd-x64@7.0.2':
15488+ optional: true
15489+
15490+ '@typescript/typescript-openbsd-arm64@7.0.2':
15491+ optional: true
15492+
15493+ '@typescript/typescript-openbsd-x64@7.0.2':
15494+ optional: true
15495+
15496+ '@typescript/typescript-sunos-x64@7.0.2':
15497+ optional: true
15498+
15499+ '@typescript/typescript-win32-arm64@7.0.2':
15500+ optional: true
15501+
15502+ '@typescript/typescript-win32-x64@7.0.2':
15503+ optional: true
1539615504
1539715505 '@ungap/structured-clone@1.3.1': {}
1539815506
@@ -15409,36 +15517,36 @@ snapshots: · 10 unmodified lines
1540915517 optionalDependencies:
1541015518 ajv: 6.15.0
1541115519
15412− '@vitejs/plugin-react@6.0.2(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.29.7)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.1.5))(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(babel-plugin-react-compiler@1.0.0)':
15520+ '@vitejs/plugin-react@6.0.2(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.29.7)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.1.5))(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(babel-plugin-react-compiler@1.0.0)':
1541315521 dependencies:
1541415522 '@rolldown/pluginutils': 1.0.1
15415− vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)'
15523+ vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)'
1541615524 optionalDependencies:
15417− '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.29.7)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.1.5)
15525+ '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.29.7)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.1.5)
1541815526 babel-plugin-react-compiler: 1.0.0
1541915527
15420− '@vitest/browser-preview@4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(utf-8-validate@6.0.6)(vitest@4.1.11)':
15528+ '@vitest/browser-preview@4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@4.1.11)':
1542115529 dependencies:
1542215530 '@testing-library/dom': 10.4.1
1542315531 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1)
15424− '@vitest/browser': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(utf-8-validate@6.0.6)(vitest@4.1.11)
15425− vitest: 4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))
15532+ '@vitest/browser': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@4.1.11)
15533+ vitest: 4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))
1542615534 transitivePeerDependencies:
1542715535 - bufferutil
1542815536 - msw
1542915537 - utf-8-validate
1543015538 - vite
1543115539
15432− '@vitest/browser@4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(utf-8-validate@6.0.6)(vitest@4.1.11)':
15540+ '@vitest/browser@4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@4.1.11)':
1543315541 dependencies:
1543415542 '@blazediff/core': 1.9.1
15435− '@vitest/mocker': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))
15543+ '@vitest/mocker': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))
1543615544 '@vitest/utils': 4.1.11
1543715545 magic-string: 0.30.21
1543815546 pngjs: 7.0.0
1543915547 sirv: 3.0.2
1544015548 tinyrainbow: 3.1.0
15441− vitest: 4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))
15549+ vitest: 4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))
1544215550 ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)
1544315551 transitivePeerDependencies:
1544415552 - bufferutil
@@ -15455,14 +15563,14 @@ snapshots: · 10 unmodified lines
1545515563 chai: 6.2.2
1545615564 tinyrainbow: 3.1.0
1545715565
15458− '@vitest/mocker@4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))':
15566+ '@vitest/mocker@4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))':
1545915567 dependencies:
1546015568 '@vitest/spy': 4.1.11
1546115569 estree-walker: 3.0.3
1546215570 magic-string: 0.30.21
1546315571 optionalDependencies:
15464− msw: 2.12.11(@types/node@24.12.4)(typescript@6.0.3)
15465− vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)'
15572+ msw: 2.12.11(@types/node@24.12.4)(typescript@7.0.2)
15573+ vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)'
1546615574
1546715575 '@vitest/pretty-format@4.1.11':
1546815576 dependencies:
@@ -15514,6 +15622,32 @@ snapshots: · 45 unmodified lines
1551415622 unrun: 0.2.39
1551515623 yaml: 2.9.0
1551615624
15625+ '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)':
15626+ dependencies:
15627+ '@oxc-project/runtime': 0.146.0
15628+ '@oxc-project/types': 0.146.0
15629+ lightningcss: 1.33.0
15630+ postcss: 8.5.15
15631+ yuku-codegen: 0.5.48
15632+ yuku-parser: 0.5.48
15633+ optionalDependencies:
15634+ '@types/node': 24.12.4
15635+ '@voidzero-dev/vite-plus-darwin-arm64': 0.3.0
15636+ '@voidzero-dev/vite-plus-darwin-x64': 0.3.0
15637+ '@voidzero-dev/vite-plus-linux-arm64-gnu': 0.3.0
15638+ '@voidzero-dev/vite-plus-linux-arm64-musl': 0.3.0
15639+ '@voidzero-dev/vite-plus-linux-x64-gnu': 0.3.0
15640+ '@voidzero-dev/vite-plus-linux-x64-musl': 0.3.0
15641+ '@voidzero-dev/vite-plus-win32-arm64-msvc': 0.3.0
15642+ '@voidzero-dev/vite-plus-win32-x64-msvc': 0.3.0
15643+ esbuild: 0.28.1
15644+ fsevents: 2.3.3
15645+ jiti: 2.7.0
15646+ terser: 5.48.0
15647+ typescript: 7.0.2
15648+ unrun: 0.2.39
15649+ yaml: 2.9.0
15650+
1551715651 '@voidzero-dev/vite-plus-darwin-arm64@0.3.0':
1551815652 optional: true
1551915653
@@ -15762,7 +15896,7 @@ snapshots: · 242 unmodified lines
1576215896 json-schema-traverse: 1.0.0
1576315897 require-from-string: 2.0.2
1576415898
15765− alchemy@2.0.0-beta.65(db83c2a4e1e233e8661745115951ce85):
15899+ alchemy@2.0.0-beta.65(5a5e74348f57625dac72981db7114e79):
1576615900 dependencies:
1576715901 '@alchemy.run/node-utils': 0.0.5
1576815902 '@aws-sdk/credential-providers': 3.1062.0
@@ -15770,9 +15904,9 @@ snapshots: · 1 unmodified line
1577015904 '@distilled.cloud/aws': 0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))
1577115905 '@distilled.cloud/axiom': 0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))
1577215906 '@distilled.cloud/cloudflare': 0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))
15773− '@distilled.cloud/cloudflare-rolldown-plugin': 0.13.10(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.1.5)(workerd@1.20260704.1)
15907+ '@distilled.cloud/cloudflare-rolldown-plugin': 0.13.10(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.1.5)(workerd@1.20260704.1)
1577415908 '@distilled.cloud/cloudflare-runtime': 0.13.10(@distilled.cloud/cloudflare@0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)))(@effect/platform-bun@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(utf-8-validate@6.0.6))(@effect/platform-node@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))
15775− '@distilled.cloud/cloudflare-vite-plugin': 0.13.10(86e3ed6000e5955518fd9c0dea8322a9)
15909+ '@distilled.cloud/cloudflare-vite-plugin': 0.13.10(414e2eac4e6e313aabea4c365b0972ba)
1577615910 '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))
1577715911 '@distilled.cloud/neon': 0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))
1577815912 '@distilled.cloud/planetscale': 0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))
@@ -15808,7 +15942,7 @@ snapshots: · 29 unmodified lines
1580815942 '@effect/sql-pg': 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))
1580915943 drizzle-kit: 1.0.0-rc.4
1581015944 drizzle-orm: 1.0.0-rc.4(@cloudflare/workers-types@4.20260604.1)(@effect/sql-d1@4.0.0-beta.101(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)))(@effect/sql-pg@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)))(@effect/sql-sqlite-bun@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)))(@libsql/client@0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))(bun-types@1.3.14)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(expo-sqlite@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(zod@4.4.3)
15811− vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)'
15945+ vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)'
1581215946 ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)
1581315947 transitivePeerDependencies:
1581415948 - '@mongodb-js/zstd'
@@ -16166,7 +16300,7 @@ snapshots: · 351 unmodified lines
1616616300 react-refresh: 0.14.2
1616716301 optionalDependencies:
1616816302 '@babel/runtime': 7.29.7
16169− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
16303+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1617016304 expo-widgets: 57.0.15(@babel/core@7.29.7)(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(expo@57.0.18)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
1617116305 transitivePeerDependencies:
1617216306 - '@babel/core'
@@ -17078,12 +17212,12 @@ snapshots: · 905 unmodified lines
1707817212
1707917213 expo-application@57.0.2(expo@57.0.18):
1708017214 dependencies:
17081− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17215+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1708217216
17083− expo-asset@57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3):
17217+ expo-asset@57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2):
1708417218 dependencies:
17085− '@expo/image-utils': 0.11.5(typescript@6.0.3)
17086− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17219+ '@expo/image-utils': 0.11.5(typescript@7.0.2)
17220+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1708717221 expo-constants: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
1708817222 react: 19.2.3
1708917223 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
@@ -17091,10 +17225,10 @@ snapshots: · 1 unmodified line
1709117225 - supports-color
1709217226 - typescript
1709317227
17094− expo-asset@57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)(typescript@6.0.3):
17228+ expo-asset@57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)(typescript@7.0.2):
1709517229 dependencies:
17096− '@expo/image-utils': 0.11.5(typescript@6.0.3)
17097− expo: 57.0.18(ecb3896f1dbe5154a21ddc585503f306)
17230+ '@expo/image-utils': 0.11.5(typescript@7.0.2)
17231+ expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb)
1709817232 expo-constants: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))
1709917233 react: 19.2.6
1710017234 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
@@ -17103,10 +17237,10 @@ snapshots: · 2 unmodified lines
1710317237 - typescript
1710417238 optional: true
1710517239
17106− expo-audio@57.0.4(patch_hash=fa9a3e0442ed395d4071bb406e08c3a471c9a84700bdfa0b9ad7ff144c96041a)(expo-asset@57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3))(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
17240+ expo-audio@57.0.4(patch_hash=fa9a3e0442ed395d4071bb406e08c3a471c9a84700bdfa0b9ad7ff144c96041a)(expo-asset@57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2))(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
1710717241 dependencies:
17108− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17109− expo-asset: 57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)
17242+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
17243+ expo-asset: 57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2)
1711017244 react: 19.2.3
1711117245 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1711217246
@@ -17126,21 +17260,21 @@ snapshots: · 13 unmodified lines
1712617260
1712717261 expo-blur@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
1712817262 dependencies:
17129− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17263+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1713017264 react: 19.2.3
1713117265 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1713217266
1713317267 expo-build-properties@57.0.15(expo@57.0.18):
1713417268 dependencies:
1713517269 '@expo/schema-utils': 57.0.2
17136− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17270+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1713717271 resolve-from: 5.0.0
1713817272 semver: 7.8.5
1713917273
1714017274 expo-camera@57.0.4(@types/emscripten@1.41.5)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
1714117275 dependencies:
1714217276 barcode-detector: 3.2.0(@types/emscripten@1.41.5)
17143− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17277+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1714417278 react: 19.2.3
1714517279 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1714617280 transitivePeerDependencies:
@@ -17148,14 +17282,14 @@ snapshots: · 1 unmodified line
1714817282
1714917283 expo-clipboard@57.0.1(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
1715017284 dependencies:
17151− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17285+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1715217286 react: 19.2.3
1715317287 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1715417288
1715517289 expo-constants@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):
1715617290 dependencies:
1715717291 '@expo/env': 2.4.3
17158− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17292+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1715917293 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1716017294 transitivePeerDependencies:
1716117295 - supports-color
@@ -17163,7 +17297,7 @@ snapshots: · 1 unmodified line
1716317297 expo-constants@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)):
1716417298 dependencies:
1716517299 '@expo/env': 2.4.3
17166− expo: 57.0.18(ecb3896f1dbe5154a21ddc585503f306)
17300+ expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb)
1716717301 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
1716817302 transitivePeerDependencies:
1716917303 - supports-color
@@ -17171,11 +17305,11 @@ snapshots: · 1 unmodified line
1717117305
1717217306 expo-crypto@57.0.2(expo@57.0.18):
1717317307 dependencies:
17174− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17308+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1717517309
1717617310 expo-dev-client@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):
1717717311 dependencies:
17178− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17312+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1717917313 expo-dev-launcher: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
1718017314 expo-dev-menu: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
1718117315 expo-dev-menu-interface: 57.0.0(expo@57.0.18)
@@ -17187,53 +17321,53 @@ snapshots: · 5 unmodified lines
1718717321 expo-dev-launcher@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):
1718817322 dependencies:
1718917323 '@expo/schema-utils': 57.0.2
17190− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17324+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1719117325 expo-dev-menu: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
1719217326 expo-manifests: 57.0.1(expo@57.0.18)
1719317327 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1719417328
1719517329 expo-dev-menu-interface@57.0.0(expo@57.0.18):
1719617330 dependencies:
17197− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17331+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1719817332
1719917333 expo-dev-menu@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):
1720017334 dependencies:
17201− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17335+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1720217336 expo-dev-menu-interface: 57.0.0(expo@57.0.18)
1720317337 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1720417338
1720517339 expo-device@57.0.1(expo@57.0.18):
1720617340 dependencies:
17207− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17341+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1720817342 ua-parser-js: 0.7.41
1720917343
1721017344 expo-document-picker@57.0.1(expo@57.0.18):
1721117345 dependencies:
17212− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17346+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1721317347
1721417348 expo-eas-client@57.0.2: {}
1721517349
1721617350 expo-file-system@57.0.6(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):
1721717351 dependencies:
17218− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17352+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1721917353 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1722017354
1722117355 expo-file-system@57.0.6(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)):
1722217356 dependencies:
17223− expo: 57.0.18(ecb3896f1dbe5154a21ddc585503f306)
17357+ expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb)
1722417358 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
1722517359 optional: true
1722617360
1722717361 expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
1722817362 dependencies:
17229− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17363+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1723017364 fontfaceobserver: 2.3.0
1723117365 react: 19.2.3
1723217366 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1723317367
1723417368 expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6):
1723517369 dependencies:
17236− expo: 57.0.18(ecb3896f1dbe5154a21ddc585503f306)
17370+ expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb)
1723717371 fontfaceobserver: 2.3.0
1723817372 react: 19.2.6
1723917373 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
@@ -17241,26 +17375,26 @@ snapshots: · 1 unmodified line
1724117375
1724217376 expo-glass-effect@57.0.1(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
1724317377 dependencies:
17244− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17378+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1724517379 react: 19.2.3
1724617380 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1724717381
1724817382 expo-haptics@57.0.2(expo@57.0.18):
1724917383 dependencies:
17250− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17384+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1725117385
1725217386 expo-image-loader@57.0.1(expo@57.0.18):
1725317387 dependencies:
17254− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17388+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1725517389
1725617390 expo-image-picker@57.0.14(expo@57.0.18):
1725717391 dependencies:
17258− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17392+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1725917393 expo-image-loader: 57.0.1(expo@57.0.18)
1726017394
1726117395 expo-image@57.0.3(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
1726217396 dependencies:
17263− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17397+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1726417398 react: 19.2.3
1726517399 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1726617400 sf-symbols-typescript: 2.2.0
@@ -17269,12 +17403,12 @@ snapshots: · 2 unmodified lines
1726917403
1727017404 expo-keep-awake@57.0.1(expo@57.0.18)(react@19.2.3):
1727117405 dependencies:
17272− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17406+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1727317407 react: 19.2.3
1727417408
1727517409 expo-keep-awake@57.0.1(expo@57.0.18)(react@19.2.6):
1727617410 dependencies:
17277− expo: 57.0.18(ecb3896f1dbe5154a21ddc585503f306)
17411+ expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb)
1727817412 react: 19.2.6
1727917413 optional: true
1728017414
@@ -17290,12 +17424,12 @@ snapshots: · 9 unmodified lines
1729017424
1729117425 expo-manifests@57.0.1(expo@57.0.18):
1729217426 dependencies:
17293− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17427+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1729417428 expo-json-utils: 57.0.1
1729517429
17296− expo-modules-autolinking@57.0.12(typescript@6.0.3):
17430+ expo-modules-autolinking@57.0.12(typescript@7.0.2):
1729717431 dependencies:
17298− '@expo/require-utils': 57.0.5(typescript@6.0.3)
17432+ '@expo/require-utils': 57.0.5(typescript@7.0.2)
1729917433 '@expo/spawn-async': 1.8.0
1730017434 chalk: 4.1.2
1730117435 commander: 7.2.0
@@ -17335,15 +17469,15 @@ snapshots: · 33 unmodified lines
1733517469
1733617470 expo-network@57.0.1(expo@57.0.18)(react@19.2.3):
1733717471 dependencies:
17338− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17472+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1733917473 react: 19.2.3
1734017474
17341− expo-notifications@57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3):
17475+ expo-notifications@57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2):
1734217476 dependencies:
17343− '@expo/image-utils': 0.11.5(typescript@6.0.3)
17477+ '@expo/image-utils': 0.11.5(typescript@7.0.2)
1734417478 abort-controller: 3.0.0
1734517479 badgin: 1.2.3
17346− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17480+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1734717481 expo-application: 57.0.2(expo@57.0.18)
1734817482 expo-constants: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
1734917483 react: 19.2.3
@@ -17354,14 +17488,14 @@ snapshots: · 4 unmodified lines
1735417488
1735517489 expo-paste-input@0.1.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
1735617490 dependencies:
17357− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17491+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1735817492 react: 19.2.3
1735917493 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1736017494
17361− expo-quick-actions@6.0.2(expo@57.0.18)(typescript@6.0.3):
17495+ expo-quick-actions@6.0.2(expo@57.0.18)(typescript@7.0.2):
1736217496 dependencies:
17363− '@expo/image-utils': 0.8.14(typescript@6.0.3)
17364− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17497+ '@expo/image-utils': 0.8.14(typescript@7.0.2)
17498+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1736517499 schema-utils: 4.3.3
1736617500 sf-symbols-typescript: 2.2.0
1736717501 transitivePeerDependencies:
@@ -17370,27 +17504,27 @@ snapshots: · 2 unmodified lines
1737017504
1737117505 expo-secure-store@57.0.2(expo@57.0.18):
1737217506 dependencies:
17373− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17507+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1737417508
1737517509 expo-server@57.0.3: {}
1737617510
17377− expo-sharing@57.0.17(patch_hash=8d2e3b10eb3f52036a9a086800180ec6cebf3b75bccc5b1775117a7244d4ac45)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3):
17511+ expo-sharing@57.0.17(patch_hash=8d2e3b10eb3f52036a9a086800180ec6cebf3b75bccc5b1775117a7244d4ac45)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2):
1737817512 dependencies:
17379− '@expo/config-plugins': 57.0.9(typescript@6.0.3)
17513+ '@expo/config-plugins': 57.0.9(typescript@7.0.2)
1738017514 '@expo/config-types': 57.0.2
1738117515 '@expo/plist': 0.8.1
17382− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17516+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1738317517 react: 19.2.3
1738417518 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1738517519 transitivePeerDependencies:
1738617520 - supports-color
1738717521 - typescript
1738817522
17389− expo-splash-screen@57.0.8(expo@57.0.18)(typescript@6.0.3):
17523+ expo-splash-screen@57.0.8(expo@57.0.18)(typescript@7.0.2):
1739017524 dependencies:
17391− '@expo/config-plugins': 57.0.9(typescript@6.0.3)
17392− '@expo/image-utils': 0.11.5(typescript@6.0.3)
17393− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17525+ '@expo/config-plugins': 57.0.9(typescript@7.0.2)
17526+ '@expo/image-utils': 0.11.5(typescript@7.0.2)
17527+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1739417528 xml2js: 0.6.0
1739517529 transitivePeerDependencies:
1739617530 - supports-color
@@ -17399,14 +17533,14 @@ snapshots: · 2 unmodified lines
1739917533 expo-sqlite@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
1740017534 dependencies:
1740117535 await-lock: 2.2.2
17402− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17536+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1740317537 react: 19.2.3
1740417538 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1740517539
1740617540 expo-sqlite@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6):
1740717541 dependencies:
1740817542 await-lock: 2.2.2
17409− expo: 57.0.18(ecb3896f1dbe5154a21ddc585503f306)
17543+ expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb)
1741017544 react: 19.2.6
1741117545 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
1741217546 optional: true
@@ -17416,7 +17550,7 @@ snapshots: · 3 unmodified lines
1741617550 expo-symbols@57.0.2(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
1741717551 dependencies:
1741817552 '@expo-google-fonts/material-symbols': 0.4.38
17419− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17553+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1742017554 expo-font: 57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
1742117555 react: 19.2.3
1742217556 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
@@ -17424,7 +17558,7 @@ snapshots: · 1 unmodified line
1742417558
1742517559 expo-updates-interface@57.0.1(expo@57.0.18):
1742617560 dependencies:
17427− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17561+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1742817562
1742917563 expo-updates@57.0.19(expo-dev-client@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
1743017564 dependencies:
@@ -17434,7 +17568,7 @@ snapshots: · 3 unmodified lines
1743417568 arg: 4.1.3
1743517569 chalk: 4.1.2
1743617570 debug: 4.4.3
17437− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17571+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1743817572 expo-eas-client: 57.0.2
1743917573 expo-manifests: 57.0.1(expo@57.0.18)
1744017574 expo-structured-headers: 57.0.0
@@ -17453,20 +17587,20 @@ snapshots: · 12 unmodified lines
1745317587
1745417588 expo-video@57.0.3(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
1745517589 dependencies:
17456− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17590+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1745717591 react: 19.2.3
1745817592 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1745917593
1746017594 expo-web-browser@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):
1746117595 dependencies:
17462− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17596+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1746317597 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1746417598
1746517599 expo-widgets@57.0.15(@babel/core@7.29.7)(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(expo@57.0.18)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
1746617600 dependencies:
1746717601 '@expo/plist': 0.8.1
1746817602 '@expo/ui': 57.0.14(@babel/core@7.29.7)(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(expo@57.0.18)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
17469− expo: 57.0.18(f9c992a5d7c53d81398568d3950992dc)
17603+ expo: 57.0.18(fc5a731e35a0144aab60c7305f29cbed)
1747017604 react: 19.2.3
1747117605 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1747217606 transitivePeerDependencies:
@@ -17476,26 +17610,26 @@ snapshots: · 3 unmodified lines
1747617610 - react-dom
1747717611 - react-native-worklets
1747817612
17479− expo@57.0.18(ecb3896f1dbe5154a21ddc585503f306):
17613+ expo@57.0.18(0bf40d5ad6281d8f1e92517b24812edb):
1748017614 dependencies:
1748117615 '@babel/runtime': 7.29.7
17482− '@expo/cli': 57.0.20(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.14)(bufferutil@4.1.0)(expo-constants@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)))(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(expo@57.0.18)(react-dom@19.2.6(react@19.2.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)(typescript@6.0.3)(utf-8-validate@6.0.6)
17483− '@expo/config': 57.0.9(typescript@6.0.3)
17484− '@expo/config-plugins': 57.0.9(typescript@6.0.3)
17616+ '@expo/cli': 57.0.20(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.14)(bufferutil@4.1.0)(expo-constants@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)))(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(expo@57.0.18)(react-dom@19.2.6(react@19.2.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)(typescript@7.0.2)(utf-8-validate@6.0.6)
17617+ '@expo/config': 57.0.9(typescript@7.0.2)
17618+ '@expo/config-plugins': 57.0.9(typescript@7.0.2)
1748517619 '@expo/devtools': 57.0.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
1748617620 '@expo/fingerprint': 0.20.11
17487− '@expo/local-build-cache-provider': 57.0.8(typescript@6.0.3)
17621+ '@expo/local-build-cache-provider': 57.0.8(typescript@7.0.2)
1748817622 '@expo/log-box': 57.0.4(@expo/dom-webview@57.0.1)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
1748917623 '@expo/metro': 56.0.2(bufferutil@4.1.0)(utf-8-validate@6.0.6)
17490− '@expo/metro-config': 57.0.12(patch_hash=96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2)(bufferutil@4.1.0)(expo@57.0.18)(typescript@6.0.3)(utf-8-validate@6.0.6)
17624+ '@expo/metro-config': 57.0.12(patch_hash=96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2)(bufferutil@4.1.0)(expo@57.0.18)(typescript@7.0.2)(utf-8-validate@6.0.6)
1749117625 '@ungap/structured-clone': 1.3.1
1749217626 babel-preset-expo: 57.0.9(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo-widgets@57.0.15)(expo@57.0.18)(react-refresh@0.14.2)
17493− expo-asset: 57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)(typescript@6.0.3)
17627+ expo-asset: 57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)(typescript@7.0.2)
1749417628 expo-constants: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))
1749517629 expo-file-system: 57.0.6(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))
1749617630 expo-font: 57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
1749717631 expo-keep-awake: 57.0.1(expo@57.0.18)(react@19.2.6)
17498− expo-modules-autolinking: 57.0.12(typescript@6.0.3)
17632+ expo-modules-autolinking: 57.0.12(typescript@7.0.2)
1749917633 expo-modules-core: 57.0.14(react-native-worklets@0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
1750017634 pretty-format: 29.7.0
1750117635 react: 19.2.6
@@ -17519,26 +17653,26 @@ snapshots: · 17 unmodified lines
1751917653 - utf-8-validate
1752017654 optional: true
1752117655
17522− expo@57.0.18(f9c992a5d7c53d81398568d3950992dc):
17656+ expo@57.0.18(fc5a731e35a0144aab60c7305f29cbed):
1752317657 dependencies:
1752417658 '@babel/runtime': 7.29.7
17525− '@expo/cli': 57.0.20(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.14)(bufferutil@4.1.0)(expo-constants@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(expo@57.0.18)(react-dom@19.2.3(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
17526− '@expo/config': 57.0.9(typescript@6.0.3)
17527− '@expo/config-plugins': 57.0.9(typescript@6.0.3)
17659+ '@expo/cli': 57.0.20(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.14)(bufferutil@4.1.0)(expo-constants@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(expo@57.0.18)(react-dom@19.2.3(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2)(utf-8-validate@6.0.6)
17660+ '@expo/config': 57.0.9(typescript@7.0.2)
17661+ '@expo/config-plugins': 57.0.9(typescript@7.0.2)
1752817662 '@expo/devtools': 57.0.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
1752917663 '@expo/fingerprint': 0.20.11
17530− '@expo/local-build-cache-provider': 57.0.8(typescript@6.0.3)
17664+ '@expo/local-build-cache-provider': 57.0.8(typescript@7.0.2)
1753117665 '@expo/log-box': 57.0.4(@expo/dom-webview@57.0.1)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
1753217666 '@expo/metro': 56.0.2(bufferutil@4.1.0)(utf-8-validate@6.0.6)
17533− '@expo/metro-config': 57.0.12(patch_hash=96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2)(bufferutil@4.1.0)(expo@57.0.18)(typescript@6.0.3)(utf-8-validate@6.0.6)
17667+ '@expo/metro-config': 57.0.12(patch_hash=96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2)(bufferutil@4.1.0)(expo@57.0.18)(typescript@7.0.2)(utf-8-validate@6.0.6)
1753417668 '@ungap/structured-clone': 1.3.1
1753517669 babel-preset-expo: 57.0.9(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo-widgets@57.0.15)(expo@57.0.18)(react-refresh@0.14.2)
17536− expo-asset: 57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)
17670+ expo-asset: 57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2)
1753717671 expo-constants: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
1753817672 expo-file-system: 57.0.6(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
1753917673 expo-font: 57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
1754017674 expo-keep-awake: 57.0.1(expo@57.0.18)(react@19.2.3)
17541− expo-modules-autolinking: 57.0.12(typescript@6.0.3)
17675+ expo-modules-autolinking: 57.0.12(typescript@7.0.2)
1754217676 expo-modules-core: 57.0.14(react-native-worklets@0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
1754317677 pretty-format: 29.7.0
1754417678 react: 19.2.3
@@ -19474,7 +19608,7 @@ snapshots: · 1929 unmodified lines
1947419608 optionalDependencies:
1947519609 msgpackr-extract: 3.0.4
1947619610
19477− msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3):
19611+ msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2):
1947819612 dependencies:
1947919613 '@inquirer/confirm': 5.1.21(@types/node@24.12.4)
1948019614 '@mswjs/interceptors': 0.41.9
@@ -19495,7 +19629,7 @@ snapshots: · 14 unmodified lines
1949519629 until-async: 3.0.2
1949619630 yargs: 17.7.2
1949719631 optionalDependencies:
19498− typescript: 6.0.3
19632+ typescript: 7.0.2
1949919633 transitivePeerDependencies:
1950019634 - '@types/node'
1950119635 optional: true
@@ -19784,7 +19918,7 @@ snapshots: · 282 unmodified lines
1978419918 '@oxc-resolver/binding-win32-arm64-msvc': 11.24.2
1978519919 '@oxc-resolver/binding-win32-x64-msvc': 11.24.2
1978619920
19787− oxfmt@0.64.0(vite-plus@0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)):
19921+ oxfmt@0.64.0(vite-plus@0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)):
1978819922 dependencies:
1978919923 tinypool: 2.1.0
1979019924 optionalDependencies:
@@ -19807,7 +19941,7 @@ snapshots: · 16 unmodified lines
1980719941 '@oxfmt/binding-win32-arm64-msvc': 0.64.0
1980819942 '@oxfmt/binding-win32-ia32-msvc': 0.64.0
1980919943 '@oxfmt/binding-win32-x64-msvc': 0.64.0
19810− vite-plus: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
19944+ vite-plus: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
1981119945
1981219946 oxlint-tsgolint@7.0.2001:
1981319947 optionalDependencies:
@@ -19818,7 +19952,7 @@ snapshots: · 4 unmodified lines
1981819952 '@oxlint-tsgolint/win32-arm64': 7.0.2001
1981919953 '@oxlint-tsgolint/win32-x64': 7.0.2001
1982019954
19821− oxlint@1.79.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)):
19955+ oxlint@1.79.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)):
1982219956 optionalDependencies:
1982319957 '@oxlint/binding-android-arm-eabi': 1.79.0
1982419958 '@oxlint/binding-android-arm64': 1.79.0
@@ -19840,7 +19974,7 @@ snapshots: · 15 unmodified lines
1984019974 '@oxlint/binding-win32-ia32-msvc': 1.79.0
1984119975 '@oxlint/binding-win32-x64-msvc': 1.79.0
1984219976 oxlint-tsgolint: 7.0.2001
19843− vite-plus: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
19977+ vite-plus: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
1984419978
1984519979 p-cancelable@2.1.1: {}
1984619980
@@ -21453,6 +21587,29 @@ snapshots: · 1606 unmodified lines
2145321587
2145421588 typescript@6.0.3: {}
2145521589
21590+ typescript@7.0.2:
21591+ optionalDependencies:
21592+ '@typescript/typescript-aix-ppc64': 7.0.2
21593+ '@typescript/typescript-darwin-arm64': 7.0.2
21594+ '@typescript/typescript-darwin-x64': 7.0.2
21595+ '@typescript/typescript-freebsd-arm64': 7.0.2
21596+ '@typescript/typescript-freebsd-x64': 7.0.2
21597+ '@typescript/typescript-linux-arm': 7.0.2
21598+ '@typescript/typescript-linux-arm64': 7.0.2
21599+ '@typescript/typescript-linux-loong64': 7.0.2
21600+ '@typescript/typescript-linux-mips64el': 7.0.2
21601+ '@typescript/typescript-linux-ppc64': 7.0.2
21602+ '@typescript/typescript-linux-riscv64': 7.0.2
21603+ '@typescript/typescript-linux-s390x': 7.0.2
21604+ '@typescript/typescript-linux-x64': 7.0.2
21605+ '@typescript/typescript-netbsd-arm64': 7.0.2
21606+ '@typescript/typescript-netbsd-x64': 7.0.2
21607+ '@typescript/typescript-openbsd-arm64': 7.0.2
21608+ '@typescript/typescript-openbsd-x64': 7.0.2
21609+ '@typescript/typescript-sunos-x64': 7.0.2
21610+ '@typescript/typescript-win32-arm64': 7.0.2
21611+ '@typescript/typescript-win32-x64': 7.0.2
21612+
2145621613 ua-parser-js@0.7.41: {}
2145721614
2145821615 ufo@1.6.4: {}
@@ -21554,7 +21711,7 @@ snapshots: · 95 unmodified lines
2155421711
2155521712 universalify@2.0.1: {}
2155621713
21557− uniwind@1.11.0(patch_hash=17d92be2eec71bb6396b402e8d034968e54b28746876d7977cb3139655f42b90)(@expo/metro-config@57.0.12(patch_hash=96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2)(bufferutil@4.1.0)(expo@57.0.18)(typescript@6.0.3)(utf-8-validate@6.0.6))(metro-cache@0.84.5)(metro-transform-worker@0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))(metro@0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(tailwindcss@4.3.3):
21714+ uniwind@1.11.0(patch_hash=17d92be2eec71bb6396b402e8d034968e54b28746876d7977cb3139655f42b90)(@expo/metro-config@57.0.12(patch_hash=96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2)(bufferutil@4.1.0)(expo@57.0.18)(typescript@7.0.2)(utf-8-validate@6.0.6))(metro-cache@0.84.5)(metro-transform-worker@0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))(metro@0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(tailwindcss@4.3.3):
2155821715 dependencies:
2155921716 '@tailwindcss/node': 4.3.3
2156021717 '@tailwindcss/oxide': 4.3.3
@@ -21566,7 +21723,7 @@ snapshots: · 5 unmodified lines
2156621723 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
2156721724 tailwindcss: 4.3.3
2156821725 optionalDependencies:
21569− '@expo/metro-config': 57.0.12(patch_hash=96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2)(bufferutil@4.1.0)(expo@57.0.18)(typescript@6.0.3)(utf-8-validate@6.0.6)
21726+ '@expo/metro-config': 57.0.12(patch_hash=96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2)(bufferutil@4.1.0)(expo@57.0.18)(typescript@7.0.2)(utf-8-validate@6.0.6)
2157021727 metro-transform-worker: 0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6)
2157121728
2157221729 unpipe@1.0.0: {}
@@ -21689,25 +21846,25 @@ snapshots: · 116 unmodified lines
2168921846 '@types/unist': 3.0.3
2169021847 vfile-message: 4.0.3
2169121848
21692− vite-plus@0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0):
21849+ vite-plus@0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0):
2169321850 dependencies:
2169421851 '@oxc-project/types': 0.146.0
2169521852 '@oxlint/plugins': 1.79.0
21696− '@vitest/browser': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(utf-8-validate@6.0.6)(vitest@4.1.11)
21697− '@vitest/browser-preview': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(utf-8-validate@6.0.6)(vitest@4.1.11)
21853+ '@vitest/browser': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@4.1.11)
21854+ '@vitest/browser-preview': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@4.1.11)
2169821855 '@vitest/expect': 4.1.11
21699− '@vitest/mocker': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))
21856+ '@vitest/mocker': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))
2170021857 '@vitest/pretty-format': 4.1.11
2170121858 '@vitest/runner': 4.1.11
2170221859 '@vitest/snapshot': 4.1.11
2170321860 '@vitest/spy': 4.1.11
2170421861 '@vitest/utils': 4.1.11
21705− '@voidzero-dev/vite-plus-core': 0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)
21706− oxfmt: 0.64.0(vite-plus@0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0))
21707− oxlint: 1.79.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0))
21862+ '@voidzero-dev/vite-plus-core': 0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)
21863+ oxfmt: 0.64.0(vite-plus@0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0))
21864+ oxlint: 1.79.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0))
2170821865 oxlint-tsgolint: 7.0.2001
21709− vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)'
21710− vitest: 4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))
21866+ vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)'
21867+ vitest: 4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))
2171121868 optionalDependencies:
2171221869 '@voidzero-dev/vite-plus-darwin-arm64': 0.3.0
2171321870 '@voidzero-dev/vite-plus-darwin-x64': 0.3.0
@@ -21751,10 +21908,10 @@ snapshots: · 37 unmodified lines
2175121908 optionalDependencies:
2175221909 vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)'
2175321910
21754− vitest@4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3)):
21911+ vitest@4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)):
2175521912 dependencies:
2175621913 '@vitest/expect': 4.1.11
21757− '@vitest/mocker': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))
21914+ '@vitest/mocker': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))
2175821915 '@vitest/pretty-format': 4.1.11
2175921916 '@vitest/runner': 4.1.11
2176021917 '@vitest/snapshot': 4.1.11
@@ -21771,11 +21928,11 @@ snapshots: · 10 unmodified lines
2177121928 tinyexec: 1.2.4
2177221929 tinyglobby: 0.2.17
2177321930 tinyrainbow: 3.1.0
21774− vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)'
21931+ vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)'
2177521932 why-is-node-running: 2.3.0
2177621933 optionalDependencies:
2177721934 '@types/node': 24.12.4
21778− '@vitest/browser-preview': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(utf-8-validate@6.0.6)(vitest@4.1.11)
21935+ '@vitest/browser-preview': 4.1.11(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@4.1.11)
2177921936 transitivePeerDependencies:
2178021937 - msw
2178121938
pnpm-workspace.yaml+4−3
@@ -37,7 +37,7 @@ catalog: · 36 unmodified lines
3737 "@effect/platform-node-shared": 4.0.0-beta.103
3838 "@effect/sql-pg": 4.0.0-beta.103
3939 "@effect/sql-sqlite-bun": 4.0.0-beta.103
40− "@effect/tsgo": 0.13.2
40+ "@effect/tsgo": 0.41.0
4141 "@effect/vitest": 4.0.0-beta.103
4242 "@legendapp/list": 3.3.5
4343 "@noble/curves": 1.9.1
@@ -47,12 +47,11 @@ catalog: · 3 unmodified lines
4747 "@tailwindcss/oxide": 4.3.3
4848 "@tailwindcss/vite": 4.3.3
4949 "@types/node": 24.12.4
50− "@typescript/native-preview": 7.0.0-dev.20260604.1
5150 effect: 4.0.0-beta.103
5251 jose: 6.2.2
5352 lightningcss: 1.33.0
5453 tailwindcss: 4.3.3
55− typescript: ~6.0.3
54+ typescript: 7.0.2
5655 vite: npm:@voidzero-dev/vite-plus-core@0.3.0
5756 vite-plus: 0.3.0
5857 yaml: ^2.9.0
@@ -94,6 +93,8 @@ minimumReleaseAgeExclude: · 35 unmodified lines
9493 - "@anthropic-ai/claude-agent-sdk@0.3.260"
9594
9695 overrides:
96+ # Earlier React Navigation declarations create a circular type alias in TypeScript 7.
97+ "@react-navigation/core": 7.21.13
9798 # The dbus-next patch drops usocket from the package, but pnpm resolves from the
9899 # registry manifest, so the edge has to be cut here as well.
99100 "dbus-next>usocket": "-"
scripts/clean-tsgo-backups.mjs+0−24
@@ -1,24 +0,0 @@
1−// Deletes stale tsgo backup files left behind by `effect-tsgo patch`.
2−//
3−// The patch command backs up the real tsgo binary to `tsgo.original`, and if
4−// that name is taken it writes `tsgo.original.1`, `.2`, ... without ever
5−// cleaning up. On runners that restore node_modules from a build cache
6−// (Vercel), backups accumulate across deploys until patch hard-fails at 101
7−// with "Too many backup files exist". Removing them is safe: from the second
8−// patch onward the backup is just the previously-patched binary, and pnpm
9−// restores the pristine one whenever the package is re-materialized.
10−//
11−// Runs as part of `prepare`, so it must only use node builtins.
12−import * as NodeFS from "node:fs";
13−
14−const backups = NodeFS.globSync(
15− "node_modules/.pnpm/@typescript+native-preview-*/node_modules/@typescript/native-preview-*/lib/tsgo{,.exe}.original*",
16−);
17−
18−for (const backup of backups) {
19− NodeFS.rmSync(backup, { force: true });
20−}
21−
22−if (backups.length > 0) {
23− console.log(`Removed ${backups.length} stale tsgo backup(s)`);
24−}
scripts/knip-schemas.ts+2−1
@@ -1,7 +1,8 @@
11 // @effect-diagnostics nodeBuiltinImport:off - Knip and the TypeScript compiler host use synchronous Node paths.
22 import * as NodePath from "node:path";
33 import type { Preprocessor } from "knip";
4−import ts from "typescript";
4+// Knip needs the legacy compiler API, which TypeScript 7 no longer exports.
5+import ts from "typescript-legacy";
56
67 // Effect 4 schemas carry this marker, including aliases and Schema.Class constructors.
78 // Checking the type avoids evaluating application modules or exempting schema factories/decoders.
scripts/package.json+2−1
@@ -3,7 +3,7 @@ · 2 unmodified lines
33 "private": true,
44 "type": "module",
55 "scripts": {
6− "typecheck": "tsgo --noEmit",
6+ "typecheck": "tsc --noEmit",
77 "test": "vp test run"
88 },
99 "dependencies": {
@@ -20,6 +20,7 @@ · 10 unmodified lines
2020 "@effect/vitest": "catalog:",
2121 "@types/pngjs": "6.0.5",
2222 "typescript": "catalog:",
23+ "typescript-legacy": "npm:typescript@~6.0.3",
2324 "vite-plus": "catalog:"
2425 }
2526 }